【问题标题】:evaluate a quoted expression Clojure计算引用的表达式 Clojure
【发布时间】:2012-08-17 23:38:11
【问题描述】:

我很确定这个解决方案非常简单,但很难找到...... 所以如果我

=> (def x '(1 (dec 3) 3))
;user/x

如何评估表达式以便

=> (***insert function here** x)
;(1 2 3)

到目前为止,unquote 我得到了(1 (dec 3) 3),这是没有引号的 x,不是我想要的。我查看了`~x,它返回了相同的结果。是否有一些 ~ @ 和 ` 的组合返回评估的函数? (我在这里抛砖引玉,这些不是限制)

如果可能,请尽量不要更改我对 x 的原始定义。


好的,假设对于这个问题,表达式是'(list 1 (dec 3) 3) 现在我该如何检索

=> (***insert function here** x)
;(1 2 3)

是的,现在 eval 有效。感谢您添加重要的输入。

【问题讨论】:

    标签: variables clojure


    【解决方案1】:

    这可以通过将eval 映射到序列列表来完成。

    core> (def x '(1 (dec 3) 3))                                                                   
    core/x                                                                                       
    core> x                                                                                        
    (1 (dec 3) 3)                                                                                              
    core> (map eval x)                                                                             
    (1 2 3)                                                                                                    
    core>
    

    由于(1 2 3) 不是一个正确的函数调用,我们可以修复它,然后使用 eval 来处理任意嵌套的函数。

    utotestbed.core> (def x '(1 (dec 3) 3))                                                                   
    #'autotestbed.core/x                                                                                       
    autotestbed.core> (eval (cons 'list x))                                                                    
    (1 2 3)  
    

    【讨论】:

    • 是的,我知道,但我将如何根据 x 评估表达式?这就是我所追求的。
    • 好吧,我想这适用于这个例子,但不一定适用于任何表达式......如果我在另一个函数中有一个函数,整个表达式被引用,那么我需要映射两次.
    • 原始表达式的问题在于它不是一个可评估的表达式,因为 (1 ...) 是一个无效的函数调用 - 数字在 clojure 中是不可调用的。如果您要引用一个有效的 clojure 表达式,您可以使用 eval 完全评估它。换句话说,您可以使用有效的 clojure 表达式,也可以构建自己的语义,但可能没有故障安全的方法来确定表达式是其中一个还是另一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多