【问题标题】:How can I interpret user input as a function in Julia?如何将用户输入解释为 Julia 中的函数?
【发布时间】: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") |> dumpdump 对调试表达式非常有用!)。既然你有获取变量名的代码,你可以填写一个类似的表达式: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


【解决方案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 解析语句时,这些解析语句只访问全局变量

因此,在您发明递归函数以正确获取变量后,您可能需要做的是全局创建它们。也许

eval(parse("$variable = 0")) 

会的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 2013-05-23
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多