Octave 八度音阶3对4的脚本兼容性;其中';s可执行倍频程程序的真实文档

Octave 八度音阶3对4的脚本兼容性;其中';s可执行倍频程程序的真实文档,octave,Octave,第1部分:在脚本文件“joe.m”之后的八度音阶3.4.3(在centos 6.6上)中(但对于3.x减去- 产生输出: calling jim program_name: 'joe.m' 但在octave 4.2.1中,它给出了一个警告,并显示为自动调用(!?)jim,并且不运行顶级即时代码(!?),没有输出行“调用jim”: 第2部分:如果我将同一文件重命名为“jim.m”,那么在octave 3.4.4中,输出为: calling jim program_name: 'jim.m' 在

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

产生输出:

calling jim
program_name: 'joe.m'
但在octave 4.2.1中,它给出了一个警告,并显示为自动调用(!?)jim,并且不运行顶级即时代码(!?),没有输出行“调用jim”:

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

calling jim
program_name: 'jim.m'
在倍频程4.2.1中,现在避免了警告,但仍然缺少“呼叫jim”行

第3部分:定义了零函数后,顶级代码将在两个版本中执行

这些行为(以及从版本3到版本4的行为变化)在哪里记录或控制?以下内容中未提及此类内容:

如何编写与3.x版和4.x版兼容的倍频程文件,或者如何使用额外选项调用4.x以兼容3.x版?即使定义了函数,如何在4.x中执行顶级代码

在4.x中,如果没有相同的文档,如何确定(没有尝试和错误)将自动调用什么函数(以及使用什么参数)?这个例子还不够详细,因为只有一个函数:如果有多个函数(joe和jim),相对于文件名是否匹配,顺序是否重要


编辑:我加入shebang(自包含脚本)是为了避免“问错问题”或过早地优化问题以达到我自己的“尝试解决方案”,但不管有没有它,行为都是一样的。我需要脚本:不使用八度音程的绝对路径,并接受额外的单独选项(我无法在4.2.1中将
--no-gui
合并到
-qf
)。欢迎您进行简化。

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

  • 档案: 包含一个或多个函数定义的文件。函数文件的名称通常与文件中定义的第一个函数的名称匹配
  • 档案: 包含包括函数定义的代码行的文件

    与函数文件不同,脚本文件不能以关键字函数开头。如果是这样的话,Octave将假定它是一个函数文件,并且它定义了一个函数,一旦定义了该函数,就应该对该函数进行求值

  • 类定义文件

  • 执行时倍频程的行为如下:

    $octave File
    
    记录在倍频程的一个源文件(oct parse.yy)中:

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

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

    要解决此问题,您需要在文件开头添加一个表达式(函数关键字除外),以将其转换为脚本文件:

    #!/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
    

    如果shebang行与问题无关,请将其删除。我花了一段时间来分析它。让人们关注重要的事情。请参阅(特别是最简单的部分!)。谢谢。我做了一个编辑来解释。也许我最好把这首歌分成一个后记,这是一个很大的帮助。3.x和4.x兼容性仍未解决。我得到了补充警告(4.x似乎是一个警告的雷区),函数名与文件名在匹配时(脚本文件)和不匹配时(函数文件)都会发出警告。如果要禁用警告,可以将以下命令放入:
    警告('off','Octave:function name clash')
    。您可以找到所有警告的列表。我认为3.x的行为是一个bug,以后会被修复。如果您需要3.x,您可以同时安装4.x和3.x,并使用您想要的。我发现,当脚本文件具有相同名称的函数时,禁用警告的唯一方法是
    warning('off','all')-qf
    ,则无法及时执行此操作。强制我重命名octave 3中的函数(或脚本文件),以便在octave 4中使用它们。
    $octave File
    
    #!/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