2012-05-02 36 views
12

Tôi vẫn còn khá mới đối với Clojure nên tôi xin lỗi nếu đây là câu hỏi hoàn toàn mới nhưng tôi không thể tìm thấy câu trả lời trực tuyến đầy đủ.Làm cách nào để tham chiếu các hàm trong các tệp khác bằng leiningen?

Về cơ bản, vấn đề của tôi là bất kỳ thời gian tôi cố gắng chạy dự án của tôi, tôi nhận được một lỗi như:

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

Trong trường hợp này, greeter.clj là trong các dự án trong cùng thư mục với tập tin chứa hàm chính của tôi.

Đối với mục đích minh hoạ, tôi đã tạo ra một dự án mà có một cây thư mục như thế này:

enter image description here

Mã của tôi cho core.clj được như sau:

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

(defn -main[] (greet)) 

Mã của tôi cho greeter.clj là:

(ns greeter) 

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

Bất cứ khi nào tôi nhập lein run -m omg.core Tôi nhận được ngoại lệ được đề cập ở trên. Tôi đang làm gì sai?

Trả lời

16

namespace chào mừng nó ở cấp độ sai

(ns omg.greeter) 

Tên trong không gian tên tương ứng với các thư mục trong đường dẫn như vậy để sử dụng các tập tin trong /src/omg/greeter.clj tập tin đó nên chứa omg.greeter không gian tên. nếu bạn muốn có nó chỉ được gọi là greeter thì hãy di chuyển nó xuống một thư mục

Khi sử dụng require bạn cần đánh vần không gian tên của hàm bạn đang gọi, trong trường hợp này sẽ là (omg.greeter/greet). vì đây là một cơn đau, hàm use yêu cầu không gian tên và thêm tất cả các chức năng của nó vào không gian tên hiện tại. Một tùy chọn khác là chọn lọc hơn là sử dụng đòi hỏi phải có một: tham khảo lựa chọn trong định nghĩa namespace

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

hoặc

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

Hầu hết mọi người đưa các yêu cầu không gian tên vào ns cuộc gọi ở phía trên cùng của tập tin .

đọc nhanh http://clojure.org/namespaces hy vọng sẽ giúp

+1

Arthur, cảm ơn rất nhiều câu trả lời và giải thích của bạn. Tôi rất trân trọng điều này. Tôi đã làm cho nó hoạt động bằng cách loại bỏ các yêu cầu và thêm (sử dụng omg.greeter) vào vị trí của nó. –

Các vấn đề liên quan