2015-04-24 12 views

risposta

4

Vedi CLHS 2.4.8.17 Sharpsign Plus

Per condizionare le espressioni di lettura da ingresso, Common Lisp utilizza funzionalità expressions.

In questo caso è stato utilizzato per commentare un modulo.

È una parte del lettore. #+ controlla se l'elemento successivo, solitamente come simbolo di una parola chiave con lo stesso nome, è un membro dell'elenco *features*. Se sì, l'elemento successivo viene letto normalmente, in caso contrario, viene saltato .. Generalmente :NIL non è un membro di quell'elenco, quindi l'elemento viene saltato. Quindi nasconde l'espressione di Lisp. Potrebbe esserci stata un'implementazione Lisp, in cui ciò non avrebbe funzionato: NIL, Nuova implementazione di Lisp. Potrebbe avere il simbolo :NIL nell'elenco *features*, per indicare il nome dell'implementazione.

Caratteristiche come NIL sono di default di leggere nel pacchetto keyword:

  • #+NIL -> cerca i :NIL in cl:*features*
  • #+CL:NIL -> cerca i CL:NIL in cl:*features*

Esempio

(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 

Esso stampa:

BAR 
FOO 

Nota che Common Lisp ha altri modi per commentare forme:

; (sin 3) should we use that? 

#| (sin 3) should we use that? 
    (cos 3) or this?   |# 
+0

Come nota; sembra che 'SBCL' ignori le espressioni' # + nil ... 'anche quando' NIL' ** è ** in '* caratteristiche *'. Se scritto in un file, quindi caricato, le seguenti impronte "Nope": '(spinga nil * caratteristiche *) # + nil (formato t" NIL è in * caratteristiche * ") # -nil (formato t" Nope ")' . – Inaimathi

+1

@Inaimathi perché l'espressione della funzione viene letta nel pacchetto di parole chiave. ': NIL' sarebbe il simbolo pertinente in' * features * '. –

+0

@ m-n: sì. Sostituendo la prima espressione sopra con '(push: nil * features *) ...' prints 'NIL è in * features *'. – Inaimathi

4

Yes, it is a lispy way of commenting code, ma non si deve lasciare questo fuori nel codice di produzione.

Un'alternativa migliore è #+(or).

ci vuole solo un altro personaggio, ci vogliono gli stessi tasti premuti se si utilizza Emacs paredit o qualche altra modalità che inserisce automaticamente la parentesi di chiusura, e non è subordinata all'esistenza del simbolo :nil in *features*.

+0

Grazie per il link. Se l'avessi trovato prima non avrei dovuto pubblicare la mia domanda, ma '# + nil' è davvero difficile da cercare. –

+3

Ancora meglio, anche se (almeno a mio parere), è '# - (e)', perché il '# -' sembra più come commentare qualcosa che' # + 'fa. –

+3

A volte uso '# + #: ignora 'se mi sento paranoico. –