Маленький интриган: `lat?` Без `cond`?
Один из первых вопросов во второй главе The Little Schemer (4-е издание) просит читателя написать функцию lat?
, где (lat? l)
возвращает true, если l
это список атомов.
Это говорит:
От вас еще не ожидали, что вы сможете это сделать, потому что вам все еще не хватает некоторых ингредиентов.
Но я знаком с рекурсией и определением atom?
ранее в книге уже ввели and
(далее подразумевает существование or
), так что я все равно попробовал: ( repl)
(define lat?
(lambda (l)
(or
(null? l)
(and
(atom? (car l))
(lat? (cdr l))))))
На следующей странице книга представляет cond
оператор, чтобы включить это определение lat?
:
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
Есть ли существенная разница между этими двумя реализациями?
1 ответ
cond
это особая форма, которая принимает (примерно) форму
(cond
((test-expression) (then-expression))
((test-expression2) (then-expression2))
(else
(then-expression3)))
Его семантика в том, что он будет оценивать test-expression
в порядке, и для первого, который он находит, чтобы оценить #t
(true
значение), то он будет оценивать его then-expression
и вернуть его значение. Если все test-expression
с оценкой #f
(false
значение) и else
пункт присутствует, тогда он будет оценивать его связанный then-expression3
в этом случае и вернуть его значение.
Таким образом, что касается семантики, две реализации эквивалентны. Их единственная разница может заключаться в том, что afaik cond
версия считается более идиоматичной в сообществе Scheme.