2011-02-25 24 views
12

Trong một số loại mã nhất định, nó tương đối dễ gây ra một vòng lặp vô hạn mà không cần thổi ngăn xếp. Khi thử nghiệm mã của bản chất này bằng cách sử dụng kiểm tra clojure, có cách nào để hủy bỏ các thử nghiệm đang chạy mà không cần khởi động lại máy chủ swank không?Dừng vòng lặp vô hạn trong khi chạy thử nghiệm clojure trong emacs với leiningen và swank/slime

Hiện tại công việc của tôi đã tham gia

$ lein swank 

Connect để Swank với emacs sử dụng slime-connect, và chuyển sang các bài kiểm tra, thực hiện với C-c C-,, kiểm tra chạy cho đến khi vòng lặp vô hạn, sau đó chỉ cần quay trở lại nhưng một cpu vẫn khuấy đi thử nghiệm. Cách duy nhất để ngăn chặn điều này tôi đã tìm thấy là để khởi động lại lein swank, nhưng có vẻ như đây sẽ là một vấn đề tương đối phổ biến? Bất cứ ai có một giải pháp tốt hơn?

Trả lời

12

Vâng, đó là một vấn đề phổ biến cho các lập trình viên viết các vòng vô hạn trong phát triển :). Và câu trả lời rất đơn giản. Nó được gọi là "Lệnh ngắt" và nó là C-c C-b

Leiningen không liên quan gì đến điều này. Đây là SLIME/Swank/Clojure. Khi bạn đánh giá mã trong Emacs bạn đang sinh ra một chuỗi mới trong Clojure. SLIME giữ tham chiếu đến các chủ đề đó và cho bạn biết có bao nhiêu chuỗi đang chạy trong mô hình Emacs. Nếu bạn đang ở trong một môi trường đồ họa, bạn có thể nhấp vào mô hình nơi nó cho biết không gian tên của bạn và thấy nhiều tùy chọn. Một tùy chọn là "Lệnh ngắt"

Đánh giá (while true)C-c C-b để nhận được hộp thoại hiển thị lỗi java.lang.ThreadDeath có thể chỉ là một tùy chọn. Bạn có thể nhập 0 hoặc q để thoát khỏi chuỗi đó, xóa bộ đệm thông báo lỗi đó và trả tiêu điểm về bộ đệm trước đó của bạn.

1

Theo this old discussion, thêm (use 'clojure.contrib.repl-utils))(add-break-thread!) cho người dùng.clj sẽ cho phép bạn nhấn C-c C-c để chuyển SIGINT đến đánh giá/quá trình chạy dài.

+0

Thiết lập Emacs hiện tại của tôi liên kết 'C-c C-c' với' slime-interrupt' hoạt động như bạn mong đợi – skuro

1

nếu tất cả các lỗi khác không thành công .. alt-x slime-quit-lisp và khởi động lại REPL. trước tiên hãy thử câu trả lời của Psyllo.

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