什么#+#。在lisp意味着什么?

时间:2011-04-26 03:59:07

标签: lisp common-lisp slime swank

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

摘录:

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

也许这会让它变得更加可谷歌:pound plus pound // hash plus hash symbol // octothorp plus octothorp

5 个答案:

答案 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)

实际上Sharpsign Plus后跟Sharpsign Dot

答案 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过于学术化,进入门槛太高(学习曲线和支持社区不是那么好......没有一万个小程序可以轻松地让你入门(在一些奥术中)您正在使用的实施))。