八度3对4脚本兼容性;可执行八度程序的真实文档在哪里

时间:2018-11-19 09:09:50

标签: octave

第1部分:在脚本文件“ joe.m”之后的八度3.4.3(在centos 6.6中)(但对于3.x --no-gui):

#!/bin/bash
# for-bash:
#{
  exec octave -q --no-gui --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
function jim ()
  printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim

产生输出:

calling jim
program_name: 'joe.m'

但是在octave 4.2.1中,它发出警告,并且似乎自动调用(!?)jim,并且不运行顶级立即代码(!?),没有输出行“调用jim”:

warning: function name 'jim' does not agree with function filename '/tmp/joe.m'
program_name: 'joe.m'

第2部分:如果我将同一文件重命名为“ jim.m”,则在倍频程3.4.4中,输出为:

calling jim
program_name: 'jim.m'

现在在八度4.2.1中避免了警告,但仍然缺少“ calling jim”行。

第3部分:在定义了零个功能的情况下,顶级代码 将在两个版本中执行。

在哪里记录或控制了这些行为(以及行为从版本3到版本4的更改)?

https://octave.org/doc/v4.2.1/Command-Line-Options.html

https://octave.org/doc/v4.2.1/Executable-Octave-Programs.html

一个人如何编写一个与3.x和4.x版本都兼容的八度文件,或者如何使用一个附加选项调用4.x以使其与3.x兼容?即使定义了函数,如何在4.x中执行顶级代码?

在没有相同文档的情况下,如何确定性地(无需反复试验)知道4.x中将自动调用哪些函数(以及使用哪些参数)?此示例不足以说明问题,因为只有一个功能:如果有多个功能(joe和jim),相对于文件名是否匹配,顺序是否重要?

编辑:我包含了shebang(自包含脚本),试图不“提出错误的问题”或针对我自己的“尝试解决方案”过早地优化问题,但无论有无,其行为都是相同的。我需要脚本来:不要使用绝对路径来八度,而要接受额外的单独选项(我无法在4.2.1中将--no-gui合并到-qf中)。欢迎您进行简化。

1 个答案:

答案 0 :(得分:4)

.m文件类型不同,包括(根据Octave 4.2.1):

  1. Function文件: 包含一个或多个功能的定义的文件。函数文件的名称通常与文件中定义的第一个函数的名称匹配。
  2. Script文件: 包含代码行(包括函数定义)的文件。

      

    与功能文件不同,脚本文件不能以关键字 function 开头。如果是这样,Octave将假定它是一个功能文件,并且它定义了一个应在定义后立即求值的功能。

  3. 类定义文件。

Octave的行为执行为:

$octave File

记录在Octave的一个源文件(oct-parse.yy)中:

  

执行脚本文件的内容。为了与Matlab兼容,还可以通过调用不带参数且nargout = 0的函数来执行函数文件。

在这里,因为您的文件以关键字 function 开头,因此它被视为功能文件,因此无论是否调用jim,都会自动调用功能jim。因此,您可以从文件末尾删除表达式jim,并看到该函数被自动调用。在3.4.3版中,我认为它被认为是脚本文件。

要解决该问题,您需要在文件的开头添加除 function 关键字之外的表达式,以将其转换为脚本文件:

#!/bin/bash
# for-bash:
#{
  exec octave -q --no-init-file "$0" ${1+"$@"}
#}
# for-octave:
1;
function jim ()
  printf ("program_name: '%s'\n", program_name ());
endfunction
printf ("calling jim\n")
jim