開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
プログラミングGauche(Kahuaプロジェクト (著)、 川合 史朗 (監修)、オライリージャパン)の7章(手続き)、7.2(手続きを取る手続き)、練習問題(p.68)を解いてみる。
その他参考書籍
- Scheme手習い(Daniel P. Friedman (著), Matthias Felleisen (著), 元吉 文男 (翻訳), 横山 晶一 (翻訳), オーム社)
- 計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
練習問題(p.68)
コード(BBEdit, Emacs)
sample.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- ;; これまでに書いた手続き (load "./procedures.scm") (define (for-each-numbers proc lis) (for-each proc (filter number? lis))) (define (map-numbers proc lis) (map proc (filter number? lis))) (define (numbers-only proc) (lambda (proc1 lis) (proc proc1 (filter number? lis)))) ;;; (numbers-only for-each)や(numbers-only map)をtree-walkに渡しても、入れ子にな ;;; ったリストが数値かどうか判定することになり、入れ子にったリストの要素が数値かどうか ;;; 判定することにはならないから目的は達成できない ;;; 目的を達成するには、walkerの数値かどうか判定する部分は、入れ子になったリストの要素 ;;; 判定するという条件を満たさなければなならない ;; ネストされたリストの要素まで判定するようにしたfilterに似た手続き (define (filter-for-tree pred tree) (cond ((null? tree) '()) ((pair? (car tree)) (cons (filter-for-tree pred (car tree)) (filter-for-tree pred (cdr tree)))) ((pred (car tree)) (cons (car tree) (filter-for-tree pred (cdr tree)))) (else (filter-for-tree pred (cdr tree))))) ;; フィルタリングした木(入れ子になったリスト)にする (define (numbers-only-for-tree proc) (lambda (proc1 tree) (proc proc1 (filter-for-tree number? tree))))
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
gosh> #t gosh> (for-each-numbers print '(1 2 #f 3 4 #t)) 1 2 3 4 #<undef> gosh> (map-numbers (lambda (x) (* x 2)) '(1 2 #f 3 4 #t)) (2 4 6 8) gosh> ((numbers-only for-each) print '(1 2 #f 3 4 #t)) 1 2 3 4 #<undef> gosh> ((numbers-only map) (lambda (x) (* x 2)) '(1 2 #f 3 4 #t)) (2 4 6 8) gosh> (tree-walk (numbers-only map) print '((1 2 3) (#t #f #t) 4 5 #t #f (6 (7 8)) (#t (#f #t)))) 4 5 (#<undef> #<undef>) gosh> (tree-walk (numbers-only map) (lambda (x) (* x 2)) '((1 2 3) (#t #f #t) 4 5 #t #f (6 (7 8)) (#t (#f #t)))) (8 10) gosh> (tree-walk (numbers-only-for-tree for-each) print '((1 2 3) (#t #f #t) (1 #t 3) (#t 2 #f) 4 5 #t #f (6 (7 8)) (#t (#f #t)) (6 (#t 7)) (#t (6 #f)))) 1 2 3 1 3 2 4 5 6 7 8 6 7 6 #<undef> gosh> (tree-walk (numbers-only-for-tree map) (lambda (x) (* x 2)) '((1 2 3) (#t #f #t) (1 #t 3) (#t 2 #f) 4 5 #t #f (6 (7 8)) (#t (#f #t)) (6 (#t 7)) (#t (6 #f)))) ((2 4 6) () (2 6) (4) 8 10 (12 (14 16)) () (12 (14)) ((12))) gosh>
0 コメント:
コメントを投稿