我一直在使用以下功能来接收用户输入我在朱莉娅写的东西:
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;或多或少的预期。第二个是除非我知道用户只输入x的函数,否则我无法弄清楚我需要分配的变量是什么。我写了一个递归函数,它可以接受一个表达式并以[:x,:y等]的形式返回它的所有变量,但是我不能将:x分配给一个数字来评估函数 - 我需要分配它只是为了x,我无法弄清楚如何访问它。有什么我可以用来访问我需要的变量吗?或者我可以采取不同的方法?
谢谢!
答案 0 :(得分:1)
当我运行以下内容时:
function evalExpression()
L = [1,2,3,4]
equation = parse(input("Enter an equation"))
global x
for i in L
x = i
f = equation.args[2].args[2]
value = eval(f)
println(value)
end
end
然后把y = x * x我得到
evalExpression()
Enter an equation
y = x*x
1
2
3
4
缺少什么,至少对于x作为变量,是在全局声明它。当您使用已解析的语句时,这些已解析的语句只能访问全局变量
因此,在您发明了递归函数以正确获取变量之后,您可能需要做的就是全局创建它们。也许
eval(parse("$variable = 0"))
会做