小编noz*_*iar的帖子

如何检查 Clojure 代码是否在 REPL 中被评估?

我想根据我的代码是从 REPL 运行还是运行编译后的 jar 来以不同的方式格式化我的日志。

有没有简单的方法可以做到这一点?我在想也许 Leiningen 在运行 REPL 时会在某处留下痕迹。

clojure leiningen

6
推荐指数
1
解决办法
307
查看次数

Clojure宏生成的代码中的反射警告

我不明白为什么以下代码产生反射警告:

(set! *warn-on-reflection* true)

(defmacro my-macro [k] `(.length ~(with-meta k {:tag String})))

(defn my-fun1 [k] (my-macro k))
;; Reflection warning, /tmp/form-init2370243866132870536.clj:1:18 - reference to field length can't be resolved.
Run Code Online (Sandbox Code Playgroud)

使用macroexpand-1显示生成的代码确实具有typehint,如果我在不使用宏的情况下手动编写相同的代码,则没有反射警告:

(set! *print-meta* true)

(macroexpand-1 '(my-macro k))
;; (.length ^java.lang.String k)

(defn my-fun2 [k] (.length ^String k))
;; All good, no reflection warning
Run Code Online (Sandbox Code Playgroud)

对函数进行基准测试表明警告不仅仅是一个红色的鲱鱼,反射实际上发生在运行时:

(time (reduce + (map my-fun1 (repeat 1000000 "test"))))
;; "Elapsed time: 3080.252792 msecs"

(time (reduce + (map my-fun2 (repeat 1000000 "test"))))
;; "Elapsed time: 275.204877 …
Run Code Online (Sandbox Code Playgroud)

macros clojure

5
推荐指数
1
解决办法
148
查看次数

在 Clojure 宏中访问参数的元数据

有没有办法在不使用 的情况下检索 clojure 宏内参数的元数据eval?到目前为止我唯一能想到的是:

(def ^{:a :b} my-var)

(defmacro my-macro [s] (prn (eval `(meta (var ~s)))))

(my-macro my-var)
;; Prints {:a :b, :name my-var, ...}
Run Code Online (Sandbox Code Playgroud)

macros clojure

3
推荐指数
1
解决办法
185
查看次数

标签 统计

clojure ×3

macros ×2

leiningen ×1