2010-04-29 21 views
9

Por el momento estoy trabajando con "Practical Common Lisp" de Peter Seibel.LISP: parámetros de palabras clave, suministrado-p

En el capítulo "Práctica: Una simple base de datos" (http://www.gigamonkeys.com/book/practical-a-simple-database.html) Seibel explica los parámetros de palabras clave y el uso de un parámetro suministrado con el siguiente ejemplo:

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

Resultados:

(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) 

Entonces, si uso la clave & al comienzo de mi lista de parámetros, tengo la posibilidad de usar una lista de 3 parámetros nombre, valor predeterminado y la tercera si el parámetro ha sido suministrado o no. De acuerdo. Pero mirar el código en el ejemplo anterior:

(list a b c c-p) 

¿Cómo sabe el intérprete Lisp que c-p es mi "parámetro suministrado"?

Respuesta

14

Vamos a resangrar la función foo :

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

Si sangría a ello como esto se verá que la función tiene tres parámetros de palabras clave: a, by c. Estos están disponibles en el cuerpo de la función.

Para el parámetro de palabra clave c hay una variable declarada c-p que será T o NIL dependiendo de si c se ha pasado cuando se llama a foo.

Un parámetro de palabra clave general puede ser declarado como una de las siguientes opciones:

  1. como un único nombre de la variable
  2. una lista de un nombre de variable y un valor predeterminado
  3. una lista de una variable nombre, un valor predeterminado y una variable que mostrará si el parámetro se ha pasado o no cuando se llama a la función

El suministro-p es particularmente interesante cuando uno quiere ver si el valor proviene de la llamada o el valor por defecto:

(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))) 

Ahora el usuario puede init los elementos a NIL:

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

Aquí el valor por defecto y el valor suministrado puede ser a la vez NIL, pero tenemos que hacer una diferencia. La variable init-value-supplied-p permite ver si el valor NIL de la variable init-value proviene del valor predeterminado o de la llamada de función.

5

Es difícil decir lo que está preguntando. c-p está vinculado a T o NIL, dependiendo de si se proporciona c como parámetro. Esta unión está entonces disponible para el cuerpo de la función.

+1

Aaah lo consiguió :-) c-p simplemente se agrega a la lista como a, byc y no es un "parámetro proporcionado" para "se ha establecido/desconectado una lista". Lleva cierto tiempo acostumbrarse a la sintaxis, aunque es realmente fácil. :-) ¡Gracias! – echox

Cuestiones relacionadas