gpt4 book ai didi

Clojure + Clojurescript : Macro to read code of current file

转载 作者:行者123 更新时间:2023-12-02 00:50:42 25 4
gpt4 key购买 nike

我已经尝试过的

(defmacro magic []
(slurp *file*))

这在 clojure 中工作正常,但在 clojurescript 中不行(至少不能用 lein figwheel)。

原始问题

我需要以下内容才能在 Clojure 和 Clojurescript 中工作。我认为宏是正确的解决方案,但我对其他技术持开放态度。

我想要一种将当前 文件作为字符串读取的方法。例如,

(ns my-test
(:require blah))

(def foo 20)

(println (blah/magic))

这应该会导致(被打印出来)

(ns my-test
(:require blah))

(def foo 20)

(println (blah/magic))

如果我只需要它在 Clojure 中工作,我可以对当前文件做一些有趣的事情并在运行时读取它。但是,我也需要它在 Clojurescript 中工作(并且我不想设置一些 REST API 来服务 *.cljs 文件)——因此,有没有办法在编译时通过一些宏来做到这一点?

澄清

假设您想写一个“作弊的 quine”——您会怎么做?可能类似于 (println (slurp *file*))。现在,问题是什么?在 lein figwheel 下运行时,这在 clojurescript 中不起作用。

最佳答案

您需要像这样的 Reader 条件句:

(defn build-list []
(list #?@(:clj [5 6 7 8]
:cljs [1 2 3 4])))

请在此处查看文档:

http://clojure.org/guides/reader_conditionals

https://github.com/clojure/clojurescript/wiki/Using-cljc

更新 1

如果你想修改当前正在执行的源代码,你总是可以构造一个字符串并使用eval:

(eval (read-string "(defn darth [] (println \"I have the ultimate power now...\" ))" ))

(darth)
;=> I have the ultimate power now...

但是,由于 ClojureScript 是经过编译的,所以我不认为有任何简单的方法可以找到原始源代码,如果那是您想要的。

更新 2

这是一个有趣的问题。我最接近的是这样的:

(ns clj.core)

(defmacro fred [& forms]
(doseq [f forms]
(println `~f)))

(fred
(+ 1 2)
(* 2 3)
)

(defn -main [& args])

结果:

> lein run    
(+ 1 2)
(* 2 3)

关于Clojure + Clojurescript : Macro to read code of current file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40229721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com