Functional programming defun和defstruct中的登录百分比

Functional programming defun和defstruct中的登录百分比,functional-programming,data-structures,syntax,lisp,common-lisp,Functional Programming,Data Structures,Syntax,Lisp,Common Lisp,我在自学通用口齿不清。我一直在看康威的《生活的游戏》的一个例子,其中有一个语法我不懂 完整的代码是可用的。我遇到的问题如下: (defstruct (world (:constructor %make-world)) current next) (defun make-world (width height) (flet ((make-plane (width height) (make-array (list width height)

我在自学通用口齿不清。我一直在看康威的《生活的游戏》的一个例子,其中有一个语法我不懂

完整的代码是可用的。我遇到的问题如下:

(defstruct (world (:constructor %make-world)) 
  current
  next)

(defun make-world (width height)
  (flet ((make-plane (width height)
          (make-array (list width height)
                   :element-type 'bit
                   :initial-element 0)))
  (%make-world
     :current (make-plane  width height)
     :next    (make-plane  width height))))

我想知道,首先,在%make world中,百分比符号的意义是什么?第二,为什么构造函数指定两个不同的名称?(make-world和%make-world)我以前见过这种语法,但名称总是相同的。似乎有一些更深层次的功能,但我还是无法理解。

我的Lisp有些生疏,但我相信它是这样的:

%符号没有特殊含义。我见过它被用于内部函数(例如,由
标签定义的
),但没有什么能阻止您正常调用它。如果您查看documentation,您将看到
(:构造函数%make world)
定义了一个命名构造函数
%make world
(默认情况下,该构造函数将被称为
make world
。此构造函数可用于创建
world
结构,使用命名参数初始化字段

函数
make world
的存在使创建这些结构变得更容易。问题是,
current
next
应该是二维数组,但是如果不将这些数组传递给构造函数,只需说出维度是什么,函数就可以为您创建这些数组,这样会更方便。这正是
make world
在这里所做的。它首先定义一个内部函数
make plane
,该函数可以创建一个数组,然后使用它创建两个数组并将它们传递给构造函数
%make plane


%
字符的常用用法一致(同样,这只是一种惯例),它告诉您,作为希望使用
world
结构的程序员,您不应该使用
%make-world
构造函数,而应该使用
make-world
函数。

对于标识符,Lisp世界有几种命名约定。有关概述,请参阅:

可以使用系统生成的函数生成对象或结构。
DEFSTRUCT
将创建一个
MAKE-FOO
函数,其中插槽的初始值作为关键字参数

有时,人们更喜欢具有普通位置参数的函数—编写时间更短,并且在调用函数时必须给出参数—您不能忽略它们


在本例中,需要对
DEFSTRUCT
生成的函数进行命名,这样它就不会与用户应该使用的名称发生冲突。因此
%MAKE-FOO
表示这是库的内部帮助函数,预计不会被用户级代码调用。

这很有帮助;我花了时间阅读了这两个函数答案是有意义的,现在一切都清楚了。