2011-08-22 16 views
6

Tôi đang sử dụng không có đường để chụp một số dữ liệu được in thành giá trị chuẩn. Vấn đề là với-out-str dường như vứt bỏ giá trị trả về từ chức năng của tôi. Có cách nào tôi có thể nắm bắt cả hai? Tôi cũng muốn có bánh và ăn nó.Chụp giá trị trả lại "ban đầu" từ với-out-str

Ví dụ:

(with-out-str (do (prn "test") (+ 1 1))) 
+0

Giá trị trả lại nào bạn đang đề cập đến? '2' trả về từ việc đánh giá' (+ 1 1) '? – seh

Trả lời

8

bắt chước các định nghĩa của các thư viện lõi của with-out-str vĩ mô, bạn có thể xác định một tương tự như thế này:

(defmacro with-out-str-and-value 
    [& body] 
    `(let [s# (new java.io.StringWriter)] 
    (binding [*out* s#] 
     (let [v# [email protected]] 
     (vector (str s#) 
       v#))))) 

Without the values function from Common Lisp và nó multiple function return values, ở đây chúng tôi quay trở lại một vector thay thế; mục đầu tiên là văn bản được thu thập từ đầu ra tiêu chuẩn và mục thứ hai là giá trị được trả về bằng cách đánh giá biểu mẫu cơ thể.

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