9

2つの質問があります。まず、次のコードをコンパイルするために何をする必要がありますか?また、マクロから取得できないことを示す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(私のleinプロジェクトrepl-testの上部にあります)

{
 ?= 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)`")))

サンプルコードはここから来ました。

ありがとう。

4

1 に答える 1

9

リーダーリテラルを使用すると、独自の種類のリテラルを作成できます。のようなもの:

(< #meter 2 #inch 5)
(mass #molecule "H2O")

通常のマクロとは異なり、リーダーリテラルはリーダーによって処理されます。したがって、コードだけでなく、s式ベースのデータファイルでそれらを使用できます。

data_readers.cljクラスパスのルートにある必要があるリテラルが一覧表示されます。それはsrcleinプロジェクトのディレクトリにあります。

于 2012-08-19T06:51:40.337 に答える