博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lisp 里的 ,@ 反引号 的解释
阅读量:2497 次
发布时间:2019-05-11

本文共 1270 字,大约阅读时间需要 4 分钟。

刚接触lisp 的童鞋,看到宏代码的时候,基本都会遇到这个问题哈。
【,@】  【】 中间包括的那俩个符号代表啥意思? 会郁闷很久的。
解释在这里:

反引号 (Backquote)

反引号读取宏 (read-macro)使得从模版 (templates)建构列表变得有可能。反引号广泛使用在宏定义中。一个平常的引用是键盘上的右引号 (apostrophe),然而一个反引号是一个左引号。(译注: open quote 左引号,closed quote 右引号)。它称作“反引号”是因为它看起来像是反过来的引号 (titled backwards)。

(译注: 反引号是键盘左上方数字 1 左边那个: ` ,而引号是 enter 左边那个 ')

一个反引号单独使用时,等於普通的引号:

> `(a b c)(A B C)

和普通引号一样,单一个反引号保护其参数被求值。

反引号的优点是,在一个反引号表达式里,你可以使用 , (逗号)与 ,@ (comma-at)来重启求值。如果你在反引号表达式里,在某个东西前面加逗号,则它会被求值。所以我们可以使用反引号与逗号来建构列表模版:

> (setf a 1 b 2)2> `(a is ,a and b is ,b)(A IS 1 AND B IS 2)

通过使用反引号取代调用 list ,我们可以写出宏会产生出的展开式的宏定义。举例来说 nil! 可以定义为:

(defmacro nil! (x)  `(setf ,x nil))

Comma-at 与逗号相似,但将其(本来应该是列表的)参数扒开。将列表的元素插入模版来取代列表。

> (setf lst '(a b c))(A B C)> `(lst is ,lst)(LST IS (A B C))> `(its elements are ,@lst)(ITS ELEMENTS ARE A B C)

Comma-at 在宏里很有用,举例来说,在用剩馀参数 (rest parameters)表示代码主体的宏。假设我们想要一个 while 宏,只要初始测试表达式为真,对其主体求值:

> (let ((x 0))    (while (< x 10)       (princ x)       (incf x)))0123456789NIL

我们可以通过使用一个剩馀参数 (rest parameter) ,搜集主体的表达式列表,来定义一个这样的宏,接着使用 comma-at 来扒开这个列表放至展开式里:

(defmacro while (test &rest body)  `(do ()       ((not ,test))     ,@body))

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-741742/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133735/viewspace-741742/

你可能感兴趣的文章
IDEA关于重命名
查看>>
Es6 中let var和 const 了解
查看>>
巧用队列之”Voting“
查看>>
Oracle数据类型number(m,n)
查看>>
ACC 001 C - Shorten Diameter 图论
查看>>
开通博客了...
查看>>
[转]复制虚拟机后linux中的eth0变成eth1问题
查看>>
TableViewCell中自定义XIB的使用
查看>>
ubuntu 显示隐藏文件
查看>>
Linux 定时任务crontab
查看>>
mongoose联表查询与一般查询合并
查看>>
jQuery--内容过滤和可见性过滤
查看>>
Android手机总是提示:存储空间不足,解决方法
查看>>
MySQL 函数之求取一个表中的某个字段的中位数
查看>>
EntityFramework 更新数据库字段的三种方法
查看>>
hdu 1253 胜利大逃亡
查看>>
python异步编程之asyncio
查看>>
leetcode算法:Trim a Binar Search Tree
查看>>
Centos 编译安装bind错误
查看>>
C#多线程学习(一) 多线程的相关概念
查看>>