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
表示这是库的内部帮助函数,预计不会被用户级代码调用。这很有帮助;我花了时间阅读了这两个函数答案是有意义的,现在一切都清楚了。