У меня сумасшедшая идея, которая включает в себя вставку некоторого кода clojure в CouchDB и запись просмотров, которые его запрашивают. Я не хочу хранить код clojure как обычный текст, потому что тогда мне придется беспокоиться о разборе его в представлениях. Форматирование и комментарии не нужно сохранять, но код должен иметь возможность входить и выходить из базы данных без изменения структуры. Ключевые слова, символы и строки должны оставаться в их родном типе. Кроме того, я хочу, чтобы код выглядел элегантным и эффективным.
Я собираюсь представить вещи следующим образом:
- Символы как строки, начинающиеся с '
- Ключевые слова как строки, начинающиеся с:
- Строки немодифицированы, кроме случаев, когда они начинаются с 'или:, и в этом случае они экранируются с обратной косой чертой.
- (parens) как массив
- [скобки] как массив с "_ []" в качестве первого элемента
- maps ({}) как объект
- устанавливает (# {}) как объект со значениями, установленными в 1 и включенными "_ # {}".
Критика, опыт и идеи оценены.
Изменить. Что произойдет, если я попытаюсь прочитать и написать код JSON с помощью json-функций из clojure.contrib:
user> code
((ns bz.json.app (:use (ring.middleware file))) (defn hello [req] {:status 200, :headers {"Content-Type" "text/plain"}, :body "Hello World!"}) (def app (wrap-file hello "public")))
user> (read-json (json-str code))
[["ns" "bz.json.app" ["use" ["ring.middleware" "file"]]] ["defn" "hello" ["req"] {"body" "Hello World!", "headers" {"Content-Type" "text/plain"}, "status" 200}] ["def" "app" ["wrap-file" "hello" "public"]]]
Там справедливый бит, который нужно сделать для строки 4 выше, чтобы быть точно такой же, как строка 2. Кажется, что это проект библиотеки, если там нет функции где-то, которая делает это, о которой я не знаю.
С такой библиотекой здесь, как бы это выглядело:
user> (= (json-to-code (read-json (json-str (code-to-json code)))) code)
true