【问题标题】:Argument error in my "For" loop code (Oz/Mozart)我的“For”循环代码中的参数错误(Oz/Mozart)
【发布时间】:2013-03-18 19:29:56
【问题描述】:

我最近开始学习 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 F L}”)

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

【问题讨论】:

  • 您的代码中缺少某些内容。你好像没有在任何地方给ForList打电话?
  • 我猜你是在调用ForList 而不消耗它的结果。在 Oz 中,函数的返回值也被视为参数。所以必须使用它(像Res = {Function Arg1 Arg2}这样的赋值)。
  • 是的,对不起,我现在已经编辑了(对 ForList 的调用在 MyFor 的声明中)。我添加了变量 X 来保存 For List 的返回值,但现在我遇到了类似的错误(我已将其放入已编辑的消息中)。当我调用 MyFor 时,我也尝试保持返回值,但这也不起作用,而是给了我这个错误:%*************** 错误:非法数量的参数 * ******** %** 在语句中:{

    1 4 A} %** 预期:3 个参数 %** 找到:4 个参数跨度>

标签: oz mozart


【解决方案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 被多次调用时,这将导致问题。您应该改用 local 变量。像这样:

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

【讨论】:

  • 谢谢,现在可以使用了!所以问题是我试图将 Browse 的结果“分配”给 H|T。不过,我对局部变量有点困惑;我认为通过“在 fun {MyFunc arg1} end 中声明 foo MyFunc”,我已经使 foo 成为 MyFunc 的本地变量(因为关键字“in”),并且将它声明为全局我只是必须做“声明foo”。也许他们有两种不同的方式来做同样的事情?
猜你喜欢
  • 2014-05-05
  • 2015-05-24
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2021-12-04
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多