代码在REPL中运行,但如果保存到文件则不会

时间:2011-03-04 22:53:36

标签: clojure jvm land-of-lisp

我正在尝试创建一个基于文本的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

2 个答案:

答案 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。这将允许您稍后添加依赖项,当项目增长到世界着名的成功时,如果那么