首页 > 解决方案 > Lisp - “list 'if xy nil” 勾号(')符号和“list”函数在这里的用法是什么?

问题描述

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

但是,关于在 Lisp 中使用“tick”('),我有些不明白。但是,我确实了解基本用途。例如,如果我们有(cdr '(a b c))它会给我们一个 list (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 来说很特别

标签: macroslispelispelisp-macro

解决方案


'tick symbol' 是':'<x>(quote <x>)any的语法糖<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 ...)thenx将被视为变量,我不希望这样:我想要符号x

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

(myand x y)

应该改写为

(if x y nil)

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

(list 'if x y 'nil)

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


推荐阅读