リストを作成する


Tags: リスト, R6RS

quote を使うとリストを定数として書くことができる。また、 list 手続きを使うと新たにリストを作成することができる。

(import (rnrs))

'(1 2 3 4) ; => (1 2 3 4)
(list 1 2 3 4) ; => (1 2 3 4)

ただし、 quote を使って作成したリストを変更しようとすると例外が発生するので注意。

(import (rnrs) (rnrs mutable-pair))

(define x '(1 2 3 4))
(define y x)

(set-car! y 0) ; => &assertion

リストは cons セルを数珠繋ぎにしたものなので、 cons を組み合わせることでもリストを構成できる。

(import (rnrs))

(cons 1 '()) ; => (1)
(cons 1 (cons 2 (cons 3 '(4 5)))) ; => (1 2 3 4 5)

入れ子になった cons の代わりには cons* 手続きを使うと便利である。

(import (rnrs))

(cons* 1 2 3 '(4 5)) ; => (1 2 3 4 5)

評価の必要な要素が quote の必要な要素よりも少ない場合や、リストの雛形を用意しておいて、そこに値を埋め込むような場合には quasiquote を使った方がよいこともある。

(import (rnrs))

(define (f x y)
  `(a b ,x e ,y g h)) ; === (list 'a 'b x 'e y 'g 'h)

(define (make-if c t e)
  `(if ,c ,t ,e)) ; === (list 'if c t e)

(define (make-when c . body)
  `(when ,c ,@body)) ; === (cons* 'when c body)