Какое преимущество имеют литералы Clojure 1.4 для чтения, и почему не нужно скомпилировать образцы?
У меня два вопроса. Во-первых, что мне нужно сделать, чтобы компилировать следующий код, и какие литералы чтения Clojure 1.4 дают мне то, что я не могу получить из макросов?
Я понимаю, что перезаписываю программу чтения локальным файлом data_readers.clj, но где я могу прочитать подробнее об этих литералах программы чтения более подробно, чем в примечаниях к выпуску Clojure 1.4, которые я уже посетил?
Вот код, который компилируется с ошибкой.
java.lang.RuntimeException: No reader function for tag ?=,
project.clj
(defproject repl-test "0.0.1-SNAPSHOT"
:description "TODO: add summary of your project"
:dependencies [[org.clojure/clojure "1.4.0"]
[org.clojure/clojure-contrib "1.2.0"]
[clojure-csv/clojure-csv "1.3.2"]
[org.clojure/tools.cli "0.1.0"]
[util "1.0.2-SNAPSHOT"]
[clj-http "0.1.3"]]
:aot [repl-test.core]
:main repl-test.core)
data_readers.clj (находится в верхней части моего repl-теста проекта lein)
{
?= repl-test.core/debug-print
str repl-test.core/expand-sexp
}
Должен ли data_readers.clj пойти куда-нибудь еще? Если так, то где?
Соответствующие части core.clj
(ns repl-test.core
(:gen-class)
(:require [clojure.string :as str])
(:require [util.core :as utl])
(:use clojure-csv.core))
(defn debug-print
"Gauche debug print"
[x]
`(let [res# ~x]
(println "?=" res#)
res#))
(defn expand-sexp
"Expand S-exp in string"
[s]
(let [ls (map-indexed #(if (even? %) %2 (read-string %2))
(str/split s #"`"))]
`(apply str (list ~@ls))))
(defn -main
[& args]
(println (map inc #?=(range 10)))
(let [i 100]
(println #str"i = `i`")
(println #str"(+ 1 2 3) = `(+ 1 2 3)`")))
Пример кода пришел отсюда.
Благодарю.
1 ответ
Литералы Reader позволяют создавать свои собственные литералы. Вещи как:
(< #meter 2 #inch 5)
(mass #molecule "H2O")
В отличие от обычных макросов, литералы читателя обрабатываются читателем. Таким образом, вы можете использовать их в файлах данных на основе s-выражений, а не только в коде.
Литералы перечислены в data_readers.clj
который должен быть в корне вашего пути к классу. Это в src
каталог проекта lein.