如何在Common Lisp中按顺序对结构的构造函数进行求值?

时间:2011-09-15 04:52:35

标签: lisp common-lisp

我想做类似的事情:

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

然而,Common Lisp说The variable REAL-NAME is unbound.那么我怎样才能让构造函数按顺序评估它的参数(就像我可以使用函数关键字参数),或者我应该如何做得更好?

1 个答案:

答案 0 :(得分:10)

一种方法是:

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

您基本上可以根据需要定制构造函数,包括

  • 提供与make-xxx
  • 不同的名称
  • 让Lisp生成“按顺序参数”(BOA)构造函数而不是基于关键字的构造函数

考虑

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

您甚至可以使用&aux lambda-list关键字初始化构造的字段:

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