3

我正在尝试创建一个基于文本的 Clojure 游戏(灵感来自 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

4

2 回答 2

3

你有太多的括号。而不是(describe-location(:garden *nodes*)),你想要(describe-location :garden *nodes*)

请记住,函数的名称在开放括号之后(:garden *nodes*),而不是之前:您正在调用然后调用describe-location结果,结果失败了,因为需要describe-location两个参数,而不是一个。

于 2011-03-05T00:57:52.430 回答
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。如果项目发展到举世闻名的成功,这将允许您稍后添加依赖项而无需大惊小怪

于 2011-03-05T00:18:35.830 回答