Какое преимущество имеют литералы 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.

Другие вопросы по тегам