lisp - должно быть лямбда-выражение

Я пытаюсь вернуть (значения str ((+ x 3) y)) из функции, в которой он находится.

фрагмент кода:

(if (<my condition>)
    (values str ((+ x 3) y))
    (values str ((+ x 2) y)))

дает ошибку:

(+ X 3) SHOULD BE A LAMBDA EXPRESSION 

но (values str (y (+ x 3))) работает нормально.

Зачем?


person b15    schedule 04.03.2014    source источник
comment
Можете ли вы добавить немного больше контекста? Каковы значения x и y здесь? Похоже, y действует как функция.   -  person munk    schedule 04.03.2014
comment
Можете ли вы объяснить, что ((+ x 3) y) делает или должен делать?   -  person Rainer Joswig    schedule 04.03.2014
comment
возможно, (y (+ x 3)) должно быть буквальным '(y (+ x 3)) или, возможно, отсутствует оператор (* y (+ x 3))? Возможно, вы определили функцию y?   -  person Sylwester    schedule 06.03.2014


Ответы (1)


S-выражение ((+ x 3) y) не может быть вычислено, потому что первый элемент списка не является функционально вызываемым (оно должно называть функцию или быть лямбда-выражением).

Итак, чтобы избежать оценки, вам нужно процитировать его:

(if (<my condition>)
    (values str '((+ x 3) y))
    (values str '((+ x 2) y)))

Затем вы вернете список длины 2 (содержащий список длины 3 и символ y) в качестве второго значения. Однако если вы хотите вернуть значения (+ x 2) и y в списке, вам нужно будет сделать что-то вроде

(values str (list (+ x (if <condition> 3 2)) y))

или, возможно, вернуть 3 значения вместо 2:

(values str
        (+ x (if <condition> 3 2))
        y)

С другой стороны, y — это символ, который, по-видимому, называет функцию в вашем образе, поэтому (y (+ x 3)) оценивается нормально (он вызывает функцию y в результате добавления 3 к x).

person sds    schedule 04.03.2014