2016-06-15 2 views
2

Это вопрос для начинающих. Однако более 2 часов я пытаюсь выяснить ошибку (я также сделал поиск), но безуспешно.Схема: Объект() не применяется

(define a (lambda (l i) (
    (cond ((null? l) l) 
      (else (cons (cons (car l) i) (a (cdr l) i)))) 
))) 

Функция a должны пары атом i с каждым элементом из l. Например:

(a '(1 2 3) 4) должен вернуть ((1 4) (2 4) (3 4))

Однако, когда я пытаюсь использовать вызов функции я получаю:

The object() is not applicable 

Что ошибка в моей функции?

Я использую mit-scheme --load a.lisp для загрузки файла. Затем я вызываю функцию a, введя в интерактивном режиме.

+0

проверить [объект поиска в SO] (https://stackoverflow.com/search?q=The+object+%28%29+is+ не + применимое +% 5Bscheme% 5D + является% 3Aq). Он находит 26 вопросов (включая этот) с такой же точной формулировкой. –

ответ

4

Ошибка, как обычно бывает в языках lisp, зависит от неправильного использования скобок, в этом случае дополнительные круглые скобки, которые заключают в себе тело функции.

Удалите его и функция должна работать:

(define a (lambda (l i) 
      (cond ((null? l) l) 
        (else (cons (cons (car l) i) (a (cdr l) i)))))) 

Rember что в LISP скобках не способ ограждающих выражения, но являются важной частью синтаксиса: ((+ 2 3)) полностью отличается от (+ 2 3). Последнее выражение означает: суммируйте значения чисел 2 и 3 и верните результат. Первое означает: суммировать значения чисел 2 и 3, получить результат (число 5) и называть его как функцию с нулевыми параметрами. Это, очевидно, вызовет ошибку, поскольку 5 не является функцией ...

+0

спасибо! Я знаю это, но я бы никогда не заметил, что добавил эти дополнительные круглые скобки. Я был обеспокоен «l», возвращенным конд, и я был уверен, что все остальное было правильным. Еще раз спасибо – collimarco

+0

Добро пожаловать! – Renzo

+1

@collimarco Использование редактора, который позаботится об углублении, поможет вам обнаружить множество дисбалансов. –