Gauche本勉強メモ(3日目)
6.1 リスト
データとしてのリストをプログラム中に含めたい場合は'(クォート)をリストの前に付加する。
クォートがない場合はデータではなくプログラム(なので1番目の要素は手続きである必要がある)
gosh> '(1 2 3) (1 2 3)
リストを連結する手続きappend
gosh> (append '(1 2 3) '(4 5 6)) (append '(1 2 3) '(4 5 6)) (1 2 3 4 5 6)
6.2 リストの基本操作
gosh> (define lis '(1 2 3)) lis gosh> lis (1 2 3) gosh> (car lis) 1 gosh> (cdr lis) (2 3) gosh> (cdr (cdr lis)) (3) gosh> (cdr (cdr (cdr lis))) () gosh> (cons 1 '(2 3)) (1 2 3) gosh> (cons 3 '()) (3) gosh> (cons 1 (cons 2 (cons 3 '()))) (1 2 3) gosh> (list 1 2 3) (1 2 3)
car, cdr, cons, list
まあ、この辺はいいかという感じ。
gosh> (cons 1 3) (cons 1 3) (1 . 3)
(1 . 3)はドット対。最後が空リストで終わっていない場合はドットリストと呼ぶ。ドット対はドットリストの特別な場合。
gosh> (null? '(1 2 3)) #f gosh> (null? '()) #t gosh> (null? 3) #f gosh> (pair? '(1 2 3)) #t gosh> (pair? '()) #f gosh> (pair? 3) #f
手続きnull?は引数が空リストなら真値、でなければ偽値を返す。
手続きpair?は引数が空でないリストなら真値、でなければ偽値を返す。
car, cdr, cons, null?, pair?を使って手続きlist?(正式なリストであれば真値、でなければ偽値を返す)を考えてみる。
(define (list? obj) (if (null? obj) #t (if (and (pair? obj) (list? (cdr obj))) #t #f))) (define (list? obj) (or (null? obj) (and (pair? obj) (list? (cdr obj)))))
自分で書いたのが上、本に載っていたのが下。
最後に評価した値を返すから、返す値として#tとか#fをわざわざ書かなくてもいいのね。
今日はここまで。