google几乎是不可能的,因此我的理解仅限于通过读取粘液源代码的上下文线索:也许它是普通lisp中对象系统的一部分?像'自我'这样的东西?
摘录:
(cond #+#.(swank-backend::sbcl-with-new-stepper-p)
也许这会让它变得更加可谷歌:pound plus pound // hash plus hash symbol // octothorp plus octothorp
答案 0 :(得分:20)
很难见到。
#+clim clim:+red+ #-clim mygraphics:+red+
上面的表示阅读器返回红色符号,这取决于功能列表*features*
中是否有名称为CLIM的符号。这是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
答案 1 :(得分:15)
答案 2 :(得分:4)
他们是Common Lisp reader macro characters:
由...引入的文本符号 发送一个或两个字符 定义要使用的专用语法 由Lisp读者,那就是 由读者宏实现 功能
读者宏不应与常规宏混淆 - 它们彼此无关。
set-dispatch-macro-character函数可用于使用自定义阅读器宏扩展Common Lisp语法。
答案 3 :(得分:0)
此外,#-foo(code to execute)
只有在*features*
中foo 时才会执行代码。
即使在Common Lisp HyperSpec中也很难找到有关#+
,#.
等的信息,但可以通过Google搜索“Sharpsign minus”等找到相关的HyperSpec页面。(谢谢奥斯汀。)
答案 4 :(得分:0)
2.4.8.17 Sharpsign Plus http://www.lispworks.com/documentation/HyperSpec/Body/02_dhq.htm #+测试表达式 Readtime宏,如果test为true,则读取表达式,否则将其作为空格读取。
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过于学术化,进入门槛太高(学习曲线和支持社区不是那么好......没有一万个小程序可以轻松地让你入门(在一些奥术中)您正在使用的实施))。