【问题标题】:Can reader tags be used with ClojureScript阅读器标签可以与 ClojureScript 一起使用吗
【发布时间】:2015-07-15 12:32:31
【问题描述】:

在 Clojure 中,添加自定义阅读器标签非常简单

;; data_readers.clj (on classpath, eg. src/clj/)
{rd/qux datareaders.reader/my-reader}

;; Define a namespace containing the my-reader var:
(ns datareaders.reader)
(defn my-reader [x] 'y)

;; use special tag in other namespace. Readers have to be required first.

(require 'datareaders.reader)
(defn foo [x y] 
  (println #rd/qux x "prints y, not x due to reader tag."))

我正在尝试为 ClojureScript 实现相同的目标,但收到一个错误,即 #rd/qux 未定义。我正在使用lein cljsbuild once 来构建项目。这是 ClojureScript 的限制还是 cljsbuild 在读者解决之前构建了项目?在这种情况下,如何强制 leiningen 在启动 cljsbuild 之前加载 reader 命名空间?

编辑:请注意,此示例打算在 ClojureScript 源代码中使用阅读器标签,而不是在通过 read-string 读取辅助数据时使用。

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    目前这是不可能的,但会在 #CLJS-1194#CLJS-1277 修复后尽快实现。希望这会很快发生。

    如果您想这样做,只需将 data_readers.clj 重命名为 data_readers.cljc 并使用条件读取器。

    顺便说一句,你的用例是什么?

    #CLJS-1194#CLJS-1277 都是固定的,所以这应该可以按预期工作。

    【讨论】:

    • 我打算编写一个宏来以特定方式处理标签。本质上是为了删除我在使用 ClojureScript/reagent 开发时的一些样板。我尝试通过 edn 对一些组件进行建模,并成功使用自定义标签使其更具可读性。由于某些组件来自 edn,而其他组件来自源代码,我认为在这两个地方使用相同的语法可能会很有用。然而,仅仅使用一个普通的宏不是问题,它只是不太对称。
    • 对我来说一个实际的例子是 i18n: ;;重新框架我需要写这个。 (defn component [] (let [text (subscribe [:i18n :key])] (fn [] [:div {} @text])));;但我想写这个(x/defn component [] [:div {} #i18n :key]) 向量[:div {} #:i18n :key] 可以作为纯数据存储在某个地方,也可以在渲染函数中使用。
    【解决方案2】:

    在 cljs 中添加自定义阅读器标签的机制不同。你必须打电话给register-tag-parser!,它需要一个标签和一个fn。

    来自cljs reader tests

    (testing "Testing tag parsers"
        (reader/register-tag-parser! 'foo identity)
        (is (= [1 2] (reader/read-string "#foo [1 2]")))
    

    你的例子是:

    (cljs.reader/register-tag-parser! 'rd/qux (fn [x] 'y))
    (defn foo [x y] 
      (println #rd/qux x "prints y, not x due to reader tag."))
    

    【讨论】:

    • 我认为register-tag-parserread-string结合使用。处理源代码时,这似乎没有效果,我仍然得到同样的错误。
    • 嗯,你是对的,register-tag-parser! 不适用于编译器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2011-08-20
    相关资源
    最近更新 更多