Scheme演習 第3回 reverse

http://www-ui.is.s.u-tokyo.ac.jp/~hara2001/scheme/material/3/3.mtd.column.html#exより。

(add-squares list)を書きました。

guile> (define (add-squares lst)
...      (define (sum-iter sum-lst)
...        (if (null? sum-lst)
...            0
...            (+ (car sum-lst) (sum-iter (cdr sum-lst)))))
...      (sum-iter (map (lambda (x) (* x x)) lst)))
guile> (add-squares '(1 10 100))
10101

(sum-iter sum-lst)の中でうっかりlstを使ってしまってハマった。外側の定義ほど冗長な名前にした方が良いのかも。今回なら、(add-squares add-squares-lst)、(sum-iter lst)といった感じに…。

(reverse list)を書きました。

guile> (define (reverse lst)
...      (define (reverse-iter lls lrs)
...        (if (null? (cdr lls))
...            (cons (car lls) lrs)
...            (if (null? lrs)
...                (reverse-iter (cdr lls) (list (car lls)))
...                (reverse-iter (cdr lls) (cons (car lls) lrs)))))
...      (reverse-iter lst '()))
guile> (reverse '(1 2 3 4))
(4 3 2 1)

最初は(cons (reverse (cdr lst)) (car lst))などとしてネストした結果が返ってきて悩んだ。

(assq obj alist) (追記: 06/05/04 0:43)

(define (assq object alist)
  (define (check-elem proc lst)
    (cond ((null? lst) #f)
          ((proc (car lst)) (car lst))
          (else (check-elem proc (cdr lst)))))
  (check-elem (lambda (item)
               (if (eq? object (car item))
                   #t
                   #f)) alist))

guile> (load "assq.scm")
guile> (assq 'ame dic)
(ame rain)

なかなか難しかった。

エラーなしに一発で書くのは難しいですね。インタラクティブシェルだとその行書いてしまったらもう戻れないのが痛い。。。

案外めんどくさがらずにエディタの上で書いた方が何度も打ち直さずに済んでよいかも。(実はいちいちファイルを増やしたくないだけなのだけど。