Tôi có một chuỗi chứa biểu mẫu Clojure hợp lệ. Tôi muốn thay thế một phần của nó, giống như với assoc-in
, nhưng xử lý toàn bộ chuỗi như mã thông báo.Thay thế chuỗi con nhận biết cú pháp
=> (assoc-in [:a [:b :c]] [1 0] :new)
[:a [:new :c]]
=> (assoc-in [:a
[:b,, :c]] [1 0] :new)
[:a [:new :c]]
=> (string-assoc-in "[:a
[:b,, :c]]" [1 0] ":new")
"[:a
[:new,, :c]]"
Tôi muốn viết string-assoc-in
. Lưu ý rằng đối số đầu tiên và cuối cùng của nó là các chuỗi, và nó giữ ngắt dòng và dấu phẩy. Nó có thể làm được trong Clojure không? Điều gần nhất tôi tìm thấy là read
gọi clojure.lang.LispReader
, nhưng tôi không biết cách hoạt động.
Tôi muốn sử dụng nó để đọc tệp nguồn Clojure và hiển thị nó với một số sửa đổi, giữ cấu trúc của tệp.
Tôi không thể nghĩ ra cách nào để làm điều này một cách đáng tin cậy mà không cần viết Reader của riêng bạn. –
Âm thanh giống như một defmacro để * me * –
@Paul Nathan: Trên thực tế, một macro Lisp có các thao tác xử lý chuỗi giống nhau theo ý của nó như là một hàm bình thường. "Toàn bộ ngôn ngữ luôn luôn có", như Paul Graham đặt nó. :-) –