Схема: почему здесь нужно использовать cond?

Я пытался написать (простой, т.е. без eqan?) one? функционировать так:

(define one?
  (lambda (n)
    ((= 1 n))))

Но вышеупомянутое не работает, хотя, потому что, когда я называю это так:

(one? 1)

Меня приветствуют с этой ошибкой:

procedure application: expected procedure, given: #t (no arguments)

Правильный способ (от Маленького Схемера) написать это:

(define one?
  (lambda (n)
    (cond
      (else (= 1 n)))))

Почему необходимо использовать cond с else пункт, а не просто возвращение (= 1 n)?

2 ответа

Решение

Нет никаких причин, почему вы хотели бы сделать это. Когда я вернусь домой, я проверю свою копию TLS, чтобы узнать, смогу ли я предугадать, что происходит, но вы не пропустите ничего фундаментального cond или что-нибудь.

Ответ на ваше примечание выше: это не работает, потому что у вас есть дополнительный набор скобок в теле лямбды. Так должно быть

(lambda (n) (= 1 n))

Дополнительные скобки в вашей версии означают, что вместо возврата значения #t или же #fвы пытаетесь вызвать это значение как функцию без аргументов.

Не имея под рукой "Маленького интрижка", ваш пример выглядит так, как будто он должен работать. я думаю cond посторонний. В псевдо-C эквивалент (с cond):

int
one(int n)
{     
    switch (foo) {
        default:
           return  1 == n;
    }
}
Другие вопросы по тегам