Nó không phải là một ý tưởng tồi, nó là một trong những thuộc tính chính của lisp, code là dữ liệu. bạn có thể đọc tệp clj dưới dạng danh sách bằng cách sử dụng chuỗi sửa đổi và ghi lại.
(ns tmp
(:require [clojure.zip :as zip])
(:use clojure.contrib.pprint))
(def some-var true)
;;stolen from http://nakkaya.com/2011/06/29/ferret-an-experimental-clojure-compiler/
(defn morph-form [tree pred f]
(loop [loc (zip/seq-zip tree)]
(if (zip/end? loc)
(zip/root loc)
(recur
(zip/next
(if (pred (zip/node loc))
(zip/replace loc (f (zip/node loc)))
loc))))))
(let [morphed (morph-form (read-string (str \((slurp "test.clj")\)))
#(or (= 'true %)
(= 'false %))
(fn [v] (if (= 'true v)
'false
'true)))]
(spit "test.clj"
(with-out-str
(doseq [f morphed]
(pprint f)))))
Điều này tự đọc và chuyển đổi giá trị boolean và ghi lại.
Nguồn
2011-08-17 18:45:22
Đó không phải là một ý tưởng tồi chút nào. Nó có thể được sử dụng cho những thứ như phân tích mã và rfactoring. – ivant