functional-programming - defun 和 defstruct 中的百分号

标签 functional-programming data-structures syntax lisp common-lisp

我正在自学 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/

相关文章:

javascript - 在 Array.prototype.reduce 中使用不纯的 reducer 是否安全?

c# - 我应该使用什么数据结构?

algorithm - 树递归-打印给定数字的子序列

html - 将双引号传递给 Jscript

python - Python中从一个类中调用多个函数而无需每次都重复类名

syntax - 我们可以将 X/Y 或 X :Y in Prolog 归入什么类别

scala - akka:共享可变状态

haskell - 我应该使用新的 Haskell 语言扩展而不是旧的吗?

java - 如何在不调用 call 方法的情况下调用仿函数对象的函数

java - 搜索性能调整