1

是否有可能以某种方式检测 Clojure 表达式是否保证是原始的?

例如,我想要一个可以做到这一点的宏

(is-primitive-expression? (+ 1.0 2.0))
=> true

(is-primitive-expression? (+ 1N 2.0))
=> false
4

2 回答 2

4

我不确定我是否完全理解原始表达式是什么(仍在阅读它)。但是,我从clojure.contrib.repl-utils被调用中找到了一个函数expression-info,该函数声称返回有关表达式是否为原始表达式的信息。

见这里:http ://clojuredocs.org/clojure_contrib/clojure.contrib.repl-utils/expression-info

我只是复制了源代码并尝试了一下,但发现我需要先进行此导入:

(import '(clojure.lang RT Compiler Compiler$C))

但是,我用您的示例进行了尝试,但两者都返回 true (我尝试了带引号和不带引号的表达式,因为我不知道它需要哪一个):

=> (expression-info (+ 1N 2.0))
=> {:class double, :primitive? true} 
=> (expression-info (+ 1.0 2.0))
=> {:class double, :primitive? true}
=> (expression-info '(+ 1.0 2.0))
=> {:class double, :primitive? true}
=> (expression-info '(+ 1N 2.0))
=> {:class double, :primitive? true}

也许其中一些可以为您提供有用的线索/提示,但这可能是非常无益的,因为我并不真正理解您在问什么(还)。

于 2012-07-30T05:47:14.020 回答
2

a macro that iterates over the form and checks the class of everything
and then verrifies that all the symbols in the given tree are primitive types could do the trick. You have to decide if you count things that are macros which expand to primitives as primitive and if so then macroexpand the argument first.

于 2012-07-30T05:26:50.380 回答