2015-04-24 100 views

回答

4

CLHS 2.4.8.17 Sharpsign Plus

要輸入條件化的閱讀表達,Common Lisp的使用功能expressions

在這種情況下,它已被用於註釋表單。

這是讀者的一部分。 #+看看下一個項目(通常是具有相同名稱的關鍵字符號)是列表*features*的成員。如果是,那麼當時的下一個項目被正常讀取,如果不是,則跳過它。通常:NIL不是該列表的成員,因此該項目被跳過。因此它隱藏了來自Lisp的表達式。可能有一個Lisp實現,在這裏不起作用:,Lisp的新實現。它可能在*features*列表上有符號:NIL,以指示實施的名稱。

特點等NIL是默認在keyword包讀:

  • #+NIL - >查找:NILcl:*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?   |# 
+0

作爲一個說明;它看起來像'SBCL'忽略'#+ nil ...'表達式,即使''features *'中的'NIL' **爲**'。如果寫入一個文件,然後加載,下面打印「Nope」:'(推零* features *)#+ nil(format t「NIL is in * features *」)#-nil(format t「Nope」)' 。 – Inaimathi

+1

@Inaimathi這是因爲特徵表達式被讀入到關鍵字包中。 ':NIL'將是'* features *'中的相關符號。 –

+0

@ m-n:是的。用'(push:nil * features *)替換上面的第一個表達式...''打印'NIL在* features *'中。 – Inaimathi

4

Yes, it is a lispy way of commenting code,但你不應該在生產代碼中留下了這一點。

更好的選擇是#+(or)

只需要一個或多個字符,它採用相同的按鍵,如果你使用Emacs paredit或自動插入右括號一些其他的方式,它是不受符號:nil*features*存在。

+0

感謝您的鏈接。如果我之前發現了這個問題,我不會發布我的問題,但'#+ nil'真的很難搜索。 –

+3

更好的是,雖然(至少在我看來)是'# - (和)',因爲'#-'似乎更像是評論某些東西而不是'#+'。 –

+3

如果我感覺偏執,我有時會使用'#+#:忽略'。 –