首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何让Clojure maro在没有替换的情况下输出原始代码?

我如何让Clojure maro在没有替换的情况下输出原始代码?
EN

Stack Overflow用户
提问于 2022-12-02 06:28:35
回答 1查看 49关注 0票数 0

有宏。这个宏很方便,因为它允许您查看执行Clojure脚本的结果。但它经常给出一个不适合我的结果。我用Babashka来运行脚本。

代码语言:javascript
复制
(defn symbol-several
  "returns a symbol with the concatenation of the str values of the args"
  [& x]
  (symbol (apply str x)))

(defmacro ! [& forms]
  (cons
   `symbol-several
   (for [form forms]
     `(str '~form " ;-> " ~form "\n"))))

,产出如下:

代码语言:javascript
复制
c:\clj>bb "~@.clj"
(do (def v [3 4]) (def l (quote (1 2))) (clojure.core/sequence (clojure.core/seq (clojure.core/concat (clojure.core/list 0) l v)))) ;-> (0 1 2 3 4)

~@.clj文件包含宏"!“守则如下:

代码语言:javascript
复制
"(! (do (def v [3 4]) (def l '(1 2)) `(0 ~@l ~@v)))" 

如何重写宏以使其输出原始代码,即如下所示:

代码语言:javascript
复制
(do (def v [3 4]) (def l '(1 2)) `(0 ~@l ~@v))) ;-> (0 1 2 3 4)

此外,宏输出的不是结果(列表),而是LazySeq:

代码语言:javascript
复制
c:\clj>bb map.clj 
(apply map vector [[1 2] [3 4]]) ;-> clojure.lang.LazySeq@8041

我使用Babashka (bb.exe)运行脚本。map.clj文件包含宏"!“守则如下:

代码语言:javascript
复制
(apply map vector [[1 2] [3 4]])
EN

回答 1

Stack Overflow用户

发布于 2022-12-02 08:23:11

使用pr-str有助于正确地打印Clojure数据结构。

代码语言:javascript
复制
(defn symbol-several
  "returns a symbol with the concatenation of the str values of the args"
  [& x]
  (symbol (apply str x)))

(defmacro ! [& forms]
  `(symbol-several
    ~@(for [form forms]
        `(str '~form " ;-> " (pr-str ~form) "\n"))))

(! (apply map vector [[1 2] [3 4]]))

;; => (apply map vector [[1 2] [3 4]]) ;-> ([1 3] [2 4])

还请参见https://clojuredocs.org/clojure.core/pr-str

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74651694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档