この規格ページの目次
21
X 3012 : 1998 (ISO/IEC 13816 : 1997)
tは記号tを表す識別子であり,nilは記号nilを表す識別子とする(記号nilは,空リストでもある。)。
nilは,クラス<null>の唯一のインスタンスとする。
真偽値関数と同様に,and形式及びor形式は,真又は偽を返す。しかし,返される値は,条件が満たさ
れない場合はnilであり,そうでなければnil以外の値とする。つまり,and及びorは,準真偽値を値とす
る。
t→<symbol> 名前付き定数
nil→<null> 名前付き定数
tは,記号tを値とする名前付き定数とする。nilは,記号nilを値とする名前付き定数とする。
5.2 クラス述語
次の関数は,1引数のクラス述語とする。
basic-array*-p floatp integerp stringp
basic-array-p functionp listp symbolp
basic-vector-p general-array*-p null
characterp general-vector-p numberp
consp generic-function-p streamp
なお,関数instancepは,クラスのインスタンスか否かを判定する,2引数の述語とする。
5.3 等価性
(eq obj1 obj2) →真偽値 関数
(eql obj1 obj2) →真偽値 関数
関数eq及び関数eqlは,引数obj1と引数obj2とが,同一のオブジェクトであるか否かを判定する。これ
らの関数は,二つの引数が同一のオブジェクトであればtを返し,そうでなければnilを返す。二つのオブ
ジェクトは,それらを(オブジェクトの変更なしに)区別する操作がなく,かつ,一つのオブジェクトの
変更がもう一つのオブジェクトを同じように変更する場合に同一とする。
関数eqでは,引数がいずれも数値であるか,又はいずれも文字である場合は,結果は未定義とする。関
数eqlでは,数値及び文字に対する意味は次のとおり定義する。
・ 引数obj1及び引数obj2が数値であれば,eqlは,二つの引数が同じクラスの直接インスタンスであり,
かつ,同じ値をもつか否かを判定する。
処理系が,正のゼロ及び負のゼロを異なる値として実装していれば, (eql 0.0 -0.0) はnilを返す。
-0.0が読み込まれた場合に,値0.0と解釈されるならば, (eql 0.0 -0.0) はtを返す。
・ 引数obj1及び引数obj2が文字ならば,eqlは,それらが同じ文字か否か(char=参照)を判定する。
例 (eql () ()) ⇒ t
(eq () ()) ⇒ t
(eql () ()) ⇒ t
(eq () ()) ⇒ t
(eql a a) ⇒ t
(eq a a) ⇒ t
(eql a A) ⇒ t
(eq a A) ⇒ t
(eql a b) ⇒ nil
(eq a b) ⇒ nil
――――― [JIS X 3012 pdf 26] ―――――
22
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(eql f nil) ⇒ nil
(eq f ml) ⇒ nil
(eql 2 2) ⇒ t
(eq 2 2) ⇒ nil又はt (処理系定義)
(eql 2 2.0) ⇒ nil
(eq 2 2.0) ⇒ nil
(eql 100000000 100000000) ⇒ t
(eq 100000000 100000000) ⇒ nil又はt(処理系定義)
(eql 10.00000 10.0) ⇒ t
(eq 10.00000 10.0) ⇒ nil又はt(処理系定義)
(eql (cons 1 2) (cons 1 2)) ⇒ nil
(eq (cons 1 2) (cons 1 2)) ⇒ nil
(let ((x (a))) (eql x x)) ⇒ t
(let ((x (a))) (eq x x)) ⇒ t
(eql (a) (a)) ⇒ nil又はt(処理系定義)
(eq (a) (a)) ⇒ nil又はt(処理系定義)
(let ((x (b))
(y (a b)))
(eql x (cdr y))) ⇒ nil又はt(処理系定義)
(let ((x (b))
(y (a b)))
(eq x (cdr y))) ⇒ nil又はt(処理系定義)
(eql (b) (cdr (a b))) ⇒ nil又はt(処理系定義)
(eq (b) (cdr (a b))) ⇒ nil又はt(処理系定義)
(let ((p (lambda (x) )))
(eql p p)) ⇒ t
(let ((p (lambda (x) )))
(eq p p)) ⇒ t
(let ((x "a")) (eql x x)) ⇒ t
(let ((x "a")) (eq x x)) ⇒ t
(eql "a" "a") ⇒ nil又はt(処理系定義)
(eq "a" "a") ⇒ nil又はt(処理系定義)
(let ((x ""))(eql x x)) ⇒ t
(let ((x ""))(eq x x)) ⇒ t
(eql "" "") ⇒ nil又はt(処理系定義)
(eq "" "") ⇒ nil又はt(処理系定義)
(eql #\a #\A) ⇒ nil
(eq #\a #\A) ⇒ nil
(eql #\a #\a) ⇒ t
(eq #\a #\a) ⇒ nil又はt(処理系定義)
――――― [JIS X 3012 pdf 27] ―――――
23
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(eql #\space #\Space) ⇒ t
(eq #\space #\Space) ⇒ nil又はt(処理系定義)
(eql #\space #\space) ⇒ t
(eq #\space #\space) ⇒ nil又はt(処理系定義)
(equal obj1 obj2) →真偽値 関数
関数equalは,引数obj1及び引数obj2が同形 (isomorphic),すなわち,引数obj1及び引数obj2が等価な値
をもつ同じ構造を表すか否かを判定する。equalは,同形の場合はtを返し,そうでなければnilを返す。
正確には,次のとおり判定する。
引数obj1と引数obj2とが同じクラスの直接インスタンスである場合,その二つがeqlであるか又は次の
いずれかが成り立つときにequalはtを返す。これ以外の場合は,nilを返す。
a) リスト
(and (equal (car obj1) (car obj2))
(equal (cdr obj1) (cdr obj2)))
b) 配列
(equal (array-dimensions obj1)
(array-dimensions obj2))
が成り立ち,かつ,すべての正しい参照 (aref obj1 ind1 ... indn) に対して,次の条件が成り立つ。
(equal (aref obj1 ind1 ...indn)
(aref obj2 ind1 ...indn))
obj1及びobj2は,いかなるISLISPオブジェクトでもよい。
例 (equal a a) ⇒ t
(equal 2 2) ⇒ t
(equal 2 2.0) ⇒ nil
(equal (a) (a)) ⇒ t
(equal (a (b) ) (a (b) )) ⇒ t
(equal (cons 1 2) (cons 1 2)) ⇒ t
(equal (a) (list a)) ⇒ t
(equal "abc" "abc") ⇒ t
(equal (vector a) (vector a)) ⇒ t
(equal #(a b) #(a b)) ⇒ t
(equal #(a b) #(a c)) ⇒ nil
(equal "a" "A" ) ⇒ nil
5.4 論理演算
(not obj) →真偽値 関数
関数notは,論理否定であり,引数objがnilであればtを返し,そうでなければnilを返す。objは,い
かなるISLISPオブジェクトでもよい。
例 (not t) ⇒ nil
(not ()) ⇒ t
――――― [JIS X 3012 pdf 28] ―――――
24
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(not nil) ⇒ t
(not nil) ⇒ t
(not 3) ⇒ nil
(not (list)) ⇒ t
(not (list 3)) ⇒ nil
(and form*) →<object> 特殊演算子
andは,逐次的な論理積とする。引数form*は,そのいずれかのformの評価結果がnilであるか,又は引
数がなくなるまで,左から右に順に評価される。引数のいずれかの評価結果がnilであれば,andはnilを
返し,そうでなければ最後に評価した引数formの値を返す。and形式は,次の式と同値とする。
(and) ≡ t
(and form) ≡ form
(pdf 一覧ページ番号 )
≡ (if form1 (and form2...formn) il)
(and form1 form2 ... formn)
注(2) fの定義については,6.4参照。
例 (and (= 2 2) (> 2 1)) ⇒ t
(and (= 2 2) (< 2 1)) ⇒ nil
(and (eql a a) (not (> 1 2))) ⇒ t
(let ((x a)) (and x (setq x b))) ⇒b
(let ((x nil)) (and x (setq x b))) ⇒ nil
(let ((time 10))
(if (and (< time 24) (> time 12))
(- time 12) time)) ⇒ 10
(let ((time 18))
(if (and (< time 24) (> time 12))
(- time 12) time)) ⇒6
(or form*) →<object> 特殊演算子
orは,逐次的な論理和とする。引数form*は,そのいずれかのformの評価結果がnil以外の値であるか,
又は引数がなくなるまで,左から右に順に評価される。orは,引数のいずれかの評価結果がnil以外の値
であれば,そのnil以外の値を返し,そうでなければnilを返す。or形式は,次の式と同値とする。
(or) ≡ nil
(or form) ≡ form
(or form1 form2 ... formn) ≡ ((lambda (var) (if var var (or form2...formn))) orm1)
ここで,varは,form2...formnに現れないものとする。
例 (or (= 2 2) (> 2 1)) ⇒ t
(or (= 2 2) (< 2 1)) ⇒ t
(let ((x a)) (or x (setq x b))) ⇒a
(let ((x nil)) (or x (setq x b))) ⇒b
――――― [JIS X 3012 pdf 29] ―――――
25
X 3012 : 1998 (ISO/IEC 13816 : 1997)
6. 制御構造
6.1 定数
定数には,リテラル,引用形式及び名前付き定数の3種類がある。引用形式については,quote
参照。名前付き定数については,defconstant参照。
定数の値を変更しようとした場合は,結果は未定義とする。
constant →<object> 構文
クラス<basic-array>,<character>及び<number>のインスタンスは,リテラル定数とする。リテラル定数
constantを評価した結果は,そのconstant自身とする。
例 #2A((a b c) (d e f)) ⇒ #2A((a b c) (d e f))
#\a ⇒ #\a
145932 ⇒ 145932
"abc" ⇒ "abc"
#(abc) ⇒ #(abc)
(quote obj) →<object> 特殊演算子
obj →<object> 構文
quote形式は,引用形式 (quoted expression) と呼ばれ,ISLISPテキストにオブジェクトobjを埋め込むた
めに使用する。quote形式の評価結果は,objとする。
(quote obj)は,objと記述してもよい。
例 (quote a) ⇒a
(quote #(a b c)) ⇒ #(a b c)
(quote (+ 1 2)) ⇒ (+ 1 2)
() ⇒ nil
a ⇒a
#(a b c) ⇒ #(a b c)
(car 1) ⇒ (car 1)
(+ 1 2) ⇒ (+ 1 2)
(quote a) ⇒ (quote a)
a ⇒ (quote a)
(car a) ⇒ quote
引用形式の値を変更しようとした場合は,結果は未定義とする。
6.2 変数
変数束縛 (variable binding) は,変数束縛形式の実行又は関数の起動によって設定される。
変数 (variable) は,識別子で表され,その識別子とISLISPオブジェクトとの間の結合を設定する。この結
合は,setf形式又はsetq形式を使って(代入によって),変更できる。
変数束縛形式には次のものがある。
defglobal let let* for
var →<object> 構文
変数varの値は,その変数の束縛によって,varと結合されているオブジェクトとする。
例 (defglobal x 0) ⇒x
――――― [JIS X 3012 pdf 30] ―――――
次のページ PDF 31
JIS X 3012:1998の引用国際規格 ISO 一覧
- ISO/IEC 13816:1997(IDT)
JIS X 3012:1998の国際規格 ICS 分類一覧
- 35 : 情報技術.事務機械 > 35.060 : 情報技術に使用される言語