3

我在教自己Common Lisp。我一直在看康威的生活遊戲的一個例子,並且有一段我不明白的語法。defun和defun的百分比

完整的代碼可用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)我曾經見過這種語法,但名稱總是相同的。它似乎有一些更深層的功能,但它逃避了我。

回答

4

有幾個命名約定是Lisp世界的標識符。有關概述,請參見:http://www.cliki.net/Naming+conventions

使用系統生成的函數可以完成對象或結構。 DEFSTRUCT將創建一個MAKE-FOO函數,並將slot的init值作爲關鍵字參數。

有時候人們更喜歡功能正常的位置參數 - 寫入時間短,調用函數時必須給出參數 - 您不能忽略它們。

在這種情況下,需要命名DEFSTRUCT生成的函數,使其不會與用戶應該使用的名稱相沖突。所以%MAKE-FOO說這是庫的內部幫助函數,預計不會被用戶級代碼調用。

5

我Lisp是有點生疏,但我相信它是這樣的:

%符號有沒有特殊的含義。我已經看到它用於內部功能(例如,由labels定義),但沒有什麼能阻止你正常地調用它。如果你看一下defstruct documetation,你會看到(:constructor %make-world)定義了一個名爲構造%make-world(默認構造函數將被稱爲make-world,這個構造器可以用來創建world結構,使用命名參數初始化場。

功能make-world的存在使得創建這些結構變得更容易,事實上,currentnext應該是二維數組,但是如果不是將這些數組傳遞給構造函數,而是更簡便,那麼您可以只說出尺寸是什麼,函數會爲你創建這些數組,這正是make-world在這裏所做的,它首先定義了一個內部函數make-plane ,它可以創建一個數組,然後使用它創建2個數組並將它們傳遞給構造函數%make-plane

在與%字符(同樣,這僅僅是一個慣例),它會告訴你,作爲一個程序員希望使用world結構,你不應該使用%make-world構造,但make-world的通常用法線功能。

+0

這有幫助;它讓我讀了兩個答案,讓它變得有意義,現在都清楚了。 –