Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Octave 为什么倍频程允许重命名函数?_Octave_Gnu - Fatal编程技术网

Octave 为什么倍频程允许重命名函数?

Octave 为什么倍频程允许重命名函数?,octave,gnu,Octave,Gnu,如果我打开八度音阶并执行以下操作: a = 1:10; sum(a) ans = 55 但如果我这样做: sum = 30; sum(a) 我得到一个错误: error: A(I): index out of bounds; value 10 out of bound 1 倍频程允许我改变单词“和”的指向,所以现在它是一个值,而不是一个函数。为什么这是允许的,不应该给我一个警告-这不是难以置信的危险吗 如果我意识到我已经这样做了,我如何在不关闭倍频程和失去工作空间的情况下删除引用 如果我

如果我打开八度音阶并执行以下操作:

a = 1:10;
sum(a)

ans = 55
但如果我这样做:

sum = 30;
sum(a)
我得到一个错误:

error: A(I): index out of bounds; value 10 out of bound 1
倍频程允许我改变单词“和”的指向,所以现在它是一个值,而不是一个函数。为什么这是允许的,不应该给我一个警告-这不是难以置信的危险吗

如果我意识到我已经这样做了,我如何在不关闭倍频程和失去工作空间的情况下删除引用

如果我意识到我已经这样做了,我如何在不关闭倍频程和失去工作空间的情况下删除引用

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

至于为什么Octave会以这种方式工作,我们必须问问这个开源项目的维护人员。也许是因为Matlab就是这样工作的,而Octave力求尽可能兼容

如果我意识到我已经这样做了,我如何在不关闭倍频程和失去工作空间的情况下删除引用

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


至于为什么Octave会以这种方式工作,我们必须问问这个开源项目的维护人员。也许是因为Matlab就是这样工作的,而Octave力求尽可能兼容

想象一下,倍频程不允许变量具有与函数相同的值。用八度音阶编写程序时,有一个名为
total
的变量,它不是函数。一切都很好。一个新的倍频程版本问世,并添加了一个名为
total
的函数。你的程序将停止工作,你将不得不重命名你的变量。这种向后不兼容的程度会更糟糕。这个问题不会局限于新的八度版本。也许您以后决定使用一个倍频程包,它会带来一整套新函数,其中一个函数可能与您的变量冲突

但是,在即将发布的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):


然而,真正的问题并不是变量可以隐藏函数。真正的问题是语法不允许区分变量和函数。变量索引和函数调用都使用相同的括号
()
(其他语言通常对函数使用
()
,对索引变量使用
[]
)。即使调用没有任何参数的函数,括号也是可选的:

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解析器并不真正关心)要求函数始终使用括号,并在括号和函数名之间留有空格:

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

想象一下,倍频程不允许变量与函数具有相同的值。用八度音阶编写程序时,有一个名为
total
的变量,它不是函数。一切都很好。一个新的倍频程版本问世,并添加了一个名为
total
的函数。你的程序将停止工作,你将不得不重命名你的变量。这种向后不兼容的程度会更糟糕。这个问题不会局限于新的八度版本。也许您以后决定使用一个倍频程包,它会带来一整套新函数,其中一个函数可能与您的变量冲突

但是,在即将发布的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):


然而,真正的问题并不是变量可以隐藏函数。真正的问题是语法不允许区分变量和函数。变量索引和函数调用都使用相同的括号
()
(其他语言通常对函数使用
()
,对索引变量使用
[]
)。即使调用没有任何参数的函数,括号也是可选的:

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解析器并不真正关心)要求函数始终使用括号,并在括号和函数名之间留有空格:

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=5Matlab这样做。。。。你甚至可以做
min=@max;min([2 3 4 5])
现在将输出第1段中有趣的合理化。最后是有趣的编码风格信息。我知道您想解释为什么错误消息是“索引超出范围”,而不是“尝试调用某个非函数”。您可能需要重新考虑用于描述底层语言属性的贬义词汇(“问题”、“缺陷”)。在我看来,这降低了你答案的价值。我认为作为一名八度音阶开发人员,我有足够的余地使用任何我想要的词汇来反对它。第一段中有趣的合理化。最后是有趣的编码风格信息。我知道您想解释为什么错误消息是“索引超出范围”,而不是“尝试调用某个非函数”。您可能需要重新考虑用于描述底层语言属性的贬义词汇(“问题”、“缺陷”)。在我看来,这会降低你答案的价值