Действительно, есть несколько мест, где пантезы в Лиспе выглядят как бы «неестественно». Обычно правила очень согласованы: скобка начинает список, а первый элемент списка - это функция, которая будет использоваться со всеми остальными элементами списка в качестве параметров. Эта согласованность также поддерживается для большинства макросов и специальных форм, и это делает код Lisp очень однородным ... однако в некоторых макросах и специальных операторах скобки имеют разное значение и используются для группировки ... например
(dolist (x L) (print x))
в этом случае, например, x
в первой панели НЕ является функцией, которую нужно вызвать с передачей L
в качестве аргумента. Другой пример
(let ((x 10)
(y 20))
(print (+ x y)))
В этом случае скобки используются только для группировки, и первый элемент (x 10)
явно не является функцией, которую нужно применить, и его первый элемент x
также не является функцией.
labels
работает точно так же, как let
, и очевидно "лишние" круглые скобки необходимы для группировки в случае, если определено более одной функции.
Хотя эти особые случаи действительно несколько раздражают, их очень мало, и после написания некоторого количества кода на Лиспе вы усвоите их, и вы просто поймете их правильно, не задумываясь.
Тем не менее это асимметрии, которые, например, затрудняют написание правильного обходчика кода, а также часто, когда вы делаете ошибку в этой «синтаксической области» Лиспа, к сожалению, сообщение об ошибке не очень помогает указать вам на ошибку.
Эта «сложность», конечно, ничто по сравнению с другими языками (и давайте не будем обсуждать, насколько ясны сообщения, когда вы делаете ошибку в шаблоне C ++ ;-)).
Я думаю, что это не совсем так, что синтаксис Лиспа «тривиален» или даже просто отсутствует. Синтаксис Лиспа присутствует, даже если не на уровне символов, а на уровне форм Лиспа, и он почти тривиален, за исключением нескольких специальных форм и макросов.
person
6502
schedule
08.05.2011
(2+3)*5
будет записано(* (+ 2 3) 5)
в lisp - person tobyodavies   schedule 08.05.2011