我想做类似这样的事情:
(defstruct person
real-name
(fake-name real-name)) ;if fake-name not supplied, default to real-name
但是,Common Lisp 说 变量 REAL-NAME 是未绑定(bind)的。
那么我怎样才能让构造函数按顺序计算它的参数(就像我可以使用函数关键字参数一样),或者我还应该怎么做这样做会更好吗?
最佳答案
一种方法是:
(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)
关于lisp - 如何在 Common Lisp 中使结构的构造函数按顺序求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7426027/