在MOE SVL中,我一直试图通过遵循控制流文件创建一个基本的for-循环。
#svl
global function main []
for a = 10, 6, -1 loop
pr a;
endloop
endfunction当我运行脚本时:
moebatch -load for_loop.svl -exec "main[]"我知道错误:
ERROR: failed to load '/home/sean/svl_test/for_loop.svl'
'/home/sean/svl_test/for_loop.svl' line 5: 'a' is undefined
Error evaluating expression 'main[]'
'main' is undefined我应该如何在循环中定义a?
发布于 2021-08-06 09:43:54
当从SVL执行命令时,不需要声明变量。因此,在提示符中写入循环时,如下所示:
for a = 10, 6, -1 loop pr a; endloop翻译不抱怨。但是,如果在脚本中的函数中编写相同的循环,则需要首先声明每个变量。声明可以在循环中,但必须在第一个引用之前:
#svl
local function main []
local a;
for a = 10, 6, -1 loop
local b = 2;
pr [a, a-b];
endloop
endfunction在SVL中编写脚本时,有两种类型的脚本:
这些脚本是加载到MOE中可用函数范围的脚本。所有声明为global的函数都可以从REPL调用,也可以在其他脚本中的其他函数中调用。例如,如果您编写了这样一个名为add3script.svl的脚本:
#svl
global function add3 [a,b,c]
return a + b + c;
endfunction您可以将此函数加载到MOE (GUI或Moe批处理)中并调用它。要在大多数批处理中直接使用它,您可以这样做:
moebatch -load add3script.svl -exec "pr add3[1,2,3]"这个命令将午餐终端版本的MOE,加载SVL脚本add3script.svl,这使add3函数可用,因为它被设置为全局的。然后执行命令pr add3[1,2,3],该命令打印6,然后moebatch退出。您还可以启动moe批处理来打开REPL并加载脚本:
moebatch -load add3script.svl在REPL上,add3函数现在可用了。要在MOE的GUI版本中加载脚本,您可以单击MOE \ File,然后导航到add3script.svl,然后从File/Open面板'Load‘上的'Action’下拉菜单中选择。然后单击OK。现在,add3可以在MOE的GUI版本的SVL命令提示符中使用。
SVL脚本可以包含多个全局和本地函数,但是加载时只能从脚本外部使用全局函数。例如,如果我们将add3script.svl改为:
#svl
local function printResult value
pr value;
endfunction
global function add3 [a,b,c]
printResult [a + b + c];
endfunction
global function mul3 [a,b,c]
printResult [a * b * c];
endfunction像上面提到的那样,加载时可以使用add3和mul3,但是printResult只能从add3script.svl内部调用。
除了加载脚本以使其函数可用于脚本外,还可以执行(或运行)脚本。例如,这允许执行脚本中包含的工作流。这对于编写GUI应用程序可能很有用。默认情况下,当SVL脚本作为运行文件执行时,解释器将查找名为main的函数并执行其指令(helloworld.svl):
#svl
local function main []
pr 'Hello World!';
endfunction可以这样从终端执行此脚本:
moebatch -run helloworld.svl这张印有“你好世界!”并终止。如果执行另一个函数,则应该执行main,可以添加特殊指令:
#svl
#set main 'altmain'
local function gettext []
return 'Alt main text';
endfunction
local function altmain []
pr gettext[];
endfunction
local function main []
pr 'Hello World!';
endfunction如果您运行这个脚本,它将打印'Alt‘,因为主函数被设置为altmain,它调用本地函数gettext。
要在GUI MOE中运行这些函数,只需双击SVL脚本即可。
发布于 2021-06-25 21:04:40
在循环声明中定义a是不可能的,就像人们在C++或Python中所期望的那样。相反,必须在执行循环之前定义一个局部变量:
#svl
global function main []
local a;
for a = 10, 6, -1 loop
pr a;
endloop
endfunction这是违反直觉的,因为文档中的循环代码并不能做到这一点,因为只有在函数内部才能在使用之前声明变量。例如,在全局范围内,在MOE SVL REPL中执行代码时,不需要事先声明循环变量。
https://stackoverflow.com/questions/68137056
复制相似问题