如何定义非可变变量?我是朱莉娅的新手,一直在阅读文档,到目前为止一无所获。
通过非可变,我的意思是变量(比如符号)a和b是否相乘。 a b = \ = b a
答案 0 :(得分:3)
关于交换性:Julia不认为a*b
与b*a
相同(例如:让a
和b
为矩阵)。但是,某些特定类型组合的函数*(a,b)
的方法以交换方式运行,例如a
和b
为数字时。
因为你在谈论符号,我想这是想要使用表达式的符号表示。至少有两种方法可以解决这个问题:
使用表达式的AST。
您可以按:(expr)
引用任何表达式(有时:expr
就足够了,取决于运算符优先级):
julia> ex = :(x*y*z)
:(x * y * z)
julia> typeof(ex)
Expr
请注意,因子的顺序已被保留(尽管关联性没有)。
您可以通过查看Expr
和head
字段来检查args
:
julia> ex.head
:call
julia> ex.args
4-element Array{Any,1}:
:*
:x
:y
:z
args可以是例如符号(类型Symbol
),常量值和其他表达式。
如果你想编写自己的处理表达式的宏,这种方法很有效,因为宏的输入是其参数的AST。
定义您自己的类型并重载*
函数。示例:使用
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
对象中看到它。
在大多数语言中,第二种选择是您唯一的选择。第一种选择更直接,因为您不必为自己编写新的AST框架,并且不必执行表达式只是为了获得它的表示。然而,哪一种更合适取决于应用。如果要将不同的属性与变量相关联,第二种方法似乎更容易。
你在寻找这样的东西吗?