前几天(也许是昨天)我对https://github.com/billstclair/defperson/blob/master/defperson.lisp#L289中的#+nil
阅读时间条件感到非常困惑。
经过一番深思熟虑后,我得出结论,这是评论代码的非常方式。有人能证实吗?
也许我的假设是完全错误的。无论如何,提前谢谢。
答案 0 :(得分:4)
请参阅CLHS 2.4.8.17 Sharpsign Plus
要从输入中条件化读取表达式,Common Lisp使用特征expressions。
在这种情况下,它已用于注释表单。
它是读者的一部分。 #+
查看下一个项目(通常是具有相同名称的关键字符号)是否为列表*features*
的成员。如果是,那么下一个项目将被正常读取,如果没有,则跳过它。通常:NIL
不是该列表的成员,因此跳过该项目。因此它隐藏了Lisp的表达式。可能有一个Lisp实现,这不起作用: NIL , Lisp的新实现。它可能在:NIL
列表上有符号*features*
,以指示实现的名称。
默认情况下会在NIL
包中找到keyword
等功能:
#+NIL
- >在:NIL
cl:*features*
#+CL:NIL
- >在CL:NIL
cl:*features*
示例强>
(let ((string1 "#+nil foo bar")) ; string to read from
(print (read-from-string string1)) ; read from the string
(let ((*features* (cons :nil *features*))) ; add :NIL to *features*
(print (read-from-string string1))) ; read from the string
(values)) ; return no values
打印:
BAR
FOO
请注意,Common Lisp有其他方式来注释表单:
; (sin 3) should we use that?
#| (sin 3) should we use that?
(cos 3) or this? |#
答案 1 :(得分:4)
Yes, it is a lispy way of commenting code,但你不应该把它留在生产代码中。
更好的选择是#+(or)
。
它只需要一个字符,如果你使用Emacs paredit或其他一些自动插入右括号的模式,它需要相同的按键,并且它不受:nil
中{}的存在的影响*features*
1}}。