我正在尝试创建一个基于文本的Clojure游戏(灵感来自Land of Lisp)。
(def *nodes* {:living-room "you are in the living-room. a wizard is snoring loudly on the couch."
:garden "you are in a beautiful garden. there is a well in front of you."
:attic "you are in the attic. there is a giant welding torch in the corner."})
(defn describe-location [location nodes]
(nodes location))
代码在REPL中运行,但是如果我将代码保存到文件并尝试运行:
(describe-location :attic *nodes*)
我得到了:
线程“main”中的异常java.lang.IllegalArgumentException:错误 args(1)传递给:user $ describe-location(wizard-game.clj: 0)
我做错了什么? 这是文件:http://dl.dropbox.com/u/3630641/wizard-game.clj
答案 0 :(得分:3)
你的括号太多了。而不是(describe-location(:garden *nodes*))
,您需要(describe-location :garden *nodes*)
。
请记住,函数的名称在打开的paren之后,而不是之前:您正在调用(:garden *nodes*)
然后在结果上调用describe-location
,因为{ {1}}需要两个参数,而不是一个。
答案 1 :(得分:0)
一个潜在的问题是,加载到“用户”名称空间中的repl的函数版本可能不是您期望的版本,因此您可能希望(load "wizard-game.clj")
成为新的REPL。虽然很多人现在都在使用leiningen,除了直接使用maven的人数很多。
(ns com.me.myGame ....)
然后你可以通过运行
将它加载到repl中(use 'com.me.myGame)
并通过名称空间限定名称
调用函数(com.me.myGame/describe-location :attic)
或从repl切换到该命名空间:
(in-ns 'com.me.myGame)
(describe-location :attic)
<小时/> 或者您可以使用leiningen自动创建项目和名称空间。 leiningen在这种情况下是值得的,因为它只花了我写这句话比用lein做项目更长。 leiningen有很多很好的教程。
lein new wizard-game
然后编辑src / wizard-game / core.clj。这将允许您稍后添加依赖项,当项目增长到世界着名的成功时,如果那么