【问题标题】:Detecting whether a Clojure expression is primitive检测 Clojure 表达式是否是原始的
【发布时间】:2012-07-30 13:47:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: clojure primitive


    【解决方案1】:

    我不确定我是否完全理解原始表达式是什么(仍在阅读它)。但是,我从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
    • 谢谢 - 似乎在正确的轨道上(虽然我无法找到这个函数在 1.4 的新模块化贡献中的位置.....)
    • 我最终只是将表达式信息代码复制到我的项目中,它运行良好 - 谢谢!
    【解决方案2】:

    一个遍历表单并检查所有内容的类的宏
    然后验证 给定树中的所有符号都是原始类型 可以解决问题。您必须决定是否将扩展为基元的宏计算为基元,如果是,则首先宏扩展参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      相关资源
      最近更新 更多