scheme
仕事が忙しくてだいぶあいてしまったけど、今日から再開。 6.6 2種類の再帰 再帰的に呼ばれた手続きの返す値が、もとの手続きの返す値になっているものが末尾再帰。 7.1 手続きオブジェクト lambda式は評価されると手続きオブジェクトになる。今日はここまで
ゆだんするとすぐ3日くらい空いちゃう。なるべく毎日やるぞ。リストの要素を逆転するreverseを考えてみる (define (reverse lis) (fold cons '() lis)) ;;; もしくは (define (reverse lis) (if (null? (cdr lis)) lis (append2 (reverse (cdr lis)) (list (…
6.5簡単なリスト処理(のつづき) 2つのリストを連結する手続きappend2 (define (append2 a b) (if (pair? a) (cons (car a) (append2 (cdr a) b)) b)) gosh> (append2 '(1 2 3 4) '(10 9)) (1 2 3 4 10 9) gosh> (append2 '() '(10 9)) (10 9) gosh> (appen…
6.5 簡単なリスト処理 空でないリストの最後の対を見つけるlast-pairを書いてみる。こんな感じだろうか? (define (last-pair2 lis) (if (pair? lis) (last-pair2 (cdr lis)) lis)) gosh> (last-pair2 '(1 2 3)) () gosh> (last-pair2 '(1 . 3)) 3 だめだ。…
6.4 foldの定義 foldの定義を書いてみる。 自力で考えてみるか。 … 10分くらいゴニョゴニョやってみたがわからんかった。正解は (define (fold proc init lis) (if (null? lis) init (fold proc (proc (car lis) init) (cdr lis)))) まずlisが空リストの時に…
6.3 リストの走査 fold 手続きと初期値、リストを引数にとり、初期値とリストの最初の値を手続きに渡し、その結果とリストの2番目の値を手続きに渡し、、、という処理を行う手続き。 ちょっとわかりにくい。 gosh> (fold + 0 '(1 2 3 4 5)) 15 gosh> (fold *…
6.1 リスト データとしてのリストをプログラム中に含めたい場合は'(クォート)をリストの前に付加する。 クォートがない場合はデータではなくプログラム(なので1番目の要素は手続きである必要がある) gosh> '(1 2 3) (1 2 3) リストを連結する手続きappen…
5.1 スクリプト Gaucheのスクリプトエンジンgoshは引数にファイル名を渡すと、それをSchemeプログラムとして読み込み、中に書かれている式を順に評価する。そして、ファイルの読み込みが終了したあと、その中にmainという手続きの定義があればそれを呼び出す…
1.3 Scheme Schemeの最も基本的なルール lambda式は、「レキシカルな環境を保持した手続き」(クロージャ)へと評価される 手続き呼び出しは継続を伴った引数つきgotoである 1番目のほうは、"lambda式"という言葉はわかる。"「レキシカルな環境を保持した手…
去年Gauche本を買って少し読んでいたのだけど、いつのまにか放置になっていたのを再開してみようと思う。 現時点でのGauche(Scheme)を学ぶ目的は Lispのマクロを理解し使いこなせるようになること。 継続をきちんと理解すること。 Gaucheでツールやアプリ…