我最近开始学习Oz / Mozart,为了练习,我正在尝试编写一个简单的“For”过程的代码,它从“Init”循环到“End”值,并且在每个循环中将当前循环编号打印到浏览器。这是代码:
此过程从Init到End值创建一个列表:
declare
fun {Listing Init End}
if Init == End then
[Init]
else
Init|{Listing Init+1 End}
end
end
这样做循环并在每个循环中应用函数“F”:
declare ForList
fun {ForList F L}
case L of H|T then
{F H}|{ForList F T}
else nil end
end
这包含了上面的函数,因此可以接收Init和End值,而不是列表:
declare MyFor L X in
proc {MyFor F Init End}
L = {Listing Init End}
X = {ForList F L}
end
最后,我打电话给MyFor:
{MyFor Browse 1 4}
当我尝试编译时,我收到此错误:
%*************** Error: illegal number of arguments *************
%**
%** In statement: {<P/1 Browse> 1 _<optimized>}
%** Expected: 1 argument
%** Found: 2 arguments
%**
%** Call Stack:
%** procedure 'ForList' in file "Oz", line 11, column 0, PC = 15793
(第11行是“有趣{ForList F L}”)
我尝试在某些子程序中交换“func”和“proc”以查看是否有变化,但我真的不知道我做错了什么。
答案 0 :(得分:1)
ForList
需要一个将元素映射到结果的函数。但Browse
是一个不返回任何内容的过程。 ForList
应该看起来更像这样:
proc {ForList F L}
case L of H|T then
{F H}
{ForList F T}
else
skip
end
end
这正是内置函数List.forAll
和List.map
之间的区别。
BTW,在MyFor
的定义中,您正在使用全局变量X
和L
。当多次调用MyFor
时,这将导致问题。您应该使用 local 变量。像这样:
proc {MyFor F Init End}
L X
in
L = {Listing Init End}
X = {ForList F L}
end