我正在自学 Common Lisp。我一直在看康威生命游戏的例子,有一段语法我不明白。
完整代码可用here .我特别遇到问题的部分如下:
(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 世界有几种命名约定。有关概述,请参阅:http://www.cliki.net/Naming+conventions
可以使用系统生成的函数来创建对象或结构。 DEFSTRUCT
将创建一个 MAKE-FOO
函数,并将槽的初始值作为关键字参数。
有时人们更喜欢带有普通位置参数的函数——这样写起来更短,而且在调用函数时必须给出参数——你不能省略它们。
在这种情况下,需要以不与用户应使用的名称冲突的方式命名 DEFSTRUCT
生成的函数。所以 %MAKE-FOO
表示这是库的内部辅助函数,预计不会被用户级代码调用。
关于functional-programming - defun 和 defstruct 中的百分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23493877/