gpt4 book ai didi

escaping - ',(引号)在普通 lisp 中

转载 作者:行者123 更新时间:2023-12-03 23:27:40 26 4
gpt4 key购买 nike

',的作用和用途是什么?在 lisp 中的反引号表达式中?它有名字吗?它是否记录在某处?它有多普遍和有用?

例如:

(defmacro test-exp (exp)
`(format t "~&~S => ~S~%" ',exp ,exp))

我的猜测是在这里它会采取任何 exp字面意思是,在宏扩展时,替换 ',exp用它。 (与评估 exp 并用它替换 ,exp 相反)。

最佳答案

你猜对了。

引用

特殊运算符 quote 定义一个表达式,其计算结果为它的子形式,字面意思。例如:

(quote (looks like a function call))

内部形式看起来像一个函数调用,但对于 Lisp 读者来说,这只是一个符号列表。表达式 (quote ...)评估该列表,而不尝试将列表评估为代码。

引用表达式有特殊的语法,即引号字符,使得 'exp(quote exp) 相同.当您不想评估符号时,这通常是您编写符号的方式。

反引号/逗号

Quasiquotation 是一种只引用表达式的一部分的方法。

反引号的作用类似于引号:不评估其中的数据,除非它们以逗号为前缀,在这种情况下,评估会重新打开。
下面的表达式
`(format t "~s" ,exp)

……可以写成:
(list 'format 't '"~s" exp)

为了完整性,我在文字之前添加了引号,否则会自我评估,但在实践中,您将编写如下相同的列表:
(list 'format t "~s" exp)

这里 exp被评估,整个表单给出一个类似于对 format 的调用的列表。 , 其中 env被其值所取代。

引用逗号

您在示例中看到的引号/逗号组合是一个常见的习惯用法,您希望将在宏扩展时给出的参数(即代码)按字面意思放入正在扩展的代码中,而不对其进行评估。如果您通过宏扩展来测试您的宏,您可以看到结果代码:
(macroexpand '(test-exp (+ 5 8)))

=> (FORMAT T "~&~S => ~S~%" '(+ 5 8) (+ 5 8))

文字 (+ 5 8)表单放置在 (quote ...) 内形式,使其在运行时不被评估。同时,相同的表达式按原样放置在它旁边,从而在运行时对其进行评估。如果您评估结果表达式,它会打印:
 (+ 5 8) => 13

关于escaping - ',(引号)在普通 lisp 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60378335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com