SICPを読む(106) 3.3.3 - assoc

あぁ、assocして、set-cdr!すれば、alistが更新できるのか。

すると、リストの中のシンボルの数を数えたくなったら、こう書ける。

(define (collect l)
  (let ((collects '()))
    (for-each
      (lambda (key)
        (let ((record (assoc key collects)))
          (if record
              (set-cdr! record (+ 1 (cdr record)))
              (set! collects (cons (cons key 1) collects)))))
      l)
    collects))

(collect '(a a a b b c c a)) ; ((c . 2) (b . 2) (a . 4))

for-eachって気持ち悪いな。