2010-05-18 78 views
11

Khi tôi muốn đọc trong một S-biểu hiện lưu trữ trong một tập tin vào một chương trình Common Lisp chạy, tôi thực hiện như sau:Clojure: Tương đương với chức năng Common Lisp READ?

(defun load-file (filename) 
    "Loads data corresponding to a s-expression in file with name FILENAME." 
    (with-open-file (stream filename) 
    (read stream))) 

Nếu, ví dụ, tôi có một tập tin có tên foo.txt chứa S -Thông báo (1 2 3), hàm trên sẽ trả về biểu thức S nếu được gọi như sau: (load-file "foo.txt").

Tôi đã tìm kiếm và tìm kiếm và không tìm thấy giải pháp thanh lịch như nhau ở Clojure. Bất kỳ ý tưởng?

Cảm ơn!

Trả lời

8

Bạn có thể thực hiện ví dụ:

(require '[clojure.contrib.io :as io]) 

(io/with-in-reader (io/file "foo.txt") (read)) 
; => (1 2 3) 

Lưu ý rằng bạn có thể muốn rebind *read-eval* đến false trước tiên. Cũng lưu ý rằng các công trình trên với HEAD contrib hiện tại (và gần như chắc chắn sẽ làm việc trong 1,2 khi nó được phát hành); cho Clojure 1.1, chức năng tương tự có sẵn trong các không gian tên clojure.contrib.duck-streamsclojure.contrib.java-utils.

+0

Hi, lợi thế, nếu có, của phương pháp này trên (đọc chuỗi là gì (Slurp "foo.txt")) – jkndrkn

+2

'slurp' /' io/slurp * 'slurp toàn bộ nội dung của tệp trong, mặc dù' read-string' sẽ chỉ đọc một dạng nguyên bản và loại bỏ phần còn lại. Cách tiếp cận 'with-in-reader' sẽ chỉ đọc một chút qua form đầu tiên (do đệm). Ngoài ra, bạn có thể có nhiều biểu mẫu hơn trong phần nội dung 'with-in-reader'; đặc biệt, các lời gọi tiếp theo của 'read' trong cùng một biểu mẫu' with-in-reader' sẽ trả về các biểu mẫu khác từ tệp. (Hãy thử sử dụng '[(đọc) (đọc)] 'làm cơ thể để có được hai dạng ban đầu.) Tôi đã đăng câu trả lời của bạn bên cạnh câu trả lời này mà tôi đã nghĩ về nó. :-) –

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