Lisp - "list 'if x y nil" 此处勾号 (') 和 "list" 函数的用法是什么?

Lisp - "list 'if x y nil" what is usage of the tick (') symbol and "list" function here?

我正在学习编程语言原理class,其中教授谈论使用 Lisp(Precisly,Elisp)的宏。但是,他没有教我们如何写这种语言。因此,我正在努力学习自己。

但是,对于 Lisp 中“tick”(') 的使用,我有一些无法理解的地方。但是,我确实了解基本用法。例如,如果我们有 (cdr '(a b c)),它将给我们一个列表 (b c)。如果没有勾号,(a b c) 将被计算为一个函数。

在我教授写的代码中,我注意到一个奇怪的“勾号”符号的使用,我无法真正理解其用法:

; not sure why there is a "'" in front of if and it is being added to a list ??
(defmacro myand(x y) (list 'if x y nil))  

; Another example. Tick symbol before "greater than" symbol ? and made into a list?
(list 'if (list '> x y))

列表和刻度符号的使用对我来说真的没有意义。谁能解释这里发生了什么?我想这对 Lisp

来说是特别的

'tick symbol' 是 ''<x>(quote <x>) 对任何 <x> 的语法糖。 (quote <x>) 对于任何对象 <x>.

只是 <x>

quote 在 Lisp 中是必需的,因为 Lisp 中的程序经常想推理那些作为 Lisp 程序的一部分有意义的东西,并且需要说“这不是这个程序的一部分:它是数据” '.因此,例如,如果我有一个

形式的列表

((a . 1) (b . 2) ... (x . 26)) 我想在其中查找一个符号,我可能会写一个这样的函数:

(defun ass (key alist)
  (if (null? alist)
      '()
    (if (eql (car (car alist)) key)
        (car alist)
      (ass key (cdr alist)))))

然后当我要查找时,说x,我必须说(ass (quote x) ...),因为如果我说(ass x ...),那么x将被视为变量,我不想要那个:我想要符号 x.

在您的示例中,您正在查看编写 Lisp 程序(换句话说是宏)的程序,并且这些程序需要花费大量时间来处理将成为 Lisp 源代码的数据。所以在你的 myand 宏中,你想要的是

(myand x y)

应该改写为

(if x y nil)

这是一回事。因此,要构造它,您需要一个包含四个元素的列表:符号 if、两个变量和符号 nil。那么你可以用 list:

列出一个列表
(list 'if x y 'nil)

除了事实证明符号 nil 的值只是它本身(nil 实际上在许多 Lisp 中相当特殊),所以你不必费心引用它:(list 'if x y nil)(在这种情况下,我个人会引用它,以明确什么是字面意思和正在评估什么,但这可能并不常见)。