2013-03-18 5 views
0

Я начал изучать Oz/Mozart в последнее время, и на практике я пытаюсь написать код простой процедуры «For», что циклы от значений «Init» до «End» и в каждом цикле печатать текущий номер цикла в браузере. Вот код:Ошибка аргумента в моем цикле кода «For» (Oz/Mozart)

Эта процедура создает список из Init до конечного значения:

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 

Окончание 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}")

I» В некоторых подпрограммах вы пытались использовать «func» и «proc», чтобы увидеть, что-то изменилось, но я действительно не знаю, что я делаю неправильно.

+1

Что-то не хватает в вашем коде. Кажется, вы не называете 'ForList' нигде? – wmeyer

+1

Я предполагаю, что вы вызываете 'ForList', не потребляя его результат. В Oz, возвращаемое значение функции также считается аргументом. Поэтому его необходимо использовать (с присвоением типа «Res = {Function Arg1 Arg2}»). – wmeyer

+0

Да, извините, я сейчас редактировал (вызов ForList находится внутри объявления MyFor). Я добавил переменную X для хранения возвращаемого значения для списка, но теперь я получаю аналогичную ошибку (я поместил ее в отредактированное сообщение). Я попытался сохранить возвращаемое значение и при вызове MyFor, но это не работает нигде, вместо этого он дает мне эту ошибку: % *************** Ошибка: незаконное количество аргументов ********* % ** В заявлении: {

1 4 A } % ** Ожидаемое: 3 аргументов % ** Найдено: 4 аргументов – Granjero

ответ

1

ForList ожидает функцию, которая отображает элементы в результат. Но Browse - это процедура, которая ничего не возвращает. ForList должен выглядеть примерно так:

proc {ForList F L} 
    case L of H|T then 
    {F H} 
    {ForList F T} 
    else 
    skip 
    end 
end 

Это именно разница между встроенной функцией List.forAll и List.map.

Кстати, в определении MyFor вы используете глобальные переменныеX и L. Это вызовет проблемы, когда MyFor вызывается более одного раза. Вместо этого вы должны использовать местных переменных. Вроде так:

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

Спасибо, он работает сейчас! Так что проблема была в том, что я пытался «назначить» результат «Обзор» на H | T. Я немного запутался в локальных переменных; Я думал, что, сделав «объявить foo MyFunc в fun {MyFunc arg1} end», я уже делал foo переменной local для MyFunc (из-за ключевого слова «in»), и чтобы объявить его глобальным, я просто должен был «объявить foo». Может быть, это два разных способа сделать то же самое? – Granjero