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をわざわざ書かなくてもいいのね。


今日はここまで。