为什么Octave允许重命名功能?

时间:2017-04-20 07:56:16

标签: octave gnu

如果我打开Octave并执行:

a = 1:10;
sum(a)

ans = 55

但如果我这样做:

sum = 30;
sum(a)

我收到错误:

error: A(I): index out of bounds; value 10 out of bound 1

Octave允许我改变“sum”这个词的位置,所以现在它的值不是函数。为什么允许这样做,不应该给我一个警告 - 这不是非常危险吗?

如果我意识到我已经完成了这项工作,我是否会在不关闭八度并删除工作空间的情况下删除引用?

2 个答案:

答案 0 :(得分:2)

  

如果我意识到我已经完成了这项工作,我是否会在不关闭八度并删除工作空间的情况下删除引用?

使用命令clear sum清除符号sum的用户定义,这将使其恢复为内置含义。 (也就是说,内置定义将不再被用户定义遮蔽。)

至于为什么Octave以这种方式工作,人们不得不向维护人员询问这个开源项目。也许是因为Matlab以这种方式工作,而Octave努力尽可能兼容。

答案 1 :(得分:2)

想象一下,Octave不允许变量与函数相同。你在Octave编写一个程序,你有一个名为total的变量,它不是一个函数。一切都好。出现了一个新的Octave版本,并添加了一个名为total的函数。您的程序将停止工作,您必须重命名变量。这种向后不兼容的程度会更糟。问题不仅限于新的Octave版本。也许你后来决定要使用Octave包,它带来了一整套新功能,其中一个可能会与你的变量冲突。

但是,在即将发布的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 Octave的目标之一。

要解决这个问题,Octave编码指南(代码对Octave有所贡献的指导.Octave解析器并不关心)要求函数总是使用括号并在它们和函数名之间留一个空格:

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