4

初心者のClojureとleiningenの質問:

以下の私のプロジェクトのコードスニペットを考えると、これはleinreplから機能します。

==> (-main "something")

期待される「コマンド:何か...実行中...完了」を生成しますが、コマンドラインからは機能しません:

me pallet1]lein run "something"

「コマンド:何か...エラー:コマンドとして解決されていません」を生成します

なんで?/どうすれば修正できますか?

再現するには:

lein new eg

次に、生成されたプロジェクトファイルを編集し、追加:main eg.coreしてメイン関数を定義し、生成されたsrc / eg / core.cljファイルを編集して、次の場所に貼り付けます。

core.clj

(ns eg.core)
(defn something [] (println "Something!"))

(defn run-command-if-any [^String commandname]
    (printf "Command: %s ..." commandname)
    (if-let [cmd (ns-resolve *ns* (symbol commandname))] 
      (
        (println "running ...") (cmd) (println "done.")
      )
      (println "error: not resolved as a command.")
    ))
(defn -main [ commandname ] (run-command-if-any commandname))

それで

lein repl
eg.core=> (-main "something")

動作します(つまり、「Something!」を出力しますが、lein runは動作しません(つまり、「error:notresolved」メッセージを出力します)

4

2 に答える 2

5

問題は、leinから実行すると、デフォルトの名前空間が「user」名前空間になることです。

(defn -main [ commandname ] (println *ns*))

プリントし#<Namespace user>ます。somethingしたがって、別の名前空間からのものであるため、関数は含まれていません。いくつかの選択肢があります。

  1. your-namespace/somethingの代わりに、完全修飾関数名を渡しsomethingます。
  2. your-namespaceの代わりに使用*ns*(ns-resolve 'your-namespace (symbol commandname))
  3. 名前空間をyour-namespaceinに変更します-main

方法3の例:

(defn -main [ commandname ] 
   (in-ns 'your-namespace)
   (run-command-if-any commandname))

また、複数の関数を1つずつ呼び出したい場合は、次のように使用する必要があります。

(do (println "Hello")
    (println "World"))

中かっこだけでなく( (println "hello") (println "World"))

于 2013-01-16T17:55:47.513 に答える
2

lein execプラグインは、プロジェクトのコンテキストでそのようなものをスクリプト化するのに非常に役立ちます。私はこれをclojureやその他のスクリプトの状況でJenkinsのジョブを書くために広く使用しました

lein exec -pe '(something ...) (something-else) (save-results)'
于 2013-01-16T19:23:26.373 に答える