我有一个表达式列表,f.x
"a1 || a4"
"a3 && a5
以及包含这些
真值的字典a1 -> true
a2 -> false
我需要使用字典中的true / false值来评估列表中的表达式
任何想法如何轻松实现?非常感谢任何帮助
答案 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]")
(所以要小心!)