2010-04-29 16 views
9

Al momento sto lavorando a "Practical Common Lisp" di Peter Seibel.LISP: Parametri parola chiave, fornito-p

Nel capitolo "Pratico: un semplice database" (http://www.gigamonkeys.com/book/practical-a-simple-database.html) Seibel spiega i parametri di parole chiave e l'utilizzo di un parametro fornito con il seguente esempio:

(defun foo (&key a (b 20) (c 30 c-p)) (list a b c c-p)) 

Risultati:

(foo :a 1 :b 2 :c 3) ==> (1 2 3 T) 
(foo :c 3 :b 2 :a 1) ==> (1 2 3 T) 
(foo :a 1 :c 3)  ==> (1 20 3 T) 
(foo)     ==> (NIL 20 30 NIL) 

Quindi, se uso la chiave & all'inizio del mio elenco di parametri, ho la possibilità di utilizzare un elenco di 3 nomi di parametri, il valore predefinito e il terzo se il parametro è stato fornito o meno. Ok. Ma guardando il codice nell'esempio di cui sopra:

(list a b c c-p) 

Come si fa l'interprete Lisp sanno che c-p è il mio "parametro fornito"?

risposta

14

Diamo reindent la funzione foo :

(defun foo (&key a 
       (b 20) 
       (c 30 c-p)) 
    (list a b c c-p)) 

Se si rientra in questo modo si vedrà che la funzione ha tre parametri di parole chiave: a, b e c. Questi sono disponibili nel corpo della funzione.

Per il parametro parola chiave c v'è una variabile dichiarata c-p che sarà T o NIL seconda che c è stato passato quando viene chiamato foo.

Un parametro chiave in genere può essere dichiarato come una delle seguenti opzioni:

  1. come un unico nome di variabile
  2. un elenco di un nome di variabile e un valore predefinito
  3. un elenco di una variabile nome, un valore predefinito e una variabile che mostra se il parametro è stato passato o meno quando la funzione viene chiamata

Il p fornito è particolarmente interessante quando uno vuole vedere se il valore proviene dalla chiamata o il valore di default:

(defun make-my-array (size &key (init-value nil init-value-supplied-p)) 
    (if init-value-supplied-p 
     (make-array size :initial-element init-value) 
     (make-array size))) 

Ora l'utente può init gli elementi per NIL:

(make-my-array 10 :init-value nil) 

Qui il valore di default e il valore fornito possono essere entrambi NIL, ma dobbiamo fare la differenza. La variabile init-value-supplied-p consente di verificare se il valore NIL della variabile valore iniziale proviene dall'impostazione predefinita o dalla chiamata di funzione.

5

È difficile dire cosa stai chiedendo. c-p è associato a T o NIL, a seconda che sia fornito come parametro c. Questo legame è quindi disponibile per il corpo della funzione.

+1

Aaah capito :-) c-p viene semplicemente aggiunto alla lista come a, b e c e non è un "parametro fornito" per "una lista è stata impostata/non impostata". Ci vuole un po 'di tempo per abituarsi alla sintassi, anche se è davvero facile. :-) Grazie! – echox