脚本文件是包含(几乎)任何Octavecommands序列的文件。它的读取和评估就像您在Octave提示符下输入了每个命令一样,并提供了一种方便的方式来执行逻辑上不属于函数内部的命令序列。
与函数文件不同,脚本文件必须不以关键字开头作用
。如果是,Octave将假设它是一个函数文件,并且它定义了一个函数,该函数一定义就应该立即求值。
脚本文件与函数文件的区别还在于,脚本文件中命名的变量不是局部变量,而是与命令行上可见的其他变量在同一范围内。
即使脚本文件可能不是以作用
关键字,可以在一个脚本文件中定义多个函数,然后一次加载(但不能执行)所有函数。要进行点符号,文件中的第一个符号(忽略注释和其他空白)必须是以下内容作用
。如果没有其他语句要评估,则可以使用不起作用的语句,如下所示:
#防止Octave认为这个#是一个函数文件:1;#定义函数一:函数一()。。。
要让Octave读取这些函数并将其编译为内部形式,您需要确保该文件位于Octave的加载路径中(可通过路径
函数),然后简单地输入包含命令的文件的基本名称。(Octave使用与搜索函数文件相同的规则来搜索脚本文件。)
如果文件中的第一个符号(忽略注释)是作用
,Octave将编译该函数并尝试执行它,打印关于函数定义后出现的任何非空白字符的amesage警告。
请注意,Octave在需要对任何标识符的定义进行评估之前不会尝试查找该定义。这意味着,如果以下语句出现在脚本文件中,或者在命令行中输入,则Octave将编译这些语句,
#不是函数文件:1;函数foo()do_something();endfunctionfunction do_something()do_someching_else();结束函数
即使函数do_something
在函数中引用之前未定义foo
。这不是错误,因为Octave不需要解析函数引用的所有符号,直到实际计算该函数为止。
从于Octave在需要定义之前不会查找定义,因此以下代码将始终打印出来bar=3无论它是直接在命令行上输入的,还是从脚本文件中读取的,或者是函数体的一部分,即使有一个函数或脚本文件被调用bar.m在奥克塔夫的道路上。
eval(“bar=3”);条形图
如果在编译函数时解析了定义,那么出现在函数体中的类似代码可能会欺骗Octave。实际上,要让Octave足够聪明,以一致的方式评估这段代码是不可能的。解析器必须能够执行对的调用eval
在编译时,除非要计算的字符串中的所有引用都能被解析,否则这是不可能的,而且要求解析的限制性太强(字符串可能来自用户输入,或者取决于在计算函数之前未知的东西)。
尽管Octave通常从名为的脚本文件中执行命令文件.m,您可以使用该函数来源
从任何文件执行命令。
版权所有 © 2024 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号