看起来你正在掌握 Lisp 的求值语义,所以继续玩吧!
您可以将其quote
视为抑制对其论点的评估。这允许您编写可以操作或传递的表达式。它还用于编写不应作为函数调用评估的数据结构。
数据结构:
'(1 2 3) ; => '(1 2 3)
(1 2 3) ; => Lisp error: (invalid-function 1)
;; The Lisp reader sees the number 1 in the function position and tries to call it, signalling an error.
语法转换:
(setq x '(string-to-int "123"))
(setf (car x) 'string-to-list)
x ; => '(string-to-list "123")
延迟评估:
(setq x '(message "Hello World")) ; => '(message "Hello World")
(eval x) ; => "Hello World"
有一个密切相关的特殊运算符,称为语法引号,使用反引号编写。它允许您使用逗号 ( , ) 运算符评估带引号的表达式中的单个表单。这就像quote
一个逃生舱口。
`(1 2 (+ 3 4)) ; => '(1 2 (+ 3 4))
`(1 2 ,(+ 3 4)) ; => '(1 2 7) ;; Note the comma!
语法引用还允许使用以下语法进行列表拼接,@
:
`(1 2 ,@(+ 3 4)) ; => '(1 2 + 3 4)
如您所见,它将后续表达式拼接到包含的表达式中。在您开始编写宏之前,您可能不会经常看到它。
list
另一方面是一个简单的功能。它评估其参数,然后返回包含这些项目的新数据结构。
(list 1 2 (+ 3 4)) ; => '(1 2 7)