【问题标题】:Lisp - "list 'if x y nil" what is usage of the tick (') symbol and "list" function here?Lisp - “list 'if x y nil” 勾号(')符号和“list”函数在这里的用法是什么?
【发布时间】:2021-05-09 18:22:32
【问题描述】:

我正在上一门编程语言原理课,教授谈论使用 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 来说很特别

【问题讨论】:

标签: macros lisp elisp elisp-macro


【解决方案1】:

“刻度符号”是''<x> 是任何<x>(quote <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 实际上在许多 Lisps 中相当特殊),所以你不能费心引用:(list 'if x y nil)(我个人会在这种情况下引用它,以明确什么是字面意思以及正在评估什么,但这可能并不常见)。

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2016-03-28
    • 2011-12-18
    相关资源
    最近更新 更多