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

Я попытался написать (простую, т.е. без 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) ?


person Andreas Grech    schedule 28.12.2009    source источник


Ответы (2)


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

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

(lambda (n) (= 1 n))

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

person mqp    schedule 28.12.2009
comment
+1 да, проблема была в том, что у меня была лишняя скобка; Спасибо за объяснение. - person Andreas Grech; 29.12.2009
comment
...о нет, я только что понял, что если бы я посмотрел на 5 см вниз по странице, прежде чем задавать вопрос, я бы увидел функцию one? без cond на той же странице книги; урок выучен. - person Andreas Grech; 29.12.2009
comment
Я сам только сейчас это увидел :) - person mqp; 29.12.2009

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

int
one(int n)
{     
    switch (foo) {
        default:
           return  1 == n;
    }
}
person Andrew    schedule 28.12.2009