Zobacz CLHS 2.4.8.17 Sharpsign Plus
Aby conditionalize wyrażeń odczyt z wejścia, Common Lisp używa funkcji expressions.
W tym przypadku został użyty do skomentowania formularza.
To część czytnika. #+
sprawdza, czy następny element, zwykle jako symbol słowa kluczowego o tej samej nazwie, jest członkiem listy *features*
. Jeśli tak, następny element jest odczytywany jako normalny, jeśli nie, to jest pomijany. Zwykle :NIL
nie jest członkiem tej listy, więc element jest pomijany. W ten sposób ukrywa wyrażenie od Lispa. Mogła istnieć implementacja Lisp, gdzie to by nie działało: NIL, Nowa implementacja Lisp. Mógł mieć symbol :NIL
na liście *features*
, aby wskazać nazwę implementacji.
Funkcje takie jak NIL
są domyślnie odczytywane w pakiecie keyword
:
#+NIL
-> poszukuje :NIL
w cl:*features*
#+CL:NIL
-> szuka CL:NIL
w cl:*features*
Przykład
(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
Drukuje:
BAR
FOO
Zauważ, że Common Lisp ma inne sposoby Wykomentuj formy:
; (sin 3) should we use that?
#| (sin 3) should we use that?
(cos 3) or this? |#
Jako notatkę; wygląda na to, że 'SBCL' ignoruje wyrażenia' # + nil ... 'nawet jeśli' NIL' ** jest ** w '* features *'. Jeśli zapisano w pliku, a następnie załadowano, następujące wydruki "Nope": '(push nil * features *) # + nil (format t" NIL jest w * features * ") # -nil (format t" Nope ")' . – Inaimathi
@Inaimathi, ponieważ wyrażenie funkcji jest odczytywane w pakiecie słów kluczowych. ': NIL' będzie odpowiednim symbolem w' * features * '. –
@ m-n: Tak. Zastępując pierwsze wyrażenie powyżej '(push: nil * features *) ...' wyświetla 'NIL jest w * funkcjach *'. – Inaimathi