2012-12-19 31 views
6

Tôi đang viết một số mã cần lưu trữ dữ liệu về không gian tên hiện tại. Mã của tôi đang tạo ra bản thể luận, và tôi cần gán các URI cần phải tồn tại giữa các lời gọi clojure. Các URI này được tạo tự động, vì vậy nó không chỉ là trường hợp các tác giả mã viết chúng.Trong clojure, làm thế nào để có được tên tập tin của không gian tên hiện tại?

Tôi đã nghĩ sử dụng cơ chế tương tự như cách các Emac lưu trữ dữ liệu; bằng cách tạo ra một số hình thức lisp và lưu chúng trong một tập tin. Những điều này sau đó có thể được đánh giá khi bắt đầu clojure và mọi người đều hạnh phúc. Vấn đề khi sử dụng các công cụ như leningen, các tệp này sẽ kết thúc trong thư mục gốc.

Tôi có thể xây dựng dựa trên các quy ước thư mục chuẩn, nhưng tôi muốn lấy dữ liệu trực tiếp từ clojure; Tôi biết trình biên dịch thêm dữ liệu vị trí nguồn vào clojure; có cách nào để tôi có thể truy cập vào bản thân mình không?

+0

Bạn có thể giải thích chi tiết hơn tại sao bạn không muốn giữ dữ liệu "đã lưu" trong thư mục gốc không? Bạn có thể đọc nó và đánh giá từ clojure. –

+0

Dữ liệu tôi lưu giữ sẽ có thể đọc được một phần. Nó có ý nghĩa hơn với tôi, để giữ cho nó với các tập tin mà nó đề cập đến. Nó sẽ được phiên bản cùng với nó. –

Trả lời

12

Nếu bạn đang tìm kiếm không gian tên trong đó mã hiện đang thực hiện tại thời gian chạy, sau đó bạn chỉ có thể nhìn vào giá trị của clojure.core/*ns*:

user> (defn which-ns? [] (str *ns*)) 
user> (which-ns?) 
"user" 
user> (ns user2) 
user2> (which-ns?) 
"user2" 

Nếu bạn đang tìm kiếm các tập tin trong đó một var hoặc namespace đã được xác định, sau đó vị trí mã nguồn bạn đang đề cập đến được lưu trữ bởi trình biên dịch như siêu dữ liệu trên var khi đánh giá một hình thức def:

user> (defn foo [x] (inc x)) 
user> (meta #'foo) 
{:arglists ([x]), :ns #<Namespace user>, :name foo, :line 1, :file "NO_SOURCE_FILE"} 

các "NO_SOURCE_FILE" là bởi vì bạn đang đánh giá một biểu mẫu nhập ed trong REPL. Nếu bạn đánh giá mã từ một tệp nguồn, thì :file sẽ trỏ đến tên đường dẫn của tệp nguồn.

+0

Hmmm. Điều này khiến tôi tự hỏi liệu có bất kỳ siêu dữ liệu nào trên không gian tên không, nhưng không gian tên không thực sự ràng buộc một biểu tượng. Tôi nghĩ rằng mặc dù bạn đã thực hiện một điểm tốt - những gì tôi đã làm, nó có khả năng thất bại nếu tôi chạy mã trong một REPL. Một không gian tên không ánh xạ trực tiếp tới một tệp, ngay cả khi nó xuất hiện. –

+0

Bạn có thể nhận được từ một biểu tượng cho một không gian tên bằng cách sử dụng '(the-ns 'clojure.core)' và bạn có thể lấy/đặt siêu dữ liệu trên ns ... nhưng trình biên dịch không xuất hiện để thêm tệp nguồn dưới dạng siêu dữ liệu đến ns. – Alex

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