「48時間でSchemeを書こう/Scheme関数の定義」の版間の差分

削除された内容 追加された内容
編集の要約なし
M編集の要約なし
50 行
 
 呼び出しがされた途端に出てくると、呼び出しの大半はモナディックパイプの中で、引数が新しい環境に束縛され、関数のボディの中にある式が評価されることになります。私たちが行うこの処理をパラメーターの名前や(既に評価された)引数の値をペアのリストを通ってzipするということになります。だから、私たちはこれを取りますし、関数のクロージャ(現在の環境では、まだ出来ません。これは私たちに辞書型スコープがないといけません)、そして関数の中で評価するための新しい環境を作るために、彼らが使われるでしょう。関数の全体としてはIOThrowsErrorである、IO型が結果となり、そして私たちは複合モナドの中にliftIOする必要があるわけです。
 
 今や、残された引数を、ローカル関数として使われているbindVarArgを使って、varArgs変数変数に束縛するときです。もし関数がvarArgsを取れないのなら(Nothing節のことですね)、私たちはただ存在している環境を返します。同様に、私たちは、変数の名前をkeyとして、残った引数を値として、単独のリストを作成し、bindVarsに渡します。既に変数へ束縛されている引数全てを無視するための、ビルドイン関数である、[http://www.haskell.org/onlinereport/standard-prelude.html#$vdrop drop] を使うことを、可読性のために、<span class="inline_code">remainingArgs</span>は、ローカル変数として定義しています。
 
60 ⟶ 61行目:
 
 これは、最初のnull環境を取り、PrimitiveFuncラッパーで構成された、名前と値のペアの枝葉を作り、そして新しい環境に対して、新しいペアを束縛します。私たちは同様に、runOneとrunReplをprimitiveBindngsの代わりに編集しなくてはいけません。
This takes the initial null environment, makes a bunch of name/value pairs consisting of PrimitiveFunc wrappers, and then binds the new pairs into the new environment. We also want to change runOne and runRepl to primitiveBindings instead:
 
runOne :: String -&gt; IO ()