2010-07-13 29 views
5

Tôi mới bắt đầu học Clojure và Emacs. Tôi đã có Clojure Box cho các cửa sổ đang chạy và tôi muốn có thể viết mã trong bộ đệm rồi chạy nó trong REPL mà không cần phải gọi sốTải lại các tệp Clojure trong emacs

mọi lúc. Tôi biết về C-c C-k nhưng nó không tải lại không gian tên. Nếu tôi sử dụng

(in-ns 'example.code) 

để thay đổi không gian tên trong replay hoạt động. Cách đúng để làm điều này là gì?

Trả lời

10

in-ns là một trong những cách phù hợp.

Cách cảm nhận "quyền" nhất đối với tôi là (require '[example.code :as ec]) và hoạt động trong không gian tên user tại REPL; theo cách đó, trạng thái thử nghiệm ném của tôi vẫn nằm trong các số userec/foo đủ thuận tiện cho tôi (và điều này rõ ràng là nơi mà foo được cho là bắt nguồn từ). Bạn luôn có thể nói (require :reload-all 'example.code) (cùng một công trình với use) để buộc biên dịch lại.

Ngoài ra, đây là một chức năng để loại bỏ (từ không gian tên hiện tại) tất cả các ánh xạ kéo từ một không gian tên được đưa ra với use:

(defn unuse [ns] 
    (doseq [[n v] (ns-refers *ns*)] 
    (if (= (.. v ns name) ns) 
     (ns-unmap *ns* n)))) 

Ngày đầu đó bạn có thể xây dựng

(defn reuse [ns] 
    (unuse ns) 
    (remove-ns ns) 
    (use :reload-all ns)) 

và hãy nói (reuse 'example.code) để có được một thứ gần gũi với một khởi đầu mới với không gian tên của bạn. (Lưu ý rằng 1,2 tính năng mới như deftype & defrecord giới thiệu một số phức tạp ... Đặc biệt, unuse không ảnh hưởng đến lớp import ed -. Điều này bao gồm hồ sơ và deftype loại -created :reload-all vẫn làm cho deftype et al hình thức được. biên dịch lại, nhưng tôi nhớ đã đánh những trường hợp kỳ lạ mà điều này dường như không đủ ... Có thể lỗi của tôi, có thể là một số khía cạnh phức tạp của những tính năng này mà tôi chưa khám phá đầy đủ.)

0

Có lẽ cách "bẩn" chỉ đơn giản là chuyển sang không gian tên của bộ đệm trong repl với (ns 'example.code). Nguyên nhân bẩn thỉu bạn trộn các định nghĩa bộ đệm với các định nghĩa repl. Tôi nghĩ câu trả lời của Marczyk là câu trả lời đúng.

+0

Cũng trong ns là "Right Way" để chuyển đổi không gian tên, không phải ns. ns là nghĩa vụ phải được gọi chỉ một lần để thiết lập không gian tên với tất cả các yêu cầu của nó, sử dụng và nhập khẩu. Khi điều này được thực hiện, in-ns được sử dụng để chuyển đổi không gian tên. – kotarak

+0

bạn là đúng, tôi bỏ lỡ các in-ns, phù hợp hơn cho repl – jneira

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