如何将用户输入解释为Julia中的函数?

时间:2016-07-06 18:17:37

标签: 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;或多或少的预期。第二个是除非我知道用户只输入x的函数,否则我无法弄清楚我需要分配的变量是什么。我写了一个递归函数,它可以接受一个表达式并以[:x,:y等]的形式返回它的所有变量,但是我不能将:x分配给一个数字来评估函数 - 我需要分配它只是为了x,我无法弄清楚如何访问它。有什么我可以用来访问我需要的变量吗?或者我可以采取不同的方法?

谢谢!

1 个答案:

答案 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")) 

会做