是否有可能以某种方式检测Clojure表达式是否保证是原始的?
e.g。我想要一个可以做到这一点的宏
(is-primitive-expression? (+ 1.0 2.0))
=> true
(is-primitive-expression? (+ 1N 2.0))
=> false
答案 0 :(得分:4)
我不确定我是否完全理解原始表达是什么(仍然在阅读它)。但是,我发现了一个名为clojure.contrib.repl-utils
的{{1}}函数,它声称返回有关表达式是否是原始的信息。
见这里:http://clojuredocs.org/clojure_contrib/clojure.contrib.repl-utils/expression-info
我只是复制了源代码并尝试了它,但发现我需要首先执行此导入:
expression-info
然而,我用你的例子试了一下,但两者都返回了(我试过引用和不引用的表达式,因为我无法分辨它需要哪一个):
(import '(clojure.lang RT Compiler Compiler$C))
也许其中一些可以为您提供有用的线索/提示,但这可能是非常无益的,因为我不太了解您的要求(还)。
答案 1 :(得分:2)
一个宏,它遍历表单并检查所有类的类 然后验证给定树中的所有符号都是原始类型可以做到这一点。你必须决定是否计算宏扩展为原语的宏,如果是,那么首先宏扩展参数。