これも東大の 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