Можно также использовать
IPAddress.NetworkToHostOrder(...)
, Если коротко, интервал или долго.
Consider (+ 1 2)
. As data, it's a linked list of three items: the Symbol +
and two Integers. As code, it's a function call, saying "Call the function called +
with these two Integers as arguments and give me the result". You can do anything to this list that you can do to any other list of data. You can also eval
it to get a result.
user> (def x '(+ 1 2))
#'user/x
user> (first x)
+
user> (rest x)
(1 2)
user> (map class x)
(clojure.lang.Symbol java.lang.Integer java.lang.Integer)
user> (reverse x)
(2 1 +)
user> (concat x (rest x))
(+ 1 2 1 2)
user> (eval x)
3
user> (defn foo []
(let [ops '[+ - * /] ; SO's lisp-highlighting sucks
nums (repeatedly #(rand-int 5))
expr (list* (rand-elt ops) (take 10 nums))]
(prn expr)
(prn (eval expr))))
user> (foo)
(+ 4 1 0 3 2 3 4 3 1 2)
23
nil
user> (foo)
(- 1 3 2 2 1 2 1 4 0 1)
-15
nil
Clojure - это LISP, а это означает, что это гомоиконный язык: нет структурных различий между данными и кодом. Его списки до конца. Он также имеет расширяемый компилятор, который позволяет расширять синтаксис с помощью макросов. Но из постановки задачи не ясно, что вам действительно нужна такая вещь.
Вы в основном запускаете код, который генерирует списки (которые на самом деле являются программами следующего поколения), сохраняет их, а затем запускает новые программы. Если ваша эволюция поколений не потребует нового синтаксиса, вам, вероятно, не придется прибегать к макросам.
Вопрос несколько вводит в заблуждение, поскольку Clojure также выполняет "генерацию кода" на лету, когда компилирует исходный код Clojure в байтовый код Java.
В этом конкретном случае I полагаю , что вас особенно интересуют макросы Лиспа. Я думаю, это может быть интересно:
Видео, макросы (в Clojure) за 20 минут
Стандартная проблема: Википедия - Clojure
Обратите внимание, что макросы в Clojure очень похожи в макросы Common Lisp (Lisp типа 2), и не совсем похожи на макросы Scheme.
Удачного кодирования.
Взгляните на макросы. Например,
(defmacro defmacro-
"Same as defmacro but yields a private definition"
[name & decls]
(list* `defmacro (with-meta name (assoc (meta name) :private true)) decls))
С макросами вам не нужно сериализовать макрорасширение; компиляция будет использовать его автоматически.
Нашел частичный ответ в этой статье:
Функции
pr
иprn
похожи на их печатные и печатные копии, но их результат находится в форме, которая может быть прочитанным читателем Clojure. Oни подходят для сериализации Clojure структуры данных. По умолчанию они делают не печатать метаданные. Это может быть изменено привязкой специального символа* print-meta *
totrue
.
Это, по крайней мере, ответ на вторую часть моего вопроса.