length
length はラットの長さを数える関数。
(use mymodule) (define length (lambda (lat) (cond ((null? lat) 0) (else (add1 (length (cdr lat))))))) (print (length '(hotdogs with musrard sauerkraut and pickles))) (print (length '(ham and cheese on rye)))
実行:
^o^ > gosh -I. length.scm 6 5
pick
pick はラットの中の n 番目のアトムを返す。
(use mymodule) (define pick (lambda (n lat) (cond ((zero? (sub1 n)) (car lat)) (else (pick (sub1 n) (cdr lat)))))) (print (pick 4 '(lasagna spaghetti ravioli macaroni meatball)))
(cdr lat)
で再帰するときに、同時に (sub1 n)
をすることで何番目かを数えている。終了条件が (zero? (sub1 n))
なのは、インデックスが1から始まると考えているからだろう。
実行:
^o^ > gosh -I. pick.scm macaroni
rempick
rempick は n 番目のアトムを取り除いたラットを返す。
(use mymodule) (define rempick (lambda (n lat) (cond ((zero? (sub1 n)) (cdr lat)) (else (cons (car lat) (rempick (sub1 n) (cdr lat))))))) (print (rempick 3 '(hotdogs with hot mustard)))
実行:
^o^ > gosh -I. rempick.scm (hotdogs with mustard)