Поскольку вы знакомы с языком Алгол семьи (Python) Я могу сказать вам LISP семья имеет другой синтаксис:
fun(a, b, c)
написано так:
(fun a b c)
Таким образом, источник ваша ошибка заключается в том, что запятая и скобки интерпретируются на разных языках.
Какое сообщение об ошибке относится к? В семействе lisp вы можете иметь код как данные, добавляя символы, которые вместо букв кода. Таким образом, '(fun a b c)
становится (fun a b c)
в качестве структуры данных после оценки, так как у вас есть '
перед этим, и он работает, как если бы вы использовали code(a,b,c)
в python и окружили его котировками вроде 'code(a,b,c)'
. Python оценил бы это как строку, а не код правильно? Хорошо lisp языки делают то же самое с литеральными структурами данных. Есть еще 2 дополнительных. quasiquote
`
и unquote
,
. Знакомый, не так ли? Ну как ассимиляция нормальная quote
похожа на одинарные кавычки, где строка точно буквальна, а quasiquote
- это как двойные кавычки, а unquote - для интерполяции для кода, так что то, что остается в структуре, является результатом этих выражений. Вот пример:
`(a b ,(+ 3 4)))
; ==> (a b 7)
Сейчас в LISP языках читатель обычно преобразует это в время чтения, так что код, который получает интерпретированы никогда не увидеть '
`
, или ,
. стандартная схема не говорит, что он должен быть назван так это реализация определена, однако большинство языков используют эти:
''`(a b ,(+ 3 4))
; ==> (quote (quasiquote (a b (unquote (+ 3 4)))))
Только внешняя цитата оценивается так как в этом случае другие цитаты, которые вы видите в результате это данные и не является частью кода.Реализация свободна, чтобы показать короткую форму при представлении структуры данных таким образом, чтобы:
'(quote (unquote quote))
; ==> ',quote
; ==> (quote (unquote quote))
Это фактически то же самое значение, а то, как они показывают, что это изменение, если вы должны были принять car
этого было бы представить символ quote
, так как это действительно вторая структура, которая является реальной стоимостью.
В своем коде выражение (a, (- b 1))
читается как (a (unqote (- b 1)))
и после успешного вычитания функция unquote
должна быть применена, то функция a
должна быть применена к его результат. Ни один из них не будет работать, но поскольку аргументы должны быть оценены перед приложением, порядок будет установлен таким образом, что Scheme будет сначала жаловаться на unquote
, а затем a
, если вы удалите запятую.
Как вы закончили знакомство с алгол-иш-языками? –
@ScottHunter OP имеет два вопроса python и 'multiply (a, ...)' выглядит очень знакомым. – Sylwester
Спасибо, этот ответ был очень информативным. – skeletonsaurus