在Lisp中,#+#是什么意思?

21

这个问题几乎无法通过谷歌来解决,因此我的理解仅限于通过阅读Slime源代码中的上下文线索:它可能是Common Lisp中对象系统的一部分吗?类似于“self”吗?

代码片段:

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

也许这样更容易在谷歌上搜到: pound加上pound // hash加上hash符号 // octothorp加上octothorp


3
不错的Google搜索优化增加。人们应该总是这样做。 - Rafe Kettler
1
哇,从来不知道它被称为八角井号。 - Flash
1
“octothorpe”还是“octothorp”? :-) 谷歌似乎表明后者更为广泛使用。 - Miron Brezuleanu
看看SymbolHound,对于每个程序员来说都是一样的。在这些情况下非常有帮助。 - MasterMastic
1
不要忘记 #.。 :) - lindes
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

15

4

它们是Common Lisp的读取宏字符:

一种文本表示法,通过对一个或两个字符进行分派来定义特殊用途的语法,供Lisp读取器使用,并由读取宏函数实现。

读取宏不应与常规宏混淆 - 它们彼此没有关系。

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


0

此外,#-foo(要执行的代码)仅在*features*列表中不存在 foo时才会执行该代码。

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


0

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

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过于学术化,而且入门门槛太高(学习曲线和支持社区都不是很好……在你使用的某个奇怪实现中,没有10,000个小程序可以轻松帮助你入门)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接