首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MOE SVL函数中执行循环?

如何在MOE SVL函数中执行循环?
EN

Stack Overflow用户
提问于 2021-06-25 21:04:40
回答 2查看 168关注 0票数 1

在MOE SVL中,我一直试图通过遵循控制流文件创建一个基本的for-循环。

代码语言:javascript
复制
#svl

global function main []
    for a = 10, 6, -1 loop
        pr a;
    endloop

endfunction

当我运行脚本时:

代码语言:javascript
复制
moebatch -load for_loop.svl -exec "main[]"

我知道错误:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-06 09:43:54

当从SVL执行命令时,不需要声明变量。因此,在提示符中写入循环时,如下所示:

代码语言:javascript
复制
for a = 10, 6, -1 loop pr a; endloop

翻译不抱怨。但是,如果在脚本中的函数中编写相同的循环,则需要首先声明每个变量。声明可以在循环中,但必须在第一个引用之前:

代码语言:javascript
复制
#svl
local function main []
    local a;
    for a = 10, 6, -1 loop
        local b = 2;
        pr [a, a-b];
    endloop
endfunction

在SVL中编写脚本时,有两种类型的脚本:

  1. 加载脚本

这些脚本是加载到MOE中可用函数范围的脚本。所有声明为global的函数都可以从REPL调用,也可以在其他脚本中的其他函数中调用。例如,如果您编写了这样一个名为add3script.svl的脚本:

代码语言:javascript
复制
#svl
global function add3 [a,b,c]
    return a + b + c;
endfunction

您可以将此函数加载到MOE (GUI或Moe批处理)中并调用它。要在大多数批处理中直接使用它,您可以这样做:

代码语言:javascript
复制
moebatch -load add3script.svl -exec "pr add3[1,2,3]"

这个命令将午餐终端版本的MOE,加载SVL脚本add3script.svl,这使add3函数可用,因为它被设置为全局的。然后执行命令pr add3[1,2,3],该命令打印6,然后moebatch退出。您还可以启动moe批处理来打开REPL并加载脚本:

代码语言:javascript
复制
moebatch -load add3script.svl

在REPL上,add3函数现在可用了。要在MOE的GUI版本中加载脚本,您可以单击MOE \ File,然后导航到add3script.svl,然后从File/Open面板'Load‘上的'Action’下拉菜单中选择。然后单击OK。现在,add3可以在MOE的GUI版本的SVL命令提示符中使用。

SVL脚本可以包含多个全局和本地函数,但是加载时只能从脚本外部使用全局函数。例如,如果我们将add3script.svl改为:

代码语言:javascript
复制
#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

像上面提到的那样,加载时可以使用add3mul3,但是printResult只能从add3script.svl内部调用。

  1. 运行脚本

除了加载脚本以使其函数可用于脚本外,还可以执行(或运行)脚本。例如,这允许执行脚本中包含的工作流。这对于编写GUI应用程序可能很有用。默认情况下,当SVL脚本作为运行文件执行时,解释器将查找名为main的函数并执行其指令(helloworld.svl):

代码语言:javascript
复制
#svl
local function main []
   pr 'Hello World!';
endfunction

可以这样从终端执行此脚本:

代码语言:javascript
复制
moebatch -run helloworld.svl

这张印有“你好世界!”并终止。如果执行另一个函数,则应该执行main,可以添加特殊指令:

代码语言:javascript
复制
#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脚本即可。

票数 2
EN

Stack Overflow用户

发布于 2021-06-25 21:04:40

在循环声明中定义a是不可能的,就像人们在C++或Python中所期望的那样。相反,必须在执行循环之前定义一个局部变量:

代码语言:javascript
复制
#svl

global function main []
    local a;
    for a = 10, 6, -1 loop
        pr a;
    endloop

endfunction

这是违反直觉的,因为文档中的循环代码并不能做到这一点,因为只有在函数内部才能在使用之前声明变量。例如,在全局范围内,在MOE SVL REPL中执行代码时,不需要事先声明循环变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68137056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档