如何在julia中声明非可变变量?

时间:2014-10-02 04:50:27

标签: julia

如何定义非可变变量?我是朱莉娅的新手,一直在阅读文档,到目前为止一无所获。

通过非可变,我的意思是变量(比如符号)a和b是否相乘。 a b = \ = b a

1 个答案:

答案 0 :(得分:3)

关于交换性:Julia不认为a*bb*a相同(例如:让ab为矩阵)。但是,某些特定类型组合的函数*(a,b)的方法以交换方式运行,例如ab为数字时。

因为你在谈论符号,我想这是想要使用表达式的符号表示。至少有两种方法可以解决这个问题:

  1. 使用表达式的AST。 您可以按:(expr)引用任何表达式(有时:expr就足够了,取决于运算符优先级):

    julia> ex = :(x*y*z)
    :(x * y * z)
    
    julia> typeof(ex)
    Expr
    

    请注意,因子的顺序已被保留(尽管关联性没有)。 您可以通过查看Exprhead字段来检查args

    julia> ex.head
    :call
    
    julia> ex.args
    4-element Array{Any,1}:
     :*
     :x
     :y
     :z
    

    args可以是例如符号(类型Symbol),常量值和其他表达式。 如果你想编写自己的处理表达式的宏,这种方法很有效,因为宏的输入是其参数的AST。

  2. 定义您自己的类型并重载*函数。示例:使用

    abstract Symbolic
    
     # might as well make these immutable
    immutable Sym <: Symbolic
        name::Symbol
    end
    
    immutable Prod <: Symbolic
        x::Symbolic
        y::Symbolic
    end
    
    # The * function is imported by default.
    # Usually, we need to import a function
    # from Base before extending it.
    *(x::Symbolic, y::Symbolic) = Prod(x, y)
    

    你可以做到

    julia> x, y = Sym(:x), Sym(:y)
    (Sym(:x),Sym(:y))
    
    julia> x*y
    Prod(Sym(:x),Sym(:y))
    

    由于我们的*(x::Symbolic, y::Symbolic)函数保留了参数的顺序,我们可以在创建的Prod对象中看到它。

  3. 在大多数语言中,第二种选择是您唯一的选择。第一种选择更直接,因为您不必为自己编写新的AST框架,并且不必执行表达式只是为了获得它的表示。然而,哪一种更合适取决于应用。如果要将不同的属性与变量相关联,第二种方法似乎更容易。

    你在寻找这样的东西吗?