2011-09-15 22 views
5

Tôi muốn làm điều gì đó tương tự như thế này:Làm thế nào tôi có thể làm cho một constructor của cấu trúc đánh giá tuần tự trong Common Lisp?

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

Tuy nhiên, Common Lisp nói The variable REAL-NAME is unbound. Vì vậy, làm thế nào tôi có thể nhận được các nhà xây dựng để đánh giá đối số của nó tuần tự (như tôi có thể với các đối số từ khóa chức năng), hoặc làm thế nào khác tôi có nên làm tốt hơn không?

Trả lời

10

Một cách là:

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

Bạn về cơ bản có thể điều chỉnh chức năng xây dựng yêu cầu của bạn, bao gồm

  • cung cấp một tên khác với make-xxx
  • có Lisp tạo ra một "bởi theo đơn đặt hàng đối số -of-đối số "(BOA) thay vì một từ khóa dựa trên từ khóa

Cân nhắc

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

Bạn thậm chí có thể khởi tạo các lĩnh vực xây dựng bằng cách sử dụng từ khóa &aux lambda-list:

(defstruct (person 
      (:constructor make-person (real-name 
             &aux (fake-name (format nil 
                   "fake-of-~A" 
                   real-name))))) 
    real-name 
    fake-name) 
Các vấn đề liên quan