【发布时间】:2012-07-30 13:47:14
【问题描述】:
是否有可能以某种方式检测 Clojure 表达式是否保证是原始的?
例如我想要一个可以做到这一点的宏
(is-primitive-expression? (+ 1.0 2.0))
=> true
(is-primitive-expression? (+ 1N 2.0))
=> false
【问题讨论】:
是否有可能以某种方式检测 Clojure 表达式是否保证是原始的?
例如我想要一个可以做到这一点的宏
(is-primitive-expression? (+ 1.0 2.0))
=> true
(is-primitive-expression? (+ 1N 2.0))
=> false
【问题讨论】:
我不确定我是否完全理解原始表达式是什么(仍在阅读它)。但是,我从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}
也许其中一些可以为您提供有用的线索/提示,但这可能非常无益,因为我并不真正理解您在问什么。
【讨论】:
expression-info的来源,根据表达式的结果值是否原始,似乎返回primitive? true或false
一个遍历表单并检查所有内容的类的宏
然后验证 给定树中的所有符号都是原始类型 可以解决问题。您必须决定是否将扩展为基元的宏计算为基元,如果是,则首先宏扩展参数。
【讨论】: