Common Lisp:#+ nil是什么?

时间:2015-04-24 14:21:14

标签: common-lisp

前几天(也许是昨天)我对https://github.com/billstclair/defperson/blob/master/defperson.lisp#L289中的#+nil阅读时间条件感到非常困惑。

经过一番深思熟虑后,我得出结论,这是评论代码的非常方式。有人能证实吗?

也许我的假设是完全错误的。无论如何,提前谢谢。

2 个答案:

答案 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}}。