朱莉娅:从字典中评估表达式

时间:2016-05-20 14:23:44

标签: julia

我有一个表达式列表,f.x

"a1 || a4"
"a3 && a5

以及包含这些

真值的字典
a1 -> true
a2 -> false

我需要使用字典中的true / false值来评估列表中的表达式

任何想法如何轻松实现?非常感谢任何帮助

2 个答案:

答案 0 :(得分:4)

我觉得可能有一个更优雅的解决方案,但这肯定会完成工作。

truths = Dict("a1" => true, "a2" => false)
expressions = ["a1 || a4", "a1 && a2"]

for (key, value) in truths
    info("evaluating: '$key = $value'")
    eval(parse("$key = $value"))
end

for exp in expressions
    info("$exp => $(eval(parse(exp)))")
end

答案 1 :(得分:2)

什么是f.x?你是什​​么意思?将来,请提供工作代码,而不是像这样的代码片段。

在Julia中,你几乎肯定不想将a1 || a4中的Julia代码存储在字符串中,而是存储为Julia表达式(这是字符串实际给出的parse):

ex = [:(a1 || a4), :(a3 && a5)]

其次,您可能不希望使用具有此类名称的变量,而是使用数组:

a = bitrand(5)   # 5 random bits
a[1]   # gives true

然后你会用

ex = [:(a[1] || a[4]), :(a[3] && [a[5])]

你可以做到

map(eval, ex)

用于评估向量中的每个表达式。

如果您认为使用a[1]而不是a1输入的内容过多,则可以使用语法树并将a_i替换为a[i]。或者,如果您有字符串,只需在字符串上使用replace函数:

replace("hello a3 a34", "a3", "a[3]")

(所以要小心!)