Clojure的1.4读者文字有什么优势,为什么不编译?

oct*_*bus 7 clojure

我有两个问题.首先,我需要做些什么来获得以下代码进行编译,以及Clojure 1.4读者文字是什么让我无法从宏中获取?

我理解我用本地data_readers.clj文件覆盖了阅读器,但是在哪里可以比我在Clojure 1.4发行说明中更详细地阅读这些阅读器文字呢?

这是编译错误的代码.

java.lang.RuntimeException: No reader function for tag ?=, 
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

data_readers.clj(位于我的lein项目repl-test的顶部)

{
 ?= repl-test.core/debug-print
 str repl-test.core/expand-sexp
}
Run Code Online (Sandbox Code Playgroud)

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)`")))
Run Code Online (Sandbox Code Playgroud)

示例代码来自这里.

谢谢.

Ale*_*min 8

读者文字可以让你创建自己的文字.像:

(< #meter 2 #inch 5)
(mass #molecule "H2O")
Run Code Online (Sandbox Code Playgroud)

与常规宏不同,读者文字由读者处理.因此,您可以在基于s表达式的数据文件中使用它们,而不仅仅是代码.

列出的文字data_readers.clj必须位于类路径的根目录中.那是在srclein项目的目录中.

  • 不合格的文字标签是为Clojure保留的.您应该使用#foo.bar/meter之类的命名空间标记. (4认同)