如何从Julia中的文本文件中读取多项式?

如何从Julia中的文本文件中读取多项式?,julia,Julia,我使用程序包TypedPolynomals,我想从文本文件中读取多项式。我该怎么做 如果我使用 julia> poly = read("test.txt", String) 这会给我一根绳子。如何将其转换为多项式?以下是一些想法 你可以做的是Meta.parse和eval你读入的字符串。请注意,这不是一个安全的操作,所以您应该确保您读取的内容实际上可以安全运行(或者有人可能会擦除您的磁盘)。以下是一个例子: julia> @polyvar x x julia> p = ev

我使用程序包TypedPolynomals,我想从文本文件中读取多项式。我该怎么做

如果我使用

julia> poly = read("test.txt", String)
这会给我一根绳子。如何将其转换为多项式?

以下是一些想法

你可以做的是
Meta.parse
eval
你读入的
字符串。请注意,这不是一个安全的操作,所以您应该确保您读取的内容实际上可以安全运行(或者有人可能会擦除您的磁盘)。以下是一个例子:

julia> @polyvar x
x

julia> p = eval(Meta.parse("3x+4x^2"))
4x² + 3x

julia> dump(p)
Polynomial{Int64,Term{Int64,Monomial{(x,),1}},Array{Term{Int64,Monomial{(x,),1}},1}}
  terms: Array{Term{Int64,Monomial{(x,),1}}}((2,))
    1: Term{Int64,Monomial{(x,),1}}
      coefficient: Int64 4
      monomial: Monomial{(x,),1}
        exponents: Tuple{Int64}
          1: Int64 2
    2: Term{Int64,Monomial{(x,),1}}
      coefficient: Int64 3
      monomial: Monomial{(x,),1}
        exponents: Tuple{Int64}
          1: Int64 1
另一个选项是
包括
文件:

julia> @polyvar x
x

julia> p = include("test.txt")
4x² + 3x

julia> dump(p)
Polynomial{Int64,Term{Int64,Monomial{(x,),1}},Array{Term{Int64,Monomial{(x,),1}},1}}
  terms: Array{Term{Int64,Monomial{(x,),1}}}((2,))
    1: Term{Int64,Monomial{(x,),1}}
      coefficient: Int64 4
      monomial: Monomial{(x,),1}
        exponents: Tuple{Int64}
          1: Int64 2
    2: Term{Int64,Monomial{(x,),1}}
      coefficient: Int64 3
      monomial: Monomial{(x,),1}
        exponents: Tuple{Int64}
          1: Int64 1
此方法也存在相同的风险(文件可能包含任意代码)


如果您想安全起见,您可能应该在
Meta.parse
步骤之后检查生成的表达式是否实际上只是一个多项式。

如果您不想使用
eval
并将以前已知的变量放入局部范围,正如BogumiłKamiński建议的那样,您可以在几行代码中定义自己的解析器和求值器——多项式在语法上非常简单。在Julia中提供的一个解析器生成器中,这可能如下所示:

julia> function parse_polynomial(s)
           @rule variable = r"[a-z]"p |> (v -> Variable{Symbol(v)}())
           @rule number = r"\d+"p |> (digits -> parse(Int, digits))
           @rule optional_number = number[:?] |> (c -> isempty(c) ? 1 : c[1])
           @rule optional_exponent = (r"\^"p & number)[:?] |> (e -> isempty(e) ? 1 : e[1][2])
           @rule monomial = variable & optional_exponent > ^
           @rule term = optional_number & monomial > *, number
           @rule polynomial = r"\s*" & term & (r"\+"p & term)[*] > ((_, t, r) -> reduce((a, plusb) -> a + plusb[2], r, init = t))
           parse_whole(polynomial, s)
       end
parse_polynomial (generic function with 1 method)


julia> parse_polynomial(" 3x+4x^2 ")
4x² + 3x

julia> parse_polynomial("2 x + 1 x ^ 2+ 203")
x² + 2x + 203
我假设
+
在这里是可交换的。因为我在REPL中编写了代码,所以所有内容都打包到一个函数中,但是如果将其拆分,我们建议实际使用