2010-08-28 28 views
11

Có printf. Nó in trực tiếp đến stdout.Clojure sprintf?

Làm thế nào về sprintf, định dạng giống như printf, nhưng trả về một chuỗi không có tác dụng phụ?

Trả lời

15

Trong Clojure, nó được gọi là format và nằm trong clojure.core: printf tương đương với (comp print format).

9

Bạn nên kiểm tra cl-format, trong thư viện clojure.pprint. Đó là một cổng chức năng FORMAT của Common Lisp. Nó có thể làm những việc mà Java printf không thể làm, như điều kiện, lặp lại trên seqs, v.v.

Để trả lời câu hỏi của bạn, với cl-format, đối số đầu tiên của nil sẽ trả về một chuỗi; đối số đầu tiên của true sẽ in thành STDOUT.

user> (cl-format nil "~{~R~^, ~}" [1 2 3 4]) 
"one, two, three, four" 

Lưu ý rằng nếu format đã chưa tồn tại trong Clojure, bạn cũng có thể nắm bắt đầu ra từ Clojure của printf như thế này:

user> (with-out-str (printf "%s" :foo)) 
":foo" 

with-out-str là hữu ích khi một thư viện chỉ cung cấp một chức năng mà bản in để STDOUT và bạn muốn nắm bắt đầu ra thay thế. Tôi đã chạy trên các thư viện Java làm điều này.

+0

những libs java sẽ không ghi vào clojure của \ * ra \ *, đúng không? Bạn sẽ cần chiếm đoạt System/setOut bằng PrintWriter sử dụng var. – gtrak

5

Xem xét sử dụng với-ra-str vĩ mô:

(with-out-str 
    (print x)) 

Hoặc chỉ cần gọi phương thức định dạng java.lang.String của:

(String/format "%d" 3)