0

私は最近Oz/Mozartを学び始めました。練習のために、「Init」から「End」の値にループし、各サイクルで現在の値を出力する単純な「For」プロシージャのコードを記述しようとしています。ブラウザへのサイクル番号。コードは次のとおりです。

この手順では、初期値から終了値までのリストを作成します。

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 {ForListFL}」です)

いくつかのサブルーチンで「func」と「proc」を入れ替えて、何かが変わるかどうかを確認しようとしましたが、何が間違っているのか本当にわかりません。

4

1 に答える 1

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あなたの定義では、グローバル変数XL. MyForこれは、が複数回呼び出されたときに問題を引き起こします。代わりにローカル変数を使用する必要があります。そのようです:

proc {MyFor F Init End}
  L X
in
  L = {Listing Init End}
  X = {ForList F L}
end
于 2013-03-19T10:31:13.420 に答える