2012-05-02 12 views
12

Clojure'a hala oldukça yeniyim, bu yüzden bu tamamen yeni bir soru ise özür dilerim, ancak çevrimiçi olarak yeterli bir yanıt bulamadım.leiningen ile başka dosyalardaki işlevlere nasıl başvuru yapabilirim?

Temelde, benim sorunum projemi çalıştırmayı her zaman, ben gibi bir hata şudur: Bu durumda

Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate greeter__init.class or greeter.clj on classpath: 

, greeter.clj dosyasıyla aynı dizinde projede olduğu ana işlevimi içeren.

enter image description here

aşağıdaki core.clj Benim kod gibidir:

(ns omg.core 
(require [greeter])) 

(defn -main[] (greet)) 

Benim kod

Gösterim amacıyla, böyle bir dizin ağacı vardır bir proje oluşturduk greeter.clj içindir:

(ns greeter) 

(defn greet [] println("Hello world")) 

benyazdığınızdaYukarıda belirtilen istisnayı alıyorum. Neyi yanlış yapıyorum?

cevap

16

yanlış seviyede ad alanında isimler

(ns omg.greeter) 

de karşılayıcı ad onu bu dosya içermelidir /src/omg/greeter.clj böylece dosyayı kullanmak yolunda klasörlere karşılık omg.greeter ad alanı. bunu sadece greeter denilen olmasını istiyorsanız (omg.greeter/greet) olurdu bu durumda, aradığınız fonksiyonun ad telaffuz etmek gerek require kullanırken sonra bir klasör

aşağı hareket ettirin. Bu bir acı olduğundan, use işlevi bir ad alanı gerektirir ve tüm işlevlerini geçerli ad alanına ekler.

(ns omg.core 
    (require [omg.greeter :refer :all])) 

veya

(ns omg.core 
    (require [omg.greeter :refer [greet]])) 

Çoğu insan dosyanın üst kısmında ns çağrısında ad gereksinimlerini koymak ad tanımında seçeneği bakın: Daha fazla seçici Başka bir seçenek ile gerektirir kullanmaktır . http://clojure.org/namespaces hızlı okuma umarım

+1

Arthur yardımcı olacaktır

, Cevabınız ve açıklama için çok teşekkürler. Gerçekten onu takdir ederim. Onun yerine ihtiyacım ve ekleyerek (omg.greeter kullanın) çalışarak çalıştım. –

İlgili konular