2014-10-02 21 views
0

你如何定義不可變的變量?我是茱莉亞的新手,一直在閱讀文檔,到目前爲止沒有發現任何內容。如何在julia中聲明不可變的變量?

通過不可交換我的意思是說,如果變量(比如符號)a和b相乘。一個B = \ = B一個

+0

你能澄清一下你的意思嗎?不可變(const)變量? – 2014-10-02 05:01:12

+0

@ToivoHenningsson我編輯過 - 但我的意思是變量(比如符號)a和b是否相乘。 a * b = \ = b * a – faceforest 2014-10-02 05:02:40

+0

你說那種語言? Prolog的? – StefanKarpinski 2014-10-02 05:34:42

回答

3

關於可交換:朱不假定a*b相同b*a(例如:讓ab是矩陣)。但是,對於某些特定類型組合,功能*(a,b)的方法以交換方式進行操作,例如當ab是數字時。

既然你在談論符號,我想那是想用表達式的符號表示。至少有兩種方法可以解決這個問題:

  1. 使用表達式的AST。 您可以通過:(expr)引用任何表達式(有時:expr是不夠的,取決於運算符優先級):

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

    注意的因素的訂單已保存(儘管關聯性還沒有)。 您可以通過查看檢查Expr在它的headargs領域:

    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對象。

在大多數語言中,第二種選擇是您唯一的選擇。第一種選擇更直接,因爲您不必爲自己編寫新的AST框架,也不必爲了表達而執行表達式。然而,哪一個更適合取決於應用。如果您想將不同的屬性與變量相關聯,則第二種方法似乎更容易。

這是你想要的東西嗎?

+0

是的!謝謝。我不知道如何深入我需要知道,因爲在Python中它只是一個'交換=虛假'或'交換=真'的術語。 – faceforest 2014-10-02 15:56:14