6.4 KiB
6.4 KiB
title | author | date | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|
なんかもっと簡単なところからやりたい | kazu634 | 2008-08-20 |
|
|
ちょっぴり置いてけぼりな感じを味わっているので、もう少し時間をかけてやっていこうと思う。というわけで、id:hayamizがEmacs勉強会でお勧めしてたIndex of /scheme/t-y-schemeを読み始める。これをやってから、もういちど『プログラミングGauche』に挑戦しようと思う。
letrecとか完全に誤解していた気がする
わかったこと:
letはlambdaを言い換えている構文。だからブロックを作って、そのブロックの中で通用するローカル変数を持って結果を返しているイメージ…なのかな?たぶん。lispとperlで比較:
gosh> (let ((a 3) (b 5)) (+ (* a a) (* b b))) 34
# === use === use strict; use warnings; # === main === { my $a = 3; my $b = 5; print(($a * $a) + ($b + $b), "\n"); } # print ($a); # これはエラーになる
letrecはlambdaで再帰的な手続きを作るときに用いるイメージなのかな?うでも、perlだとforeachとかすごくしたくなるかも(数字かどうかのチェックは省略)。
gosh> (letrec ((sum (lambda (lis) (cond [(null? lis) ] [(number? (car lis)) (+ (car lis) (sum (cdr lis)))] [else (sum (cdr lis))])))) (sum '(1 2 3 4 5))) 15
# === use === use strict; use warnings; my $ res = ; # === main === my @i = (1, 2, 3, 4, 5); print (&sub_sum(@i), "\n"); # === sub === sub sub_sum{ my $x; my @y; ($x, @y) = @_; if ( == @y){ return ; } else { $res = $x + &sub_sum(@y); } return $res; }