この規格ページの目次
66
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(char>= #\a #\a) ⇒ t
13. リストクラス
クラス<list>は,二つの下位クラス<cons>及び<null>に分割される。
13.1 コンス
コンス(“ドット対”とも呼ばれる。)は,二つの構成要素をもつ。左側の構成要素をcar
と呼び,右側の構成要素をcdrと呼ぶ。このクラスの生成関数は,consとする。コンスは,次のとおり表
記する。
(car .cdr)
ここで,car及びcdrは,それぞれコンスオブジェクトのcar要素及びcdr要素の値を表す。特別な場合
として,cdrの値がnilであるとき,コンスオブジェクトは,次のとおり表記する。
(car)
一般に,コンスオブジェクトから構成されるデータ構造は,次のいずれかの書式で表記する。
(x1 .(x2 .... (xn-1 .xn) ...))
(x1 .(x2 .... (xn-1) ...))
これらはそれぞれ,次のとおり表記できる。
(x1 x2...xn-1 .xn)
(x1 x2...xn-1)
(consp obj) →真偽値 関数
関数conspは,objがコンス(クラス<cons>のインスタンス)である場合はtを返し,それ以外の場合は
nilを返す。objは,いかなるISLISPオブジェクトでもよい。
例 (consp (a . b)) ⇒ t
(consp (a b c)) ⇒ t
(consp ()) ⇒ nil
(consp #(a b)) ⇒ nil
(cons obj1 obj2) →<cons> 関数
関数consは,二つのオブジェクトからコンスを作成して返す。obj1をそのcar要素とし,obj2をcdr要素
とする。要求されたコンスが割り当てられない場合は,エラーが発生する(エラー名cannot-create-cons)。
obj1及びobj2は,いかなるISLISPオブジェクトでもよい。
例 (cons a ()) ⇒ (a)
(cons (a) (b c d)) ⇒ ((a) c d)
(cons "a" (b c)) ⇒ ("a" b c)
(cons a 3) ⇒ (a . 3)
(cons (a b) (c) ⇒ ((a b) . c)
(car cons) →<object> 関数
関数carはconsのcar要素を返す。consがコンスでない場合は,エラーが発生する(エラー名domain-error)。
例 (car ()) エラーが発生する。
(car (a b c)) ⇒a
(car ((a) c d)) ⇒ (a)
――――― [JIS X 3012 pdf 71] ―――――
67
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(car (1 .2)) ⇒1
(cdr cons) →<object> 関数
関数cdrはconsのcdr要素を返す。consがコンスでない場合は,エラーが発生する(エラー名domain-error)。
例 (cdr ()) エラーが発生する。
(cdr ((a) c d)) ⇒ (b c d)
(cdr (1 .2)) ⇒2
(setf (car cons) bj) →<object> 特殊形式
(set-car obj cons) →<object> 関数
これらは,carで示される場所指定を受け取り,<cons>クラスのインスタンスのcar要素をobjで更新す
る。返り値はobjとする。consがコンスでない場合は,エラーが発生する(エラー名domain-error)。obj
は,いかなるISLISPオブジェクトでもよい。
例 (let((x (list apple orange)))
(list x (carx)
(setf (car x) banana)
x (car x)))
⇒ ((banana orange) pple banana (banana orange) anana)
(setf (cdr cons) bj) →<object> 特殊形式
(set-cdr obj cons) →<object> 関数
これらは,cdrで示される場所指定を受け取り,<cons>クラスのインスタンスのcdr要素をobjで更新す
る。返り値は,objとする。consがコンスでない場合は,エラーが発生する(エラー名domain-error)。obj
は,いかなるISLISPオブジェクトでもよい。
例 (let ((x (list apple orange)))
(list x (cdr x)
(setf (cdr x) banana)
x (cdr x)))
⇒ ((apple . banana) (orange) anana (apple . banana) anana)
13.2 空リストクラス
このクラスは,nilと呼ばれるただ一つの要素からなる。このオブジェクトは,真
偽値式における偽の値とする。列nilの長さは,0とする。
(null obj) →真偽値 関数
関数nullは,objがnilである場合はtを返し,それ以外の場合はnilを返す(5)。objは,いかなるISLISP
オブジェクトでもよい。
注(5) 命名の方式を厳格に守るならば,nullは,nullpと名付けられなければならない。しかし,歴史
的及び互換性の理由で,nullと名付ける。
例 (null (abc)) ⇒ nil
(null ()) ⇒ t
(null (list)) ⇒ t
――――― [JIS X 3012 pdf 72] ―――――
68
X 3012 : 1998 (ISO/IEC 13816 : 1997)
13.3 リスト操作
(listp obj) →真偽値 関数
関数listpは,objがリスト(クラス<list>のインスタンス)である場合はtを返し,それ以外の場合はnil
を返す。objは,いかなるISLISPオブジェクトでもよい。
例 (listp (a b c)) ⇒ t
(listp ()) ⇒ t
(listp (a .b)) ⇒ t
(let ((x (list a)))
(setf (cdr x) x)
(listp x)) ⇒ t
(listp "abc") ⇒ nil
(listp #(1 2)) ⇒ nil
(listp takayasu) ⇒ nil
(create-list i [initial-element]) →<list> 関数
関数create-listは,長さiのリストを生成して返す。initial-elementが与えられた場合,新しいリストの要
素を,このオブジェクトで初期化する。そうでなければ,初期化は処理系定義とする。要求されたリスト
の割当てができない場合は,エラーが発生する(エラー名cannot-create-list)。iが非負整数でない場合は,
エラーが発生する(エラー名domain-error)。initial-elementは,いかなるISLISPオブジェクトでもよい。
例 (create-list 3 17) ⇒ (17 17 17)
(create-list 2 #\a) ⇒ (#\a #\a)
(list obj*) →<list> 関数
関数listは,その長さが引数の個数と一致し,すべての引数を同じ順序で要素とする新しいリストを返
す。要求されたリストの割当てができない場合は,エラーが発生する(エラー名cannot-create-list)。各obj
は,いかなるISLISPオブジェクトでもよい。
例 (list a(+ 3 4) ) ⇒ (a 7 c)
(list) ⇒ nil
(reverse list) →<list> 関数
(nreverse list) →<list> 関数
これらの関数は,どちらも与えられたlistの要素の順序が逆転したリストを返す。listがリストでない場
合は,エラーが発生する(エラー名domain-error)。
reverseでは,与えられたlistに対する副作用はない。結果となるリストは,与えられたlistと構造を共
有してもよい。
nreverseでは,新しいリストを作る目的で,与えられたlistの最上位を構成するコンスに対して副作用を
及ぼしてもよい。リテラルオブジェクトに対しては,nreverseを適用してはならない。
例 (reverse (a b c d e)) ⇒ (e d c b a)
(reverse (a)) ⇒ (a)
――――― [JIS X 3012 pdf 73] ―――――
69
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(reverse ()) ⇒ ()
(let* ((x (list a b)) (y (nreverse x))) (equal x y)) ⇒ 処理系定義
(append list*) →<list> 関数
関数appendは,すべてのlistを連結した結果を返す。listが与えられなかった場合は,()を返す。list
のいずれかがリストでない場合は,エラーが発生する(エラー名domain-error)。
この関数は,その引数を変更しない。結果と引数listとが構造を共有するかどうか,更に,どのような
場合に共有するかは,処理系定義とする。
リストの割当てができない場合は,エラーが発生する(エラー名cannot-create-list)。
例 (append (a b c) (d e f)) ⇒ (a b c d e f)
(member obj list) →<list> 関数
関数memberは,listの中にobjとeqlであるオブジェクトが含まれている場合,そのcarがobjとeqlで
あるlistの最初の部分リストを返す。そうでなければnilを返す。listがリストでない場合は,エラーが発
生する(エラー名domain-error)。
例 (member c (a b c d e f)) ⇒ (c d e f)
(member g (a b c d e f)) ⇒ nil
(member c (a b c a b c)) ⇒ (c a b c)
(mapcar function list+) →<list> 関数
(mapc function list+) →<list> 関数
(maplist function list+) →<list> 関数
(mapl function list+) →<list> 関数
(mapcan function list+) →<list> 関数
(mapcon function list+) →<list> 関数
これらの関数は,与えられた一連のlistによって決定される引数の集合に,与えられたfunctionを連続し
て適用する。引数を決定する方法及び結果を蓄積していく方法が,関数によって異なる。
関数 引数 結果
mapcar 要素 返り値のリスト
mapc 要素 最初のlist
maplist 部分リスト 返り値のリスト
mapl 部分リスト 最初のlist
mapcan 要素 返り値を破壊的に連結した結果
mapcon 部分リスト 返り値を破壊的に連結した結果
mapcarは,各listの要素に対して順に演算を行う。functionは,各listの第1要素に対して適用され,次
に各listの第2要素に対して適用され,これを順次繰り返す。最も短いlistが終わったときに,繰返しは終
了し,他のリストの余った要素は無視される。mapcarが返す値は,functionの呼出し順にそれらの結果を
リストにしたものとする。
mapcは,mapcarと似ているが,functionの適用結果を蓄積しない点が異なる。関数mapcは,最初のlist
を返す。
maplistは,mapcarと似ているが,functionを各listの部分リストに適用する点が異なる。functionは,各
――――― [JIS X 3012 pdf 74] ―――――
70
X 3012 : 1998 (ISO/IEC 13816 : 1997)
list自身に最初に適用され,次に各listのcdrに適用され,次に各listのcdrのcdrに適用され,これを順次
繰り返す。
maplは,maplistと似ているが,functionの適用結果を蓄積しない点が異なる。関数maplは,最初のlist
を返す。
mapcan及びmapconは,それぞれmapcar及びmaplistに似ているが,functionの適用結果を一つのリスト
に結合する際に,listではなくappendと同様の操作を破壊的に実行する演算を用いる点が異なる。
functionが関数でない場合は,エラーが発生する(エラー名domain-error)。listのいずれかがリストでな
い場合は,エラーが発生する(エラー名domain-error)。
いずれの関数においても,functionの呼出しは左から右へと進む。したがって,functionが副作用をもつ
場合,利用者はこの順序に依存してよい。
例 (mapcar #car ((1 a) (2 b) (3 c))) ⇒ (1 2 3)
(mapcar #abs ((3 -4 2 -5 -6)) ⇒ (3 4 2 5 6)
(mapcar #cons (a b c) (1 2 3)) ⇒ ((a . 1) (b . 2) (c .3))
(let ((x 0)) (mapc (lambda (v) (setq x (+ x v))) (3 5)) ) ⇒8
(maplist #append (1 2 3 4) (1 2) (1 2 3))
⇒ ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3))
(maplist (lambda (x) (cons foo x)) (a b c d))
⇒ ((foo a b c d) (foo b c d) (foo c d) (foo d))
(maplist (lambda (x) (if (member (car x) (cdr x)) 0 1))
(a b a c d b c))
⇒ (0 0 1 0 1 1 1)
(let ((k 0))
(mapl(lambda (x)
(setq k (+ k (if (member (car x) (cdr x)) 0 1))))
(a b a c d b c))
k)
⇒4
(mapcan (lambda (x) (if (> x 0) (list x))) (-3 4 0 5 -2 7))
⇒ (4 5 7)
(mapcon (lambda (x) (if (member (car x) (cdr x)) (list (car x))))
(a b a c d b c b c))
⇒ (a b c b c)
(mapcon #list (1 2 3 4)) ⇒ ((1 2 3 4) (2 3 4) (3 4) (4))
――――― [JIS X 3012 pdf 75] ―――――
次のページ PDF 76
JIS X 3012:1998の引用国際規格 ISO 一覧
- ISO/IEC 13816:1997(IDT)
JIS X 3012:1998の国際規格 ICS 分類一覧
- 35 : 情報技術.事務機械 > 35.060 : 情報技術に使用される言語