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

wro*_*ame 5 lisp common-lisp

我想做一些类似于此的事情:

(defstruct person
  real-name
  (fake-name real-name)) ;if fake-name not supplied, default to real-name
Run Code Online (Sandbox Code Playgroud)

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

Dir*_*irk 10

一种方法是:

(defstruct (person
             (:constructor make-person (&key real-name
                                             (fake-name real-name))))
  real-name
  fake-name)
Run Code Online (Sandbox Code Playgroud)

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

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

考虑

(defstruct (person 
             (:constructor make-person (real-name
                                        &optional (fake-name real-name))))
    real-name
    fake-name)
Run Code Online (Sandbox Code Playgroud)

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

(defstruct (person
             (:constructor make-person (real-name
                                        &aux (fake-name (format nil
                                                                "fake-of-~A"
                                                                real-name)))))
    real-name
    fake-name)
Run Code Online (Sandbox Code Playgroud)