【发布时间】:2016-11-08 22:02:59
【问题描述】:
我一直在使用以下函数来接收用户对我在 Julia 中编写的内容的输入:
function input(prompt::AbstractString = "")
println(prompt * " ")
chomp(readline())
end
在我的特定情况下,我接受的输入是等式的形式,例如“y = x^2”。在 input() 函数将其作为 ASCIIString 传递给我之后,我使用 parse() 函数将其转换为 Expression:
:(y = x^2)
作为一个表达式,我可以使用 .args 属性来做一些事情,比如计算变量的数量和返回唯一的变量,所有这些都运行良好。现在,我需要能够将表达式的右侧计算为函数 f(x) = x^2。为此,我开始编写以下函数(有一些相当大的缺陷):
function evalExpression()
L = [1,2,3,4]
equation = parse(input("Enter an equation"))
f = equation.args[2].args[2]
for i in L
x = i
value = eval(f)
println(value)
end
end
这个函数有两个我没能解决的问题。第一个是当我现在尝试运行它时,它给了我一个 UndefVarError for x;这或多或少是意料之中的。第二个是除非我知道用户会输入一个只有 x 的函数,否则我无法弄清楚我需要分配的变量是什么。我写了一个递归函数,它可以接受一个表达式并以 [:x, :y, etc.] 的形式返回它的所有变量,但是我不能将 :x 分配给一个数字来评估函数——我需要分配它只是到x,我不知道如何访问它。有什么东西可以用来访问我需要的变量吗?或者我可以采取不同的方法?
谢谢!
【问题讨论】:
-
一个建议:组织代码以构建整个表达式,然后立即对其进行评估,而不是单独评估各个部分。对每个步骤进行推理可能会更容易。例如,对于给定的问题,想法是从您想要的内容开始,并手动构建类似的对应表达式。你想要
f(x) = x^2,所以看看parse("f(x) = x^2") |> dump(dump对调试表达式非常有用!)。既然你有获取变量名的代码,你可以填写一个类似的表达式:myexpr = Expr(:(=), Expr(:call, :f, :x, :y, :z), Expr([equation expr here]),然后eval(myexpr)它。 -
一个可能有用的模型是 FastAnonymous.jl。使用 julia-0.5,性能不再需要此包,但它执行您需要在此处执行的类型的操作。你甚至可以直接使用它:只需要求用户将“方程式”写为
x -> x^2,在字符串前面加上@anon,然后eval(parse(str))。
标签: julia