Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2006-09-17

勉強するよ.10

| 21:48 | 勉強するよ.10 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.10 - わだばLisperになる

Schemeの勉強.10

今日は、第10章終了。

連想リスト近辺。前回に引き続きdefstructを使用しな

いで、define-classを使ってみる。

この章は説明が少な過ぎる気が。

せめて作った関数の使用例位あっても良いのでは、とか

思う。

table-for-eachなどは使い道も良く分からず。

(define-class table ()
  ((equ :init-keyword :equ :init-value eqv?)
   (alist :init-keyword :alist :init-value '())))

(define table-get
  (lambda (tbl k . d)
    (let ((c (lassoc k (ref tbl 'alist) (ref tbl 'equ))))
      (cond (c (cdr c))
            ((pair? d) (car d))))))

;(define foo
;  (make table
;    :alist '((a . 1)(b . 2)(c . 3))))
;
;(table-get foo 'a)
;=> 1

(define table-put!
  (lambda (tbl k v)
    (let ((al (ref tbl 'alist)))
      (let ((c (lassoc k al (ref tbl 'equ))))
        (if c (set-cdr! c v)
            (set! (ref tbl 'alist) (cons (cons k v) al)))))))

;(table-put! foo 'a 33)
;
;(table-get foo 'a)
;=>33

(define table-for-each
  (lambda (tbl p)
    (for-each
     (lambda (c)
       (p (car c) (cdr c)))
     (ref tbl 'alist))))