Маленький интриган: `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.

Другие вопросы по тегам