2011-07-13 44 views
5

Đọc API clojure để nhập Tôi thấy rằng: nhập macro ns được ưu tiên nhập, tuy nhiên khi tôi đang mã hóa bằng swank/slime/emacs, tôi không thể cx ce (ns ..) s-biểu hiện để có được deps vào repl, nhưng sử dụng (import ...) tôi có thể.Nhập khẩu Clojure so với: nhập

Lý do tại sao: nhập được ưu tiên hơn nhập và có cách nhanh chóng để nhập dep từ một (ns ...) s-expr từ tệp .clj của tôi sang repl không? (Câu hỏi tương tự có thể được khái quát hóa để: sử dụng và: tham khảo .. cảm ơn)

Trả lời

5

Đây là công việc ưa thích của tôi:

  • Bắt đầu Swank/Slime
  • mở file tôi muốn làm việc trên trong Emacs
  • Đừng Cc Ck để biên dịch và tải các tập tin trong câu hỏi
  • Làm , theo sau là i, sau đó nhập tên của không gian tên bạn đang làm việc và nhấn Nhập

Bây giờ Slime REPL của bạn phải ở trong không gian tên bạn đang làm việc trên, và bạn có thể thêm vào tờ khai ns ở phía trên và chỉ Cc Ck khi bạn thay đổi mọi thứ (bao gồm ns nhập khẩu của bạn).

+0

Điểm bullet cuối cùng của bạn không rõ ràng đối với tôi. Bạn đang nhấn ',' bên trong tệp bạn đang làm việc? Nó sẽ không đơn giản chỉ cần chèn một dấu phẩy và một 'i'? – ftravers

+0

Khi con trỏ của bạn nằm trong bộ đệm Slime REPL, trước khi gõ bất cứ điều gì khác vào dấu nhắc của bạn, hãy nhập một ','. Điều này sẽ làm cho văn bản 'Command:' xuất hiện trong bộ đệm mini. Bây giờ ngay lập tức gõ 'i', và bạn sẽ thấy văn bản' Package: 'xuất hiện trong bộ đệm mini. Bây giờ bắt đầu gõ tên của gói của bạn, sử dụng tab-hoàn thành như mong muốn, cho đến khi tên đầy đủ của không gian tên của bạn nằm trong bộ đệm mini. Nhấn 'ENTER' và Slime REPL của bạn bây giờ sẽ nằm trong vùng tên đích của bạn. – semperos

2

Tôi không chắc chắn tại sao cx ce không hoạt động, nhưng Cc Cc trên biểu thức ns hoạt động chính xác miễn là không gian tên đã tồn tại .

1

: nhập trong khai báo ns được ưa thích vì nó giữ mọi thứ để làm với không gian tên ở một nơi, thường ở đầu tệp. Đây là thực hành mã hóa tốt.

Tôi tin rằng lý do đánh giá tuyên bố ns C-x C-e không hoạt động là một phần của cách thức hoạt động của SLIME. Khi bạn đánh giá một sexp, SLIME thực hiện nó trong không gian tên hiện tại. Vì vậy, việc đánh giá (import 'java.io.File) sẽ nhập Tệp vào bất kỳ không gian tên nào là ns vào lúc này.

đánh giá tuyên bố (ns my.namespace (: import java.io.File) sửa đổi không gian tên được chỉ ra trong khai báo, nhưng nó không thay đổi giá trị ns trừ khi bạn thay đổi không gian tên đó bằng (in- ns 'my.namespace), bạn sẽ không thấy hình thức nhập

2

Biểu mẫu (ns ...) được ưu tiên vì mã của bạn sẽ dễ đọc hơn. Tất cả các khai báo không gian tên sẽ được thu thập ở đầu tệp. xem điều này được thực thi bởi trình biên dịch bằng các ngôn ngữ như Java. Ngoài ra, các macro có chứa macro sẽ loại bỏ sự cần thiết cho bạn để trích dẫn các ký hiệu.Điều này có thể được sử dụng, nhập, tham chiếu, v.v.

Tôi nghĩ rằng C-x C-e slime short-cut sẽ gửi đoạn mã đến máy chủ swank được kết nối và được đánh giá. Ví dụ: biểu mẫu:

(ns my.test 
    (:require [clojure.contrib.logging :as log]) 
    (:import [java.io File])) 

sẽ tạo một không gian tên mới có tên my.test bao gồm ghi nhật ký và tệp java.io. Nó sẽ không thay đổi không gian tên của repl. Để thực hiện điều đó, hãy nhấn C-c M-p từ tệp bạn đang chỉnh sửa và bạn sẽ được nhắc với tên của không gian tên của tệp đó để chuyển sang (trừ khi bạn đã ở trong không gian tên đó). Nhấn enter để chọn.C-c C-z nên chuyển sang chế độ repl. Bây giờ thay vì lời nhắc user=>, bạn sẽ thấy my.test=>, cho biết rằng bạn đang ở trong không gian tên đó.

Các quy trình làm việc tôi đã thiết lập là để biên dịch toàn bộ tập tin trên tiết kiệm, sử dụng:

(defun ed/clojure-compile-on-save (&optional args) 
    "Compile with slime on save" 
    (interactive) 
    (if (and (eq major-mode 'clojure-mode) 
     (slime-connected-p)) 
     (slime-compile-and-load-file))) 
(add-hook 'after-save-hook 'ed/clojure-compile-on-save) 

Bằng cách đó, khi bao giờ tôi lưu các tập tin, nó được biên soạn và nạp bởi máy chủ phô trương, và Tôi sử dụng repl cho các thí nghiệm trong không gian tên mà tôi đang làm việc.

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