macros - 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 来说很特别
解决方案
'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)
我个人会在这种情况下引用它,以明确什么是文字和正在评估的内容,但这可能并不常见)。
推荐阅读
- amazon-web-services - AWS 角色切换(EMR、EC2、ECS)
- php - 如何在自动搜索中显示数据
- audio - FFMPEG 命令导致音频问题
- makefile - GNU Makefiles 中是否有类似 python 装饰器的机制?
- git - TFS 构建定义与同一项目的多个构建和 app.config 之间的变化
- reactjs - 在 github 上 React 应用部署失败
- python - 在双 y 图中拉伸图形大小
- asp.net-mvc - 当我在 MVC 中为用户分配超过 396 个角色时,登录失败
- java - 严重:servlet [jsp] 的 Servlet.service() 抛出异常 java.lang.NumberFormatException
- vue.js - Vuetify 中显示服务器端验证错误