Lisp S 表达式 (sexp) 要么是一个原子,要么是一个 sexps 列表。
1
所有的 Lisp 形式(即可以评估的东西)都是 sexps,但并非所有的 sexps 都是 Lisp 形式。
更具体地说,Lisp 形式是任何原子,或第一个元素是符号的列表。
(foo 42) ; valid Lisp form
(undefined 42) ; Lisp form, but invalid because of undefined function
(42 foo) ; not a Lisp form - numbers aren't symbols
2
正如我刚才提到的,list-that-is-a-Lisp-form 的“运算符”(第一个元素)必须是一个符号。(Lisp-1(例如 Scheme)允许在运算符位置使用任何 Lisp 形式,但Roots of Lisp讨论的是原始形式(Lisp-2)和 Common Lisp(Lisp-2);它们将运算符位置限制为符号.)
3
Lisp 代码在编译之前是 Lisp 数据。这很重要。
如果我说(car 'foo)
,程序会抱怨;没错,因为foo
它不是一个列表。
如果我说(car '(car 'foo))
,内部列表不被评估(良好的旧引号语法'
),并car
提取操作符位置的东西 - 在这种情况下,符号car
. 这在定义宏时很有用。
4
要看。
首先,假设我已经foo
定义为两个参数的函数,并且bar
定义为一个变量和一个参数的函数。还要记住,在后台,您的 Lisp 可能会调用eval
您输入的任何内容。
现在(eval '(foo bar 42))
是有效的,并且将foo
使用参数 <the value of bar
> 和42
. (eval (cdr '(foo bar 42)))
也是完全有效的;它等效于(eval '(bar 42))
,它bar
使用参数调用42
。
如果bar
未定义为函数,cdr
则第二个示例的 the 仍会生成有效的 Lisp 表单,但评估该表单将是错误的,因为(bar 42)
调用了该函数bar
(没有一个)。
谈论语法和语义很有用。从语法上讲,任何原子,或任何在运算符位置带有符号的列表都是有效的。在语义上(在语法范围内),任何作为没有变量定义的符号的原子都是错误的;任何第一个元素是没有函数定义的符号的列表也是如此。
我希望这个答案可以帮助你。