2012-05-02 11 views
12

Wciąż jestem całkiem nowy w Clojure, więc przepraszam, jeśli jest to całkowicie nowe pytanie, ale nie byłem w stanie znaleźć wystarczającej odpowiedzi online.Jak mogę odwoływać się do funkcji w innych plikach z leiningen?

Zasadniczo mój problem jest to, że za każdym razem próbuję uruchomić mój projekt, pojawia się błąd jak:

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

W tym przypadku greeter.clj jest w projekcie w tym samym katalogu co plik zawierające moją główną funkcję.

Dla celów ilustracyjnych, jakie stworzył projekt, który ma drzewo katalogów takiego:

enter image description here

Mój kod core.clj jest następująca:

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

(defn -main[] (greet)) 

mojego kodu for greeter.clj to:

(ns greeter) 

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

Zawsze gdy piszę lein run -m omg.core Otrzymuję wyjątek wspomniany powyżej. Co ja robię źle?

Odpowiedz

16

przestrzeń nazw witała go w niewłaściwym poziomie

(ns omg.greeter) 

Nazwy w przestrzeni nazw odpowiadają foldery w ścieżce tak, aby korzystać z pliku w /src/omg/greeter.clj że plik powinien zawierać omg.greeter namespace. jeśli chcesz mieć to właśnie nazywa greeter następnie przesunąć go w dół jeden folder

Podczas korzystania require trzeba przeliterować nazw funkcji, do której dzwonisz, że w tym przypadku byłoby (omg.greeter/greet). ponieważ jest to uciążliwe, funkcja use wymaga przestrzeni nazw i dodaje wszystkie swoje funkcje do bieżącego obszaru nazw. Innym rozwiązaniem, które jest bardziej selektywny jest użycie wymaga z: patrz opcja w definicji przestrzeni nazw

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

lub

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

Większość ludzi stawiać wymagania przestrzeni nazw do wywołania ns na początku pliku .

szybkie odczytu http://clojure.org/namespaces mamy nadzieję pomóc

+1

Arthur, dzięki bardzo za odpowiedź i swojej wyjaśnienia. Bardzo to doceniam. Zrobiłem to działając, usuwając wymaganie i dodając (użyj omg.greeter) w jego miejsce. –

Powiązane problemy