【发布时间】: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 个参数跨度>