【问题标题】:Percent sign in defun and defstructdefun 和 defstruct 中的百分比符号
【发布时间】:2014-06-23 00:26:21
【问题描述】:

我正在自学 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) 我以前见过这种语法,但是名字总是一样的。似乎有一些更深层次的功能,但它正在逃避我。

【问题讨论】:

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


    【解决方案1】:

    当涉及到标识符时,Lisp 世界有几种命名约定。有关概述,请参阅:http://www.cliki.net/Naming+conventions

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

    有时人们更喜欢带有普通 位置 参数的函数 - 编写起来更短,并且在调用函数时必须给出参数 - 你不能省略它们。

    在这种情况下,需要命名DEFSTRUCT 生成的函数,使其不会与用户应该使用的名称发生冲突。所以%MAKE-FOO 说这是库的内部帮助函数,预计不会被用户级代码调用。

    【讨论】:

      【解决方案2】:

      我的 Lisp 有点生锈了,但我相信它是这样的:

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

      函数make-world 的存在是为了更容易创建这些结构。问题是,currentnext 应该是二维数组,但如果不将这些数组传递给构造函数,您可以直接说出维度是什么,然后一个函数会为您创建这些数组,这样会更方便.这正是make-world 在这里所做的。它首先定义了一个内部函数make-plane,它可以创建一个数组,然后用它创建2个数组并传递给构造函数%make-plane

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

      【讨论】:

      • 这有帮助;我花了我阅读这两个答案才有意义,现在一切都清楚了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      相关资源
      最近更新 更多