2011-09-15 7 views
5

me gustaría hacer algo parecido a esto:¿Cómo puedo hacer que el constructor de una estructura se evalúe secuencialmente en Common Lisp?

(defstruct person 
    real-name 
    (fake-name real-name)) ;if fake-name not supplied, default to real-name 

Sin embargo, Common Lisp dice The variable REAL-NAME is unbound. Entonces, ¿cómo puedo obtener el constructor para evaluar sus argumentos de forma secuencial (como puedo con argumentos clave de función), o de qué otra ¿debería estar mejor haciendo esto?

Respuesta

10

Una forma es:

(defstruct (person 
      (:constructor make-person (&key real-name 
              (fake-name real-name)))) 
    real-name 
    fake-name) 

Puede adaptar esencialmente la función constructora a sus necesidades, incluyendo

  • proporcionar un nombre diferente que make-xxx
  • tener Lisp generar una "orden de -of-arguments "(BOA) constructor en lugar de uno basado en palabras clave

Considere

(defstruct (person 
      (:constructor make-person (real-name 
             &optional (fake-name real-name)))) 
    real-name 
    fake-name) 

Incluso puede inicializar campos construidos utilizando el &aux lambda-lista de palabras clave:

(defstruct (person 
      (:constructor make-person (real-name 
             &aux (fake-name (format nil 
                   "fake-of-~A" 
                   real-name))))) 
    real-name 
    fake-name)