1

lein replを作成したときに、名前空間から関数を問題なく呼び出すことができlein new app ...ます。lein replしかし、 を介してライブラリ プロジェクトを作成しただけでは、関数を呼び出すことができないようですlein new ...。詳細は次のとおりです。

たとえば を使用して lein アプリを作成しlein new app my-app、プロジェクト ディレクトリ ( を含むディレクトリproject.clj) からlein repl. repl は私を名前空間に残しますmy-app.core

my-app.core=> 

サイドファイルで定義された関数であっても、repl で関数を呼び出すことができるようになりました。

my-app.core=> (-main)
; Hello, world!
my-app.core=> (my-app.anotherfile/foo)
; Hey, there; this is foo from anotherfile

:require [my-app.anotherfile]の ns マクロにある限り、 core.clj.

わかりました。今、私はleinライブラリでも同様にやりたいと思っています。だから私lein new my-libは、そしてlein repl、そして私はuser名前空間にいます:

user=> 

は?さて、私のライブラリには呼び出したい関数が含まれています (これは leiningen がデフォルトで作成するものです)

(ns my-lib.core)

(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Hello, World!"))

私は試します

user=> (in-ns 'my-lib.core)
my-lib.core=> (foo 42)
; CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:1:1) 

いいえ。これはどう?

user=> (my-lib.core/foo 42)
; ClassNotFoundException two-files-lib.core  java.net.URLClassLoader$1.run (URLClassLoader.java:202

あはは!別のエラーですが、まだ解決策が見えません。lein compileそしてlein javac何もしていないようです。

ドキュメントやオンラインで正しい呪文を見つけたり推測したりすることができませんでした。アドバイスをいただければ幸いです。

4

1 に答える 1

3

デフォルトのlein newプロジェクトではrequire、明示的に使用したい名前空間が必要です -- (require 'my-lib.core)in-ns指定された名前の新しい空の名前空間が存在しない場合は単純に作成し、クラスパスからコードをロードしません。

アプリ プロジェクトはこれを自動的に行い、REPL タスクでメインの名前空間に切り替えます。これは、デフォルト:main foo.coreでエントリがあるためです。project.cljライブラリに対して実行することは可能ですが、すべきではありません。副作用として、メインの名前空間の AOT コンパイルが発生しますが、これは一般的に望ましくありません。

代わりに、lein2 では:repl-options {:init-ns my-lib.core}.

于 2013-04-14T16:27:47.177 に答える