前些日子(也許是昨天)我很困惑這#+nil
有條件的發現在https://github.com/billstclair/defperson/blob/master/defperson.lisp#L289。Common Lisp:什麼是#+零?
經過一番深入的思考後,我得出這樣的結論:註釋掉了代碼。有人能證實這一點嗎?
也許我的假設是完全錯誤的。無論如何,先謝謝你。
前些日子(也許是昨天)我很困惑這#+nil
有條件的發現在https://github.com/billstclair/defperson/blob/master/defperson.lisp#L289。Common Lisp:什麼是#+零?
經過一番深入的思考後,我得出這樣的結論:註釋掉了代碼。有人能證實這一點嗎?
也許我的假設是完全錯誤的。無論如何,先謝謝你。
要輸入條件化的閱讀表達,Common Lisp的使用功能expressions。
在這種情況下,它已被用於註釋表單。
這是讀者的一部分。 #+
看看下一個項目(通常是具有相同名稱的關鍵字符號)是列表*features*
的成員。如果是,那麼當時的下一個項目被正常讀取,如果不是,則跳過它。通常:NIL
不是該列表的成員,因此該項目被跳過。因此它隱藏了來自Lisp的表達式。可能有一個Lisp實現,在這裏不起作用:無,Lisp的新實現。它可能在*features*
列表上有符號:NIL
,以指示實施的名稱。
特點等NIL
是默認在keyword
包讀:
#+NIL
- >查找:NIL
在cl:*features*
#+CL:NIL
- >在cl:*features*
查找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? |#
Yes, it is a lispy way of commenting code,但你不應該在生產代碼中留下了這一點。
更好的選擇是#+(or)
。
只需要一個或多個字符,它採用相同的按鍵,如果你使用Emacs paredit或自動插入右括號一些其他的方式,它是不受符號:nil
的*features*
存在。
感謝您的鏈接。如果我之前發現了這個問題,我不會發布我的問題,但'#+ nil'真的很難搜索。 –
更好的是,雖然(至少在我看來)是'# - (和)',因爲'#-'似乎更像是評論某些東西而不是'#+'。 –
如果我感覺偏執,我有時會使用'#+#:忽略'。 –
作爲一個說明;它看起來像'SBCL'忽略'#+ nil ...'表達式,即使''features *'中的'NIL' **爲**'。如果寫入一個文件,然後加載,下面打印「Nope」:'(推零* features *)#+ nil(format t「NIL is in * features *」)#-nil(format t「Nope」)' 。 – Inaimathi
@Inaimathi這是因爲特徵表達式被讀入到關鍵字包中。 ':NIL'將是'* features *'中的相關符號。 –
@ m-n:是的。用'(push:nil * features *)替換上面的第一個表達式...''打印'NIL在* features *'中。 – Inaimathi