Генерация кода в Clojure

Можно также использовать

IPAddress.NetworkToHostOrder(...)

, Если коротко, интервал или долго.

15
задан Joshua Hayworth 27 October 2009 в 00:17
поделиться

5 ответов

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
28
ответ дан 1 December 2019 в 00:50
поделиться

Clojure - это LISP, а это означает, что это гомоиконный язык: нет структурных различий между данными и кодом. Его списки до конца. Он также имеет расширяемый компилятор, который позволяет расширять синтаксис с помощью макросов. Но из постановки задачи не ясно, что вам действительно нужна такая вещь.

Вы в основном запускаете код, который генерирует списки (которые на самом деле являются программами следующего поколения), сохраняет их, а затем запускает новые программы. Если ваша эволюция поколений не потребует нового синтаксиса, вам, вероятно, не придется прибегать к макросам.

5
ответ дан 1 December 2019 в 00:50
поделиться

Вопрос несколько вводит в заблуждение, поскольку Clojure также выполняет "генерацию кода" на лету, когда компилирует исходный код Clojure в байтовый код Java.

В этом конкретном случае I полагаю , что вас особенно интересуют макросы Лиспа. Я думаю, это может быть интересно:

Сама документация Clojure

Видео, макросы (в Clojure) за 20 минут

Стандартная проблема: Википедия - Clojure

Обратите внимание, что макросы в Clojure очень похожи в макросы Common Lisp (Lisp типа 2), и не совсем похожи на макросы Scheme.

Удачного кодирования.

3
ответ дан 1 December 2019 в 00:50
поделиться

Взгляните на макросы. Например,

(defmacro defmacro-
  "Same as defmacro but yields a private definition"
  [name & decls]
  (list* `defmacro (with-meta name (assoc (meta name) :private true)) decls))

С макросами вам не нужно сериализовать макрорасширение; компиляция будет использовать его автоматически.

2
ответ дан 1 December 2019 в 00:50
поделиться

Нашел частичный ответ в этой статье:

Функции pr и prn похожи на их печатные и печатные копии, но их результат находится в форме, которая может быть прочитанным читателем Clojure. Oни подходят для сериализации Clojure структуры данных. По умолчанию они делают не печатать метаданные. Это может быть изменено привязкой специального символа * print-meta * to true .

Это, по крайней мере, ответ на вторую часть моего вопроса.

4
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: