2013-03-18 88 views
0

我最近开始学习Oz/Mozart,并且为了练习,我正在编写一个简单的“For”过程的代码,从“Init”到“End”值,并在每个循环中将当前循环编号打印到浏览器。下面是代码:我的“For”循环代码中的参数错误(Oz/Mozart)

此过程创建从初始化列表,以终值:

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 

Final LY,我叫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 FL}”)

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

+1

你的代码中缺少一些东西。你似乎没有在任何地方调用'ForList'? – wmeyer 2013-03-18 21:11:34

+1

我的猜测是你正在调用'ForList'而不消耗结果。在Oz中,函数的返回值也被认为是一个参数。所以它是必须使用它(与'Res = {Function Arg1 Arg2}''一样的赋值)。 – wmeyer 2013-03-18 22:19:24

+0

是的,对不起,我现在编辑过(对ForList的调用在MyFor的声明中)。 我已经添加了变量X来保存For List的返回值,但是现在我收到了一个类似的错误(我已将它放入编辑的消息中)。我试图在我调用MyFor时也保留返回值,但这也不起作用,而是它给了我这个错误: %***************错误:非法的参数数量********* %**在声明:{

1 4一} %**预计:3个参数 %**:4个参数 – Granjero 2013-03-19 02:42:47

回答

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 
+0

谢谢你,现在的工作! 所以问题是我试图“分配”浏览结果H | T。 虽然我对本地变量有点困惑,我认为通过“在fun {MyFunc arg1} end”中声明foo MyFunc“我已经让foo成为MyFunc的本地变量(因为关键字”in“),并且声明它为全局的,我只是必须做“宣布富”。也许他们有两种不同的方式来做同样的事情? – Granjero 2013-03-19 14:34:09