lisp - 如何在 Common Lisp 中使结构的构造函数按顺序求值?

标签 lisp common-lisp

我想做类似这样的事情:

(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/

相关文章:

common-lisp - 从序列中删除所有重复元素

scheme - 截至 2016 年,是否有支持 100% R7RS(小型)且没有偏差的方案实现?

lisp - 使用 mapcan 卡住创建列表的重复?

php - php 文件标题行中的 Emacs php-mode : Removing duplicate <? php

json - Backbone.js中使用hunchentoot解析model.save()发送的post请求

opengl - glDrawElements 不渲染来自 obj 文件的输入

unit-testing - 在 Racket 中对程序使用单元测试

lisp - 理解 LISP 中的 "let"表达式

asynchronous - drakma-async 和 cl-async 的不可预测行为

lisp - 在common-lisp中转向递归方法