CsvHelper ничего не записывает в поток памяти

Вы можете использовать макрос clojure.repl/source, чтобы получить источник символа:

user> (source max)
(defn max
  "Returns the greatest of the nums."
  {:added "1.0"
   :inline-arities >1?
   :inline (nary-inline 'max)}
  ([x] x)
  ([x y] (. clojure.lang.Numbers (max x y)))
  ([x y & more]
   (reduce1 max (max x y) more)))
nil

Но это только часть ответа. AFAICT source ищет исходное имя файла и номер строки, которые определяют данный символ, а затем печатает исходный код из файла. Поэтому source не будет работать с символами, для которых у вас нет источника, то есть с кодом компиляции AOT.

Возвращаясь к исходному вопросу, вы можете думать о source как о чтении метаданных, связанных с данным символом, и просто распечатать их. То есть это обман. Это никоим образом не возвращает вам «код как данные», где с кодом я имею в виду скомпилированную функцию clojure.

На мой взгляд, «код как данные» относится к функции lisps, где исходный код эффективен структуру данных lisp, и, следовательно, ее можно прочитать считывающим устройством. То есть я могу создать структуру данных, которая является допустимым кодом lisp, и eval, что.

Например:

user=> (eval '(+ 1 1))
2

Здесь '(+ 1 1) - литеральный список, который читается читателем clojure, а затем оценивается как код clure.

Обновление: Yehonathan Sharvit спрашивал в одном из комментариев, если можно изменить код для функции. Следующий фрагмент читает в источнике для функции, изменяет результирующую структуру данных и, наконец, оценивает структуру данных, в результате чего определяется my-nth новая функция:

(eval
 (let [src (read-string (str (source-fn 'clojure.core/nth) "\n"))]
   `(~(first src) my-nth ~@(nnext src))))

syntax-quote строка заменяет nth на my-nth в форме defn.

34
задан Erik Schierboom 21 June 2013 в 15:10
поделиться