Common lisp 公共口齿不清:什么是+;无
前几天(可能是昨天),我对在中找到的Common lisp 公共口齿不清:什么是+;无,common-lisp,Common Lisp,前几天(可能是昨天),我对在中找到的#+nil读取时间条件感到非常困惑 经过深思熟虑后,我得出结论,这是一种非常简洁的注释代码的方式。有人能证实这一点吗 也许我的假设是完全错误的。无论如何,请提前感谢。请参阅 为了对从输入中读取表达式进行条件化,Common Lisp使用该功能 在这种情况下,它被用来注释表单。 这是读者的一部分#+查看下一个项目(通常是同名的关键字符号)是否是列表*功能*的成员。如果是,则下一项将被正常读取,如果不是,则跳过。。通常:NIL不是该列表的成员,因此跳过该项。因此,
#+nil
读取时间条件感到非常困惑
经过深思熟虑后,我得出结论,这是一种非常简洁的注释代码的方式。有人能证实这一点吗
也许我的假设是完全错误的。无论如何,请提前感谢。请参阅
为了对从输入中读取表达式进行条件化,Common Lisp使用该功能
在这种情况下,它被用来注释表单。
这是读者的一部分#+
查看下一个项目(通常是同名的关键字符号)是否是列表*功能*
的成员。如果是,则下一项将被正常读取,如果不是,则跳过。。通常:NIL
不是该列表的成员,因此跳过该项。因此,它对Lisp隐藏了表达式。可能有一个Lisp实现,但这不起作用:NIL,Lisp的新实现。它可能在*features*
列表上有符号:NIL
,以指示实现的名称
默认情况下,在关键字
包中读取NIL
等功能:
->在#+NIL
cl:*功能*
->在#+CL:NIL
CL:*功能中查找
CL:NIL
(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? |#
,但您不应该在生产代码中遗漏这一点
更好的选择是#+(或)
它只需再输入一个字符,如果您使用Emacs paredit或自动插入右括号的其他模式,则需要按相同的键,并且不受符号
:nil
作为注释存在于*功能*
中的约束;它看起来像是SBCL
忽略#+nil…
表达式,即使nil
位于*功能*
中。如果在文件中写入,然后加载,以下内容将打印“Nope”:(push nil*features*)#+nil(格式t“nil在*features*”)#-nil(格式t“Nope”)
@Inaimathi,这是因为特征表达式被读取到关键字包中:NIL
将是*功能*
@m-n:Yup中的相关符号。将上面的第一个表达式替换为(push:nil*features*)…
打印nil在*features*
中。感谢链接。如果我早一点发现这个问题,我就不必发表我的问题了,但是#+nil
确实很难搜索。尽管(至少在我看来)更好的是#-(和)
,因为-
看起来更像是在评论某件事,而不是+
那样。我有时会使用#+\35;:如果我感到偏执,就忽略。