这个问题几乎无法通过谷歌来解决,因此我的理解仅限于通过阅读Slime源代码中的上下文线索:它可能是Common Lisp中对象系统的一部分吗?类似于“self”吗?
代码片段:
(cond #+#.(swank-backend::sbcl-with-new-stepper-p)
也许这样更容易在谷歌上搜到: pound加上pound // hash加上hash符号 // octothorp加上octothorp
这个问题几乎无法通过谷歌来解决,因此我的理解仅限于通过阅读Slime源代码中的上下文线索:它可能是Common Lisp中对象系统的一部分吗?类似于“self”吗?
代码片段:
(cond #+#.(swank-backend::sbcl-with-new-stepper-p)
也许这样更容易在谷歌上搜到: pound加上pound // hash加上hash符号 // octothorp加上octothorp
#+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
它们是Common Lisp的读取宏字符:
一种文本表示法,通过对一个或两个字符进行分派来定义特殊用途的语法,供Lisp读取器使用,并由读取宏函数实现。
读取宏不应与常规宏混淆 - 它们彼此没有关系。
set-dispatch-macro-character函数可用于使用自定义读取宏扩展Common Lisp语法。
此外,#-foo(要执行的代码)
仅在*features*
列表中不存在 foo时才会执行该代码。
有关#+
、#.
等信息即使在Common Lisp HyperSpec中也很难找到,但可以通过谷歌搜索“Sharpsign minus”等来找到相关HyperSpec页面。(感谢奥斯汀。)
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个小程序可以轻松帮助你入门)。
#
和.
。 :) - lindes