3

私はclojureファイルに次のものを持っています:

(ns helloworld
  (:gen-class
    :main -main))

(defn hello-world-fn []
  (println "Hello World"))

(defn -main [& args]
  (eval (read-string "(hello-world-fn)")))

そして私はそれを実行しています

lein run helloworld

次のエラーが表示されます。

Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol:
 helloworld in this context, compiling:(helloworld.clj:12)

ns-resolveorで何かをする必要があると感じてresolveいますが、成功していません。メイン関数で次のことを試しました。

(let [call-string  (read-string "(hello-world-fn)")
      func (resolve  (symbol (first call-string)))
      args (rest call-string)]
   (apply func args))

成功せずに。

誰かが(a)私を正しい方向に向けることができますか?(b) これが発生したときに Clojure リーダーで何が起こっているかを正確に説明してください。

4

2 に答える 2

3

を使用して、非常にエレガントな方法で課題を解決できますmacros。実際、 を模倣するマクロを作成できますeval

(defmacro my-eval [s] `~(read-string s))
(my-eval "(hello-world-fn)")); "Hello World"

evalのシンボル解決はsを呼び出すコンテキストで発生するため、より適切に機能しますmy-eval。明確化のために@Matthias Benkardに感謝します。

マクロとその構文については、http://clojure.org/readerで読むことができます。

于 2012-02-07T07:12:28.343 に答える