21

谷歌几乎是不可能的,因此我的理解仅限于阅读粘液源代码的上下文线索:也许它是普通 lisp 中对象系统的一部分?像“自我”这样的东西?

片段:

(cond #+#.(swank-backend::sbcl-with-new-stepper-p)

也许这会让它更容易被谷歌搜索:磅加磅//哈希加哈希符号//octothorp plus octothorp

4

5 回答 5

19

这是相当罕见的。

#+clim clim:+red+ #-clim mygraphics:+red+

上面的意思是读者返回红色符号,这取决于特征列表中是否有名称为 CLIM 的符号*features*。这是 Common Lisp 中的内置机制。

#.(cl:if (cl:zerop (cl:random 2)) :high :low)

以上也是阅读器的一种机制。它允许在读取时进行计算。顺便说一句。是一个安全问题,在 Lisp 应用程序中它应该被禁用 - 请参阅*read-eval*用于控制它的变量。在阅读时,使用 READ 的阅读器将随机返回 :HIGH 或 :LOW。

该组合#+#.(FOO) BAR意味着函数 foo 在读取时返回一个符号,然后读取器检查该符号是否在特征列表中存在具有此名称的符号,*features*如果是这种情况,则读取输入中的下一项,否则将跳过下一项。

简单的例子,在这个例子中 IF 总是返回 :CAPI :

在 LispWorks 中(CAPI 在功能列表中):

CL-USER 41 > (read-from-string "#+#.(cl:if cl:t :capi :clim) a b")
A
31

在 SBCL

* (read-from-string "#+#.(cl:if cl:t :capi :clim) a b")

B
32
于 2011-04-26T06:27:09.120 回答
15

它实际上是Sharpsign Plus后跟Sharpsign Dot

于 2011-04-26T04:17:56.613 回答
4

它们是 Common Lisp阅读器宏字符

由分派引入的一个或两个字符的文本符号,它定义了供 Lisp 阅读器使用的特殊用途语法,并由阅读器宏函数实现。

阅读器宏不应与常规宏混淆- 它们彼此无关。

set-dispatch-macro-character函数可用于使用自定义阅读器宏扩展 Common Lisp 语法。

于 2011-04-26T06:52:53.327 回答
0

2.4.8.17 Sharpsign Plus http://www.lispworks.com/documentation/HyperSpec/Body/02_dhq.htm #+test 表达式 Readtime 宏,如果 test 为真读表达式,否则读为空格。

2.4.8.6 Sharpsign Dot http://www.lispworks.com/documentation/HyperSpec/Body/02_dhf.htm #。foo 语法对 foo 执行读取时评估。

http://www.lispworks.com/documentation/HyperSpec/Body/02_dh.htm 所有#X 操作符(由 Lisp HyperSpec 定义)

为什么 Lisp HyperSpec 必须如此难以阅读?可能是因为它是由委员会完成的。我说这是 Lisp 不受欢迎的原因之一。此外,Lisp 过于学术,进入门槛太高(学习曲线和支持社区不是那么好......没有一万个小程序可以让你轻松入门(在一些神秘的您正在使用的实现))。

于 2013-04-25T15:19:25.560 回答
0

此外,仅当 foo不在#-foo(code to execute)才会执行代码。*features*

即使在Common Lisp HyperSpec中也很难找到有关 、 等的#+信息,但可以通过谷歌搜索“Sharpsign minus”等找到相关的 HyperSpec 页面(感谢 Austin。)#.

于 2013-01-01T06:57:44.617 回答