2015-04-24 18 views

Odpowiedz

4

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?   |# 
+0

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

+1

@Inaimathi, ponieważ wyrażenie funkcji jest odczytywane w pakiecie słów kluczowych. ': NIL' będzie odpowiednim symbolem w' * features * '. –

+0

@ m-n: Tak. Zastępując pierwsze wyrażenie powyżej '(push: nil * features *) ...' wyświetla 'NIL jest w * funkcjach *'. – Inaimathi

4

Yes, it is a lispy way of commenting code, ale nie powinno się pozostawić to w kodzie produkcji.

Lepszą alternatywą jest #+(or).

Potrwa to tylko o jeden znak, powoduje to te same naciśnięcia przycisków, jeśli używasz Emacs paredit lub innego trybu, który automatycznie wstawia nawias zamykający, i nie podlega on istnieniu symbolu :nil w *features*.

+0

Dzięki za link. Gdybym znalazł to wcześniej, nie musiałbym pisać mojego pytania, ale "# + zero" jest naprawdę trudne do wyszukania. –

+3

Jeszcze lepiej, chociaż (przynajmniej moim zdaniem), jest '# - (i)', ponieważ '# -' wydaje się bardziej jak komentowanie czegoś niż' # + '. –

+3

Czasami używam '# + #: ignore', jeśli czuję się paranoidalny. –