Вот синтаксис для условного выражения :
(cond
[ConditionExpression1 ResultExpression1]
[ConditionExpression2 ResultExpression2]
...
[ConditionExpressionN ResultExpressionN])
(cond
[ConditionExpression1 ResultExpression1]
[ConditionExpression2 ResultExpression2]
...
[else DefaultResultExpression])
Оценка условного выражения следует 2 правилам
1) правилу cond_false
(cond == (cond
[#false ...] ; first line removed
[condition2 answer2] [condition2 answer2]
...) ...)
2) правило cond_true
(cond == answer-1
[#true answer-1]
[condition2 answer2]
...)
Это второе правило также применяется, когда условие другое (но учтите, что еще может произойти только впоследнее предложение).
Пример :
(cond
[(= 2 0) #false]
[(> 2 1) (string=? "a" "a")]
[else (= (/ 1 2) 9)])
== {при оценке от (= 2 0)
до #false
}
(cond
[#false #false]
[(> 2 1) (string=? "a" "a")]
[else (= (/ 1 2) 9)])
== {по правилу cond_false }
(cond
[(> 2 1) (string=? "a" "a")]
[else (= (/ 1 2) 9)])
== {при оценке от (> 2 1)
до #true
}
(cond
[#true (string=? "a" "a")]
[else (= (/ 1 2) 9)])
=={по правилу cond_true }
(string=? "a" "a")
== {по оценке (string=? "a" "a")
до true
}
#true
(define (mymax x1 x2 x3)
(cond
((and (x1 > x2) (x1 > x3)) x1)
(else (and (x2 > x1) (x2 > x3)) x2)
(else (and (x3 > x1) (x3 > x2)) x3)
))
(print (mymax 10 5 1))
выражение типа (2 > 1)
не будет работать. Это должно быть (> 2 1)
. Синтаксис для приложения функции является синтаксисом префикса, то есть за открывающей скобкой должно следовать имя функции, за которым должны следовать аргументы.
ошибка, которую вы получаете из-за неправильного синтаксиса для второго предложения. (else (and (x2 > x1) (x2 > x3)) x2)
Этот пункт состоит из 3 частей: else
, (and (x2 > x1) (x2 > x3))
и x2
. Однако в соответствии с синтаксисом cond
предложение должно содержать только 2 элемента.
После избавления от else
s и создания префикса >
:
(define (mymax x1 x2 x3)
(cond
((and (> x1 x2) (> x1 x3)) x1)
((and (> x2 x1) (> x2 x3)) x2)
((and (> x3 x1) (> x3 x2)) x3)))
(print (mymax 10 5 1))
Программа печатает 10
. Но обратите внимание, что это не сработает для (mymax 5 5 5)
, поэтому мы превращаем все >
с в >=
с:
(define (mymax x1 x2 x3)
(cond
[(and (>= x1 x2) (>= x1 x3)) x1]
[(and (>= x2 x1) (>= x2 x3)) x2]
[(and (>= x3 x1) (>= x3 x2)) x3]))
(mymax 10 5 1)
; => 10
(mymax 5 5 5)
; => 5
Наконец, функции не «возвращают» значения. Лучшей мысленной моделью было бы думать, что их тело уменьшает до значения.
(define (f x-1 ... x-n)
f-body)
(f v-1 ... v-n)
; == f-body
; with all occurrences of x-1 ... x-n
; replaced with v-1 ... v-n, respectively
См .: Руководство по ракеткам , Справочник по ракеткам , HtDP .