これも東大の Scheme演習のページから。
cf. Scheme演習 第3回
の問2。
(map proc list)
リストlistの要素一つ一つに対して一引数関数procを適用し、結果をリストにして返す関数。
実行例> (map (lambda (x) (+ x 1)) (list 1 2 3 4)) (2 3 4 5)
(define map
  (lambda (proc lis)
    (if (null? lis)
        (quote ())
        (cons (proc (car lis)) (map proc (cdr lis))))))
(print (map (lambda (x) (+ x 1)) (list 1 2 3 4)))
^o^ > gosh map.scm (2 3 4 5)
(add-squares list)
数のリストlistの要素の平方の和を返す関数。
実行例> (add-squares (list 1 10 100)) 10101
(define add-squares
  (lambda (lis)
    (if (null? lis)
        0
        (+ (* (car lis) (car lis)) (add-squares (cdr lis))))))
(print (add-squares (list 1 10 100)))
cond じゃなくて if を使ってみた。
^o^ > gosh add-squares.scm 10101
(reverse list)
リストlistを逆順にしたリストを返す関数。
実行例> (reverse (list 1 2 3 4)) (4 3 2 1)
(define reverse
  (lambda (lis)
    (define rev
      (lambda (l1 l2)
        (if (null? l1)
            l2
            (rev (cdr l1) (cons (car l1) l2)))))
    (rev lis (quote ()))))
(print (reverse (list 1 2 3 4)))
^o^ > gosh reverse.scm (4 3 2 1)
(assq obj alist)
ペアやリストを直接の要素とするリスト(連想リストという)alistを受け取り、その要素のうちcar部がobjと等しいような最左のものを返す関数
(ここで等しいとは、eq?による比較)
見つからない場合は#fを返す。> (define dic '((ami net) (ame rain) (ame candy))) > (assq 'ame dic) (ame rain) > (assq 'amedama dic) #f
(define assq
  (lambda (obj alist)
    (cond
      ((null? alist) #f)
      ((eq? (car (car alist)) obj) (car alist))
      (else (assq obj (cdr alist))))))
(define dic '((ami net) (ame rain) (ame candy)))
(print (assq 'ame dic))
(print (assq 'amedama dic))
^o^ > gosh assq.scm (ame rain) #f