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

为什么Clojure Spels使用带引号的符号而不是关键字?,clojure,symbols,quote,Clojure,Symbols,Quote,为什么用引号代替关键字 (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 -)

为什么用引号代替关键字

(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)))
我把
'客厅
改成了
:客厅
,在所有地方都能用

我对Clojure很陌生,
'something
,当
:something
可用时,它的意义是什么

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

在Lisp中使用SPELs是为通用Lisp编写的。虽然CL也有关键字(即
:foo
),但作者选择使用引用的符号列表。这抓住了Lisp的魔力,以及“代码即数据”的思想——一个符号,在计算时,可以表示一个值,比如一个函数,但也可以表示它本身的值,这是Lisp的一个很酷的东西

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

在Lisp中转换SPEL的方法是为通用Lisp编写的。虽然CL也有关键字(即
:foo
),但作者选择使用引用的符号列表。这抓住了Lisp的魔力,以及“代码即数据”的思想——一个符号,在计算时,可以表示一个值,比如一个函数,但也可以表示它本身的值,这是Lisp的一个很酷的东西


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

在游戏中使用符号比使用关键字更容易构建界面

如果您通读了它,您会看到您通过输入类似于
(向西行走)
的命令来控制游戏。我认为作者认为这比
(walk:west)
要好得多,而且使用符号可能比将
west
从输入转换为关键字
:west
要简单得多,不会让初学者感到困惑。在原版和你的Clojure版本中,Conrad都修复了宏的界面,因此你不需要在完成的游戏中引用任何东西,也不需要使用奇怪的冒号

是他书第五章的草稿/变体,名为。在这本书中,他没有使用宏,而是创建了一个游戏读取评估打印循环。有了REPL,你就可以把所有东西都作为数据输入,因此在游戏结束时也不需要引用任何东西

事实上,他使用符号而不是字符串是很奇怪的,直到你认为他可能想让读者很早就熟悉符号

如果你只想学一点CL,我强烈推荐这本书,因为它比演员斯皮尔斯更有趣


作为练习,为什么不尝试使用关键字并尝试编写宏或REPL,这样您仍然可以编写
向西行走
,并且它可以
(行走方向:向西)
,而无需对
向西
:向西
之间的映射进行编码。这会使游戏更复杂吗?

在游戏中使用符号比使用关键字更容易构建界面

如果您通读了它,您会看到您通过输入类似于
(向西行走)
的命令来控制游戏。我认为作者认为这比
(walk:west)
要好得多,而且使用符号可能比将
west
从输入转换为关键字
:west
要简单得多,不会让初学者感到困惑。在原版和你的Clojure版本中,Conrad都修复了宏的界面,因此你不需要在完成的游戏中引用任何东西,也不需要使用奇怪的冒号

是他书第五章的草稿/变体,名为。在这本书中,他没有使用宏,而是创建了一个游戏读取评估打印循环。有了REPL,你就可以把所有东西都作为数据输入,因此在游戏结束时也不需要引用任何东西

事实上,他使用符号而不是字符串是很奇怪的,直到你认为他可能想让读者很早就熟悉符号

如果你只想学一点CL,我强烈推荐这本书,因为它比演员斯皮尔斯更有趣


作为练习,为什么不尝试使用关键字并尝试编写宏或REPL,这样您仍然可以编写
向西行走
,并且它可以
(行走方向:向西)
,而无需对
向西
:向西
之间的映射进行编码。它会使游戏变得更复杂吗?

'something
是一个符号,而
:something
是一个关键字。经典的lisp没有关键字的概念。你的问题标题应该是关于symbol vs关键字,而不是quote vs symbol,因为quote是创建symbol的一种方式。Hanks,我对此感到困惑。我会编辑。@Ankur怎么样???
“某物
是一个符号,而
:某物
是一个关键字。经典的lisp没有关键字的概念。你的问题标题应该是关于symbol vs关键字,而不是quote vs symbol,因为quote是创建symbol的一种方式。Hanks,我对此感到困惑。我会编辑。@Ankur怎么样??