我的“For”循环代码中的参数错误(Oz / Mozart)

时间:2013-03-18 19:29:56

标签: oz mozart

我最近开始学习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”以查看是否有变化,但我真的不知道我做错了什么。

1 个答案:

答案 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.forAllList.map之间的区别。

BTW,在MyFor的定义中,您正在使用全局变量XL。当多次调用MyFor时,这将导致问题。您应该使用 local 变量。像这样:

proc {MyFor F Init End}
  L X
in
  L = {Listing Init End}
  X = {ForList F L}
end