2016-05-05 4 views
2

У меня есть функция, которая в основном идетКак написать схему конд так она возвращает значение вложенного конд

(cond 
    (
    (cond) 
    (cond) 
    ) 
) 

На схеме момент кажется, как иностранный язык для меня. Мой вопрос прост. Как получить первый cond для возврата true, только если вложенные также вернули true. Из того, что я собрал, вложенный (cond) (cond) рассматривается как тест для первого справа? Все, что я получаю, не возвращается для возвращения.

ответ

3

Как это:

(cond ((cond ((= 1 2) #f) 
      ((= 2 3) #f) 
      (else #f)) 
     #t) 
     ((cond ((= 3 4) #f) 
      ((= 4 5) #f) 
      (else #t)) ; this is the only #t condition 
     #t))    ; hence this #t value is returned 

В приведенном выше примере, только последний else во второй внутренних cond возвращает значение ИСТИНА, который в свою очередь возвращает значение ИСТИНА в состоянии крайнего cond.

Но на самом деле, зачем вы хотите так поступать? если у вас несколько условий, просто используйте разные ветви одного cond. Может быть, вы не понимаете, как это должно быть использовано? думайте об этом как о серии заявлений if-else if-else if-else на других языках программирования.

2

Нет причин для этого. Представьте себе, этот пример:

(cond ((cond ((< x 10) #t) 
      ((> x 20) #t) 
      (else #f)) 
     #t) 
     ((cond ((< y 10) #t) 
      ((> y 20) #t) 
      (else #f)) 
     #t)) 

Это может быть легко flattended к одной cond:

(cond ((< x 10) #t) 
     ((> x 20) #t) 
     ((< y 10) #t) 
     ((> y 20) #t) 
     (else #f)) 

Вы можете использовать or занять первое истинное значение. Это работает для всех истинных ценностей, а не только #t (Все не #f считается истинным)

(or (cond ((< x 10) 'small-x) 
      ((> x 20) 'big-x) 
      (else #f)) 
    (cond ((< y 10) 'small-y) 
      ((> y 20) 'big-y) 
      (else #f))) 

Даже если вы можете использовать cond для каждого условного его, вероятно, целесообразно использовать только там, где есть либо побочные эффекты, связанные или там являются более чем одним предикатом (например, elseif на языках Алгола) и используют if как условный для одного предиката. Например. Вы можете написать один из суб- cond с выше этого:

(cond ((>= 20 x 10) #f) 
     (else #t)) 

Теперь я автоматически изменился с cond до if, поскольку это уже не nessecary для cond:

(if (>= 20 x 10) 
    #f 
    #t) 

Может быть, плохо пример, так как весь if можно написать (not (>= 20 x 10)).

Смежные вопросы