2

一般的なリスプでは、これを行うことができます:

src-> (defmacro macro-hello () `"hello")

(eval '(マクロこんにちは))

問題なし。

クロージュアで:

(defmacro マクロこんにちは [] `"こんにちは")

(eval '(マクロこんにちは))

エラーが発生します。私は何か間違ったことをした?

Clojure エラー:

スレッド「メイン」での例外 java.lang.Exception: シンボルを解決できません: clojure.lang.Compiler の clojure.lang.Compiler.analyze(Compiler.java:4340) で、このコンテキスト (NO_SOURCE_FILE:12) で macro-hello です。 analyze(Compiler.java:4286) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:2767) at clojure.lang.Compiler.analyzeSeq(Compiler.java:4498) at clojure.lang.Compiler.analyze(Compiler) .java:4325) で clojure.lang.Compiler.analyze(Compiler.java:4286) で clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:3862) で clojure.lang.Compiler$FnMethod.parse( Compiler.java:3697) で clojure.lang.Compiler$FnMethod.access$1100(Compiler.java:3574) で clojure.lang.Compiler$FnExpr.parse(Compiler.java:2963) で clojure.lang.Compiler.analyzeSeq(コンパイラ.java:com. yourcompany.defpackage$_main__4.invoke(defpackage.clj:12) at clojure.lang.AFn.applyToHelper(AFn.java:171) at clojure.lang.AFn.applyTo(AFn.java:164) at com.yourcompany.defpackage .main(不明なソース) 原因: java.lang.Exception: Unable to resolve symbol: macro-hello in this context at clojure.lang.Compiler.resolveIn(Compiler.java:4682) at clojure.lang.Compiler.resolve( Compiler.java:4628) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 Java 結果: 14325) clojure.lang.Compiler.eval(Compiler.java:4530) で clojure.core$eval__3990.invoke(core.clj:1728) で com.yourcompany.defpackage$_main__4.invoke(defpackage.clj:12) でclojure.lang.AFn.applyToHelper(AFn.java:171) at clojure.lang.AFn.applyTo(AFn.java:164) at com.yourcompany.defpackage.main(Unknown Source) 原因: java.lang.Exception:シンボルを解決できません: clojure.lang.Compiler.resolveIn(Compiler.java:4682) のこのコンテキストでのマクロ ハロー clojure.lang.Compiler.resolve(Compiler.java:4628) の clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 以上の Java 結果: 14325) clojure.lang.Compiler.eval(Compiler.java:4530) で clojure.core$eval__3990.invoke(core.clj:1728) で com.yourcompany.defpackage$_main__4.invoke(defpackage.clj:12) でclojure.lang.AFn.applyToHelper(AFn.java:171) at clojure.lang.AFn.applyTo(AFn.java:164) at com.yourcompany.defpackage.main(Unknown Source) 原因: java.lang.Exception:シンボルを解決できません: clojure.lang.Compiler.resolveIn(Compiler.java:4682) のこのコンテキストでのマクロ ハロー clojure.lang.Compiler.resolve(Compiler.java:4628) の clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 以上の Java 結果: 1yourcompany.defpackage$_main__4.invoke(defpackage.clj:12) at clojure.lang.AFn.applyToHelper(AFn.java:171) at clojure.lang.AFn.applyTo(AFn.java:164) at com.yourcompany.defpackage .main(不明なソース) 原因: java.lang.Exception: Unable to resolve symbol: macro-hello in this context at clojure.lang.Compiler.resolveIn(Compiler.java:4682) at clojure.lang.Compiler.resolve( Compiler.java:4628) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 Java 結果: 1yourcompany.defpackage$_main__4.invoke(defpackage.clj:12) at clojure.lang.AFn.applyToHelper(AFn.java:171) at clojure.lang.AFn.applyTo(AFn.java:164) at com.yourcompany.defpackage .main(不明なソース) 原因: java.lang.Exception: Unable to resolve symbol: macro-hello in this context at clojure.lang.Compiler.resolveIn(Compiler.java:4682) at clojure.lang.Compiler.resolve( Compiler.java:4628) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 Java 結果: 1シンボルを解決できません: clojure.lang.Compiler.resolveIn(Compiler.java:4682) のこのコンテキストでのマクロ ハロー clojure.lang.Compiler.resolve(Compiler.java:4628) の clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 以上の Java 結果: 1シンボルを解決できません: clojure.lang.Compiler.resolveIn(Compiler.java:4682) のこのコンテキストでのマクロ ハロー clojure.lang.Compiler.resolve(Compiler.java:4628) の clojure.lang.Compiler.analyzeSymbol( Compiler.java:4605) at clojure.lang.Compiler.analyze(Compiler.java:4307) ... 17 以上の Java 結果: 1

[編集]: 末尾の二重引用符を追加

4

2 に答える 2

2

あなたのコードは私のために働きます。

ユーザー>(defmacro macro-hello [] `" hello ")
#'user / macro-hello
user>(eval'(macro-hello))
"こんにちは"

これは最先端のClojureによるものです。macro-hello「シンボルを解決できない」とは、現在の名前空間で呼び出されたマクロが見つからないことを意味します。これをREPLから実行していますか、それともソースファイルで実行していますか?私はあなたのステートメントをREPLで文字通りタイプしました。

`これが問題の原因であるかどうかはわかりませんが、Clojureのと' の違いに注意してください。`名前空間の解決を行いますが、行い'ません。

ユーザー>`マクロ-こんにちは
user / macro-hello
ユーザー>'マクロ-こんにちは
マクロこんにちは

これは、CommonLispの動作とは異なります。`"hello"文字列は名前空間に属していないため、文字列のようにバッククォートすることはあまり意味がありませんが、何も害はありません。

(Clojureコードにタイプミスがあり、二重引用符が欠落していると想定しています。)

于 2009-08-20T17:20:20.707 に答える
1

私はMacとLinuxのボックスで/optを使いこなすのが好きです。Clojureソースを取得します。(%はUnixプロンプトです)

%cd / opt

%git clone git://github.com/richhickey/clojure.git; #Unixコマンドラインから、/ opt/clojureディレクトリがあります

%cd / opt / clojure

%/ opt / netbeans-6.7.1 / java2 / ant / bin / ant; #antを実行します。Netbeansに同梱されています。

%cd / opt; #そこにない場合はmkdir/opt。

%git clone git://github.com/richhickey/clojure-contrib.git; #投稿を取得

%/ opt / netbeans-6.7.1 / java2 / ant / bin / ant -Dclojure.jar = .. / clojure / clojure.jar; #clojure.jarがどこにあるかをantに伝えます

jarの名前をclojure.jarとclojure-contrib.jarに変更します

これらのjarファイルをNetbeanのプロジェクトlibディレクトリにコピーします。

于 2009-08-21T03:58:00.327 に答える