(なんで背景黒くなっちゃうの?)
9LISPは毎回宿題が出るので取り合えずかいつまんでやってみます。(今のところ私が適当に見繕って出してるわけですが・・・)
;; 次のコードの評価を考えてみる |
評価順序とスコープについて考えさせられます。目が慣れないと面食らいそうです。評価すると5が返ります。
インデントを付けてみます。
(((lambda (x) |
次のlet式と等価と言ってよさそうです。
(let ((x 2)) |
これも上記と等価。
(let* ((x 2) |
let式は初期値式が先に全て評価された後、変数名に束縛されるため下記のコードはエラーとなります。つまりbの位置からaは見えない。
(let ((a 10) |
letrec
初期値式が評価される時に同一レベルの束縛されていない変数名(値不定)も見えている。
(letrec ((a 10) |
無名関数でスコープを作ったり真偽値を定義したり条件分岐してみたり、無名関数で再帰してみたりということについてはラムダ計算について調べるとおもしろそうです。
組み込みの特殊形式ifと同じ動作をするnew-if手続きを定義してみる
ifがなぜ特殊形式であるか考えてみる(SICPより)
(define new-if (new-if #t 1 2) ; -> 1 ; -> 2 ; -> 10 |
(new-if #t (print 10)(print 20)) を見るとわかる通り、引数が両方とも評価されています。組み込みのifはpredicateによってちゃんとどちらか一方が評価されます。このnew-ifで再帰を書くと大変なことになりますね。
こうしちゃえばどうかな・・・。
((new-if #t (lambda ()(print 10))(lambda ()(print 20)))) |
引数がatomであるか判定するatom?手続きを定義してみる(The Little Schemerより)
(define atom? |
これでも良いのか?
(define atom? |
あーダメか、ベクタとか。でもそれだと上のもダメか・・・。どうしたらいいんだ。取り合えずこれで。
引数のリストの要素がすべてatomであるか判定するlat?手続きを定義してみる(The Little Schemerより)
(define lat? |
引数で指定されたatomが引数のリスト内に存在するか判定するmember?手続きを定義してみる(The Little Schemerより)
(define member? |
またはこんなの。
(define member? |
FizzBuzz
(use srfi-1) |
これはプログラミングGaucheで見かけたコードが印象に残ってる。
こんなのもありかな。
(((lambda (f) |
(define fact |
またはこんなのもありかな。
(use srfi-1) |
他にもfoldとか・・・。
(use srfi-1) |
継続渡しスタイルだとこう?
(define fact/cps |
(define fib |
(define collatz |
(define Ackerman |
引数を大きくすると大変です。
階乗 - 末尾再帰
(define tail-call-fact |
フィボナッチ数を末尾再帰で書く、というところでギブ。おやすみなさい。
posted with amazlet at 09.05.10 猪股 俊光 益崎 真治 |
プログラミングGauche posted with amazlet at 09.10.26 Kahuaプロジェクト オライリージャパン 売り上げランキング: 111091 おすすめ度の平均: Gauche以外のSchemeの入門書としても最適 日本が米国に先行している稀な事例 |
posted with amazlet at 09.03.30 Daniel P. Friedman Matthias Felleisen おすすめ度の平均: 小さなScheme処理系で学ぶ数学基礎理論 |
posted with amazlet at 09.03.17 ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン おすすめ度の平均: 訳が酷い |
0 件のコメント:
コメントを投稿