Scheme

手続きの抽象化

sicp の1.3.3 と1.3.4 を復習。general Methodと手続きを返す手続きをつかっての手続きの抽象化。題材は主に、平方根で。 [1.3.3 general Methodを使っての抽象化] 指定した手続きの入力と出力の差が十分小さくなくなる時点(fixed point)の入力値を得るため…

exercise 1.30と1.32

SICPのexercise 1.30と1.32 Excersize 1.30 a から bまで値をnext手続きで増分していき、 それらの値にterm手続きで指定した演算を適用した値を合計する手続き. (term, nextとも1つの引数を要求する手続き) 例で、linear recursiveの例が出ているので、それ…

exercise 1.12 - Pascalの三角形

パスカルの三角形の問題ですが、 (リストとかはまだ出てきていないので)指定した要素の値を求めよという解釈をして解く。 レベル(上から何番目)と列(左から何番目)を引数に指定しての定義。 左上(1つ下のレベルの同じ列)と右上(1つ上のレベルの1つ右の…

コルーチンのお勉強

プログラミングGaucheのコルーチン(19.8)内容のお勉強。P299に載っているexitのための手続きが定義されるほうのコルーチンを定義するためのマクロ定義の解読。 (use util.queue) (define *tasks* (make-queue) ) (define-syntax define-coroutine (syntax-ru…

継続のお勉強

プログラミングGaucheのcall/ccでの継続(19.4-19.6)内容のお勉強。 break/next名前付き for-each 本のサンプルより単純な例(受け取るリストを可変ではなく1つに限定)で実装してみる。 (define-syntax for-each-ext (syntax-rules () [ (_ break next expr l…

メソッド適用のカスタマイズ

プログラミングGaucheの[17.5.3 メソッドの適用のカスタマイズ]の内容を復習。総称関数を標準のクラスのインスタンスではなく、これを継承した独自のクラスのインスタンスとすることによりメソッドの適用方法をカスタマイズ(今回はログ出力)する。 総称関…

sumとaverage

プログラミングGaucheを読んでいる途中ですが、リストの再帰処理の復習として合計と平均算出を実装してみる。 sum 0を初期値とし、要素の値を加えた値を引数として渡して再帰していく。最後にその値を返すという末尾再帰による実装。 (define (sum lis) (let…

プログラミングGaucheの練習問題(オブジェクト-外部表現文字列変換)

プログラミングGaucheの14.3の練習問題(P203)をしてみる。 write-to-string オブジェクトを外部表現文字列にしたものを結果として返す手続き。 write手続きで文字列ポートへ書き込めば、call-with-output-stringがそのポートに書き込んだ内容を結果として返…

プログラミングGaucheの練習問題(入れ子リストへの手続き適用)

プログラミングGaucheの7.2の練習問題(P68)をしてみる。 for-each-numbersとmap-numbers これらは、filter関数でnumberのみにフィルタリングされたリストに対して、for-eachまたはmapを適用するだけなので、以下のとうり。 (define (for-each-numbers pred l…

プログラミングGaucheの練習問題(every-pred,any-pred)

プログラミングGaucheの8.3の練習問題(P101)をしてみる。lambda式を返せばよいということはすぐわかりましたが、可変長で渡される手続きをどう適用していくのか少し悩みました。より後ろのページ9.5節にあった「名前つきlet」を使って実装しました。 every-p…

プログラミングGaucheの練習問題(filter,length)

プログラミングGaucheの6.5の練習問題(P54)をしてみる。 Filter手続き 先頭の要素が条件を満たせば、その要素と再帰したfilter結果をくっつけたものを返す。満たせなければ、単にfilter結果を返す。 (define (filter pred lis) (if (null? lis) (list ) (if …