0

我最近开始学习 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 行是“fun {ForList FL}”)

我尝试在一些子例程中交换“func”和“proc”以查看是否有变化,但我真的不知道我做错了什么。

4

1 回答 1

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.

顺便说一句,在MyFor您的定义中使用的是全局变量XL. MyFor当多次调用时,这将导致问题。您应该改用局部变量。像这样:

proc {MyFor F Init End}
  L X
in
  L = {Listing Init End}
  X = {ForList F L}
end
于 2013-03-19T10:31:13.420 回答