微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Lisp - "list 'if x y nil" 这里的勾号 (') 符号和 "list" 函数的用法是什么?

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

然而,关于 Lisp 中“tick”(') 的使用,我有些不明白。但是,我确实了解基本用法。例如,如果我们有 (cdr '(a b c)),它会给我们一个列表 (b c)。如果没有刻度符号,(a b c) 将作为函数求值。

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

; 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 来说很特别

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。