想象一下Octave不允許變量具有相同的功能。你用Octave編寫一個程序,並且你有一個名爲total
的變量,這不是函數。一切安好。一個新的Octave版本出來並增加了一個名爲total
的函數。你的程序將停止工作,你將不得不重新命名你的變量。這種向後不相容的程度會更糟。這個問題不會侷限於新的八度版本。也許你以後決定要使用一個帶有一整套新功能的Octave軟件包,其中一個可能與你的變量衝突。
但是,在即將發佈的Octave版本中,越界錯誤將提示變量名稱正在映射函數。在八度4.2.1:
octave-cli-4.2.0:1> a = 1:10;
octave-cli-4.2.0:2> sum = 30;
octave-cli-4.2.0:3> sum (a)
error: sum(10): out of bound 1
雖然在4.3.0+(其中有一天會成爲4.4):
octave-cli-4.3.0+:1> a = 1:10;
octave-cli-4.3.0+:2> sum = 30;
octave-cli-4.3.0+:3> sum(a)
error: sum(10): out of bound 1 (note: variable 'sum' shadows function)
然而,真正的問題不在於變量可以陰影功能。真正的問題是語法不允許區分變量和函數。變量索引和函數調用都使用相同的括號()
(其他語言通常對功能使用()
,對索引變量使用[]
)。而且,即使你調用一個函數不帶任何參數,括號是可選的:
foo(1) # 1st element of foo? Or is foo a function?
foo # Is this a variable or a function call without any arguments?
foo() # idem
這句法的要求主要是針對Matlab的兼容性是GNU八度的目標之一。
要解決這方面的不足,八度編碼準則(代碼所需的指導原則促成了八度八度分析器並不真正關心。)要求總是使用括號,並讓他們與函數名之間的空間功能:
foo (x, y); # there is a space after foo so it must be a function
foo(x, y); # there is no space, it is indexing a matrix
foo # this is a variable
foo(); # this is a function
Matlab通過這種方式實現....你甚至可以做'min = @max; min([2 3 4 5])'現在將輸出'ans = 5' – Andy