为什么Clojure Spels使用带引号的符号而不是关键字?

时间:2014-07-23 12:38:25

标签: clojure symbols quote

为什么http://www.lisperati.com/clojure-spels/data.html使用带引号的符号而非关键字?

(def objects '(whiskey-bottle bucket frog chain))

(def game-map (hash-map
   'living-room '((you are in the living room
                   of a wizards house - there is a wizard
                   snoring loudly on the couch -)
                  (west door garden)
                  (upstairs stairway attic))
   'garden '((you are in a beautiful garden -
              there is a well in front of you -)
             (east door living-room))
   'attic '((you are in the attic of the
             wizards house - there is a giant
             welding torch in the corner -)
            (downstairs stairway living-room))))

(def object-locations (hash-map
                       'whiskey-bottle 'living-room
                       'bucket 'living-room
                       'chain 'garden
                       'frog 'garden))

(def location 'living-room)

(defn describe-location [location game-map]
  (first (location game-map)))

我在所有地方都将'living-room更改为:living-room并且有效。

我对Clojure很陌生 - 当'something可以使用时:something有什么意义?

(我理解引用的作用 - 我想知道何时使用带引号的符号而不是关键字。)

2 个答案:

答案 0 :(得分:6)

Lisp 中 Casting SPEL的original version是为Common Lisp编写的。虽然CL也有关键字(即:foo),但作者选择使用带引号的符号列表。这捕获了Lisp的神奇之处,以及"代码作为数据的概念" - 在评估时,符号可以表示诸如函数之类的值,但也可以表示其自身的值,这是关于Lisp的一个很酷的事情。

这只是我的印象,但是当作者为Clojure翻译 Casting SPEL 时,我相信他仍然决定仍然使用符号来表示数据(即使在Clojure中,它会更加惯用于使用关键字和字符串)以保持有关Lisp的基础消息的完整性,并能够将代码用作数据和数据作为代码。

答案 1 :(得分:2)

在游戏中使用符号可以使构建界面比选择使用关键字更容易。

如果您已经阅读过,则可以通过输入(walk west)之类的命令来控制游戏。我认为作者虽然比(walk :west)更好,但使用符号可能要比将west从输入转换为关键字:west要简单得多,而不会混淆初学者程序员。在原版和Clojure版本中,Conrad使用宏修复了界面,因此您不会在完成的游戏中引用任何内容,也不需要使用奇怪的冒号。

Casting Spels是其书籍The Land of LISP第5章的草稿/变体。在书中,他不使用宏,而是创建一个游戏读取 - 评估 - 打印循环。使用REPL,您可以将所有内容作为数据获取,因此在游戏结束时无需引用任何内容。

他使用符号代替字符串的事实很奇怪,直到你认为他可能希望读者早期与符号亲密接触。

如果你想学习一点CL,我强烈推荐这本书,因为它比Casting SPEL更加欢闹。

为什么不尝试使用关键字并尝试编写宏或可能是REPL,以便您仍然可以编写walk west并且它可以(walk-direction :west)而不编码之间的映射west:west。它会让游戏变得更复杂吗?