2014年3月14日金曜日

開発環境

プログラミングGauche(Kahuaプロジェクト (著)、 川合 史朗 (監修)、オライリージャパン)の7章(手続き)、7.2(手続きを取る手続き)、練習問題(p.68)を解いてみる。

その他参考書籍

練習問題(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 コメント:

コメントを投稿