2013-03-18 65 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