2011-09-15 6 views
5

Mi piacerebbe fare qualcosa di simile a questo:Come posso fare il costruttore di una struttura di valutare in sequenza in Common Lisp?

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

Tuttavia, Common Lisp dice The variable REAL-NAME is unbound. Così come posso ottenere il costruttore di valutare i suoi argomenti in sequenza (come posso con argomenti la funzione di parole chiave), o in quale altro modo dovrei essere meglio fare questo?

risposta

10

Un modo è:

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

È possibile personalizzare essenzialmente la funzione di costruzione per le vostre esigenze, tra cui

  • fornendo un nome diverso da quello make-xxx
  • avere Lisp generare un "by-order -di-argomenti"(BOA) Funzione di costruzione, invece di una parola chiave a base di uno

Considerare

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

È anche possibile inizializzare i campi costruiti utilizzando la parola chiave &aux lambda-list:

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