У меня есть сумасшедшая идея, которая включает в себя помещение некоторого кода clojure в CouchDB и написание представлений, запрашивающих его. Я не хочу хранить код clojure в виде простого текста, потому что тогда мне придется беспокоиться о его разборе в представлениях. Форматирование и комментарии не нужно сохранять, но код должен иметь возможность входить и выходить из базы данных без изменения структуры. Ключевые слова, символы и строки должны оставаться в своем родном типе. Кроме того, я хочу, чтобы код выглядел элегантно и был эффективным.
Я думаю представить вещи следующим образом:
- Символы в виде строк, начинающиеся с '
- Ключевые слова в виде строк, начинающихся с:
- Строки не изменены, за исключением случаев, когда они начинаются с 'или: в этом случае они экранируются обратной косой чертой.
- (parens) в виде массива
- [скобки] в виде массива с "_ []" в качестве первого элемента
- отображает ({}) как объект
- устанавливает (# {}) в качестве объекта со значениями, установленными в 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