2010-06-06 37 views
28

Tôi đang phát triển một dự án thú cưng với Clojure, nhưng tự hỏi liệu tôi có thể tăng tốc độ công việc của mình một chút không.Luồng công việc Clojure hiệu quả?

công việc hiện tại của tôi (với Compojure) là:

  1. Bắt đầu Swank với lein swank.
  2. Đi tới Emacs, kết nối với M-x slime-connect.
  3. Tải tất cả các tệp nguồn hiện tại một. Điều này cũng bắt đầu một máy chủ Jetty và một ứng dụng.
  4. Viết một số mã trong REPL.
  5. Khi hài lòng với thử nghiệm, hãy viết một phiên bản đầy đủ của cấu trúc mà tôi đã lưu ý. Đánh giá (C-c C-c).
  6. Chuyển REPL thành không gian tên nơi cấu trúc này nằm và kiểm tra nó.
  7. Chuyển sang trình duyệt và tải lại tab trình duyệt với trang bị ảnh hưởng.
  8. Tinh chỉnh mã, đánh giá, kiểm tra trong trình duyệt.
  9. Lặp lại bất kỳ điều nào ở trên.

Có một số phiền toái với nó:

  1. tôi phải chuyển qua lại giữa Emacs và trình duyệt (hoặc các trình duyệt nếu tôi đang thử nghiệm những thứ như khuôn mẫu với nhiều trình duyệt) tất cả các thời gian. Có một thành ngữ phổ biến để tự động hóa điều này? Tôi đã từng có một chút JavaScript tải lại trang liên tục, nhưng đó là tiện ích hạn chế, rõ ràng là khi tôi phải tương tác với trang trong hơn một vài giây.
  2. Ví dụ JVM của tôi trở thành "bẩn" khi tôi thử nghiệm và viết các chức năng kiểm tra. Về cơ bản, không gian tên trở nên bị ô nhiễm, đặc biệt nếu tôi đang tái cấu trúc và di chuyển các chức năng giữa các không gian tên. Điều này có thể dẫn đến va chạm biểu tượng và tôi cần phải khởi động lại Swank. Tôi có thể hoàn tác một biểu tượng không?
  3. Tôi tải tất cả các tệp nguồn từng cái một (C-c C-k) khi khởi động lại Swank. Tôi nghi ngờ tôi làm tất cả sai.
  4. Chuyển đổi giữa REPL và trình chỉnh sửa tệp có thể hơi khó chịu, đặc biệt khi tôi có nhiều tab Emacs mở cùng với (các) trình duyệt.

Tôi đang tìm cách cải thiện các điểm trên và toàn bộ quy trình làm việc nói chung, vì vậy tôi đánh giá cao nếu bạn chia sẻ công việc của mình.

P. S.

Tôi cũng đã sử dụng Vimclojure trước, vì vậy công việc Vimclojure-based được hoan nghênh quá.

Trả lời

19

Không phải là một mô tả công việc hoàn tất, chỉ là một vài ý tưởng:

  1. Nó có thể loại bỏ một Var từ một không gian tên với ns-unmap chức năng. Để thuận tiện hơn, một macro undef có thể được xây dựng trên đầu trang, ví dụ: như vậy:

    (defmacro undef [& syms] 
        `(do [email protected](map (fn [s] `(ns-unmap *ns* '~s)) syms))) 
    

    ns-unalias cũng có thể được quan tâm.

  2. Không có lý do gì để xem các tệp không gian tên chỉ để làm C-c C-k trong mỗi tệp; bạn chỉ có thể require các không gian tên bạn cần tại REPL.

    Hơn nữa, nếu bạn gõ một vài ký tự tại SLIME REPL và sau đó sử dụng M-p/M-n để duyệt lịch sử, chỉ có các mục phù hợp với các bit ban đầu của văn bản bạn nhập bằng tay sẽ được hiển thị. Điều này tương thích với Paredit ((các) khung đóng ngoặc đơn sẽ không là vấn đề). Vì vậy, nếu bạn xây dựng một yêu cầu lớn ngay từ đầu - (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) - sau đó sau khi khởi động lại Swank, tất cả những gì bạn cần làm là nhập một cái gì đó như (require '[f và nhấn M-p để đưa biểu mẫu đó đến lời nhắc REPL lần nữa. Phải thừa nhận rằng điều này có thể được tự động hóa theo một số cách (ví dụ như tìm kiếm Swift REPL cho tệp cấu hình hoặc có lẽ macro đơn giản mở rộng thành dạng require thích hợp có thể được sử dụng sau khi chỉ mang một không gian tên tiện ích từ dự án - đặc biệt là ý tưởng thứ hai sẽ dễ thực hiện), nhưng tôi thấy nó đủ thấp trên yếu tố phiền toái mà tôi chưa từng làm phiền với bất kỳ cải tiến nào.

  3. Bạn có thể sử dụng C-c C-z để tạo cửa sổ bằng SLIME REPL bật lên trong khi bạn đang ở trong bộ đệm hỗ trợ SLIME. Ngoài ra, bạn nên thử sử dụng ido nếu bạn chưa sử dụng. Tôi có xu hướng làm việc với một bộ đệm mã mở trong một cửa sổ ở phía bên trái của màn hình và một bộ đệm REPL ở bên phải; với windmove-leftwindmove-right ràng buộc với một số phím tiện lợi, tôi có xu hướng khá hạnh phúc. Nếu tôi cần phải nhìn vào bộ đệm bổ sung thường xuyên, tôi sử dụng thêm khung Emacs.

  4. Ngẫu nhiên, tôi không sử dụng lein swank bình thường, tôi thích chức năng tùy chỉnh clojure-project của tôi (phiên bản tinh chỉnh của bản gốc Phil Hagelberg). Thỉnh thoảng, tôi cảm thấy mong muốn cải thiện nó ... có lẽ tôi sẽ đối phó với mỗi dự án import/require tự động hóa lần tới xảy ra. ;-)

5

Tôi không chắc chắn về Lein, nhưng trong Maven bạn có thể chỉ định tên của kịch bản repl (replScript cấu hình param), cho phép để xác định các lệnh sẽ được thực hiện vào đầu REPL & Swank ... Và nếu bạn có không gian tên riêng cho dự án của mình, bạn có thể sử dụng các chức năng từ clojure.contrib.find-namespaces để tìm các không gian tên của bạn và tải tất cả chúng ...

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