在clojure中定义我自己的阅读器宏

szy*_*ski 8 clojure clojurescript

我想在clojure中定义自己的阅读器宏:

(read-string "ßfoo")
=> (some_func :foo)
Run Code Online (Sandbox Code Playgroud)

可能吗?

Leo*_*hin 10

可以通过在data_readers.clj类路径顶部放置读取器映射来创建标记文字.

这必须位于data_readers.clj类路径的顶部(通常是src目录).

{ß reader-demo.core/read-fn}
Run Code Online (Sandbox Code Playgroud)

这进入了reader-demo.core

(defn some-func
  [arg]
  (str "some-func invoked with " arg))

(defn read-fn
  [arg]
  (-> arg
      keyword
      some-func))
Run Code Online (Sandbox Code Playgroud)

调用

#ß foo
Run Code Online (Sandbox Code Playgroud)

将返回

"some-func invoked with :foo"
Run Code Online (Sandbox Code Playgroud)

这里描述了这种技术:读者:标记文字

请注意,在实践中,您应该对标记的文字进行命名,因为所有非命名空间的文本都是为Clojure本身保留的.