JIS X 3012:1998 プログラム言語ISLISP | ページ 19

86
X 3012 : 1998 (ISO/IEC 13816 : 1997)
これは,(format-integer output-stream obj n) によって実装される。
S
S式 : objは,いかなるオブジェクトでもよい。この書式指定は,必要であればエスケープ文
字とともに,objのテキスト表現を出力する。すなわち,この書式指定の生成する出力は,関数
readへの入力として適している。
これは,(format-object output-stream obj t) によって実装される。
nT
タブ (tab) : 第nけたへ移動するための空白文字を出力する(ここで,第0けたとは,左マー
ジンのこととする。)。既に第nけた又はそれ以降に達していた場合,空白文字を一つ出力する。
処理系が現在のけたの位置を決定できない場合,その動作は処理系定義とするが,少なくとも
一つの空白文字を出力する。
これは,(format-tab output-stream n) によって実装される。
X
16進 (hexadecimal) : objが整数でない場合は,エラーが発生する。objは,16進数で印字され
る。
これは,(format-integer output-stream obj 16) によって実装される。
%
復帰改行 : #\newline文字を,出力する。
これは,(format-char output-stream #\newline) によって実装される。
&
条件付き復帰改行 : 出力ストリームが行の先頭にあると決定できない場合に,#\newline文
字を出力する。
これは,(format-fresh-line output-stream) によって実装される。
チルダ : チルダ () を出力する。
これは,(format-char output-stream #\) によって実装される。
例 (format output-stream "No result") ⇒ nil
出力 : No result
(format output-stream "The result is A and nothing else." "meningitis")
⇒ nil
出力 : The result is meningitis and nothing else.
(format output-stream "The result iC" #\s) ⇒ nil
出力 : The result is
(format output-stream "The results are S and S." 1 #\a) ⇒ nil
出力 : The results are 1 and #\a.
(format output-stream "Binary code B" 150) ⇒ nil
出力 : Binary code 10010110
(format output-stream "permission O" 493) ⇒ nil
出力 : permission 755

――――― [JIS X 3012 pdf 91] ―――――

                                                                                             87
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(format output-stream "You X X" 2989 64206) ⇒ nil
出力 : You BAD FACE
(progn
(format output-stream "&Name 10Tincome 20Ttax ~%")
(format output-stream "A 10TD 20TD" "Grummy" 23000 7500)) ⇒ nil
出力 : Name income tax
Grummy 23000 7500
(format output-stream "This will be split into %two lines.") ⇒ nil
出力 : This will be split into
two lines.
(format output-stream "This is a tilde: ") ⇒ nil
出力 : This is a tilde:

19.3 2進入出力

 2進入出力には次の操作を用いる。2進入出力操作を扱えないストリームに対し,これ
らの操作を行おうとした場合は,エラーが発生する。
(read-byte input-stream [eos-error-p [eos-value]]) →<integer> 関数
関数read-byteは,input-streamから1バイトを読み込み,それを返す。1バイト中のビット数は,input-stream
の要素の種類によって決定される(open-input-file参照)。
input-stream, eos-error-p及びeos-valueの意味は,19.1による。
例 ;; この例では,8ビットの文字コードが,ファイルに格納されるものと仮定する。
(defglobal byte-example (open-output-stream "byte-ex")) ⇒ byte-example
(format byte-example "hello") ⇒ nil
(close byte-example) ⇒ 処理系定義
(setq byte-example (open-input-stream "byte-ex" 8)) ⇒ 処理系定義
(read-byte byte-example) ⇒ 104 (処理系定義)
(read-byte byte-example) ⇒ 101 (処理系定義)
(read-byte byte-example) ⇒ 108 (処理系定義)
(read-byte byte-example) ⇒ 108 (処理系定義)
(read-byte byte-example) ⇒ 111 (処理系定義)
(write-byte z output-stream) →<integer> 関数
関数write-byteは,zをoutput-streamに書き,そのzを返す。zがoutput-streamの要素の種類に適した範
囲の整数でない場合又はoutput-streamが出力操作を扱えるストリームでない場合は,エラーが発生する(エ
ラー名domain-error)。
例 (let ((out-str (open-output-stream "byte-example" 8)))
(write-byte #b101 out-str)
(close out-str)) ⇒ 処理系定義

――――― [JIS X 3012 pdf 92] ―――――

88
X 3012 : 1998 (ISO/IEC 13816 : 1997)

20. ファイル

 (probe-file filename) →真偽値                                                           関数
関数probe-fileは,filenameによって指定されたファイルが存在する場合はtを返し,それ以外の場合は
nilを返す。filenameが文字列でない場合は,エラーが発生する(エラー名domain-error)。
例 (probe-file "notexist.lsp") ⇒ nil
(defglobal new-file (open-output-file "notexist.lsp")) ⇒ new-file
(close new-file) ⇒ 処理系定義
(probe-file "notexist.lsp") ⇒ t
(file-position stream) →<integer> 関数
関数file-positionは,streamに付随するファイル位置 (file position) を返す。
ファイル位置は,ストリーム中の位置を表す非負整数とする。2進ストリームの場合,ファイル位置は,
ストリーム中の先行するバイト数を表す。次の式のいずれかを実行するたびに,ファイル位置は1ずつ増
加する。
(read-byte stream)
(write-byte z stream)
文字ストリームの場合,ファイル位置は,次の式のいずれかを実行するたびに増加する。その増分値は,
処理系定義の非負整数とする。
(format stream...)
(format-char stream char)
(format-float stream float)
(format-fresh-line stream)
(format-integer stream integer radix)
(format-object stream obj escape-p)
(format-tab stream column)
(report-condition condition stream)
(read-char stream)
(read-line stream)
(read stream)
増分値は,出力及びファイル位置に依存する。どの整数がファイルの第1要素を表すかは,処理系定義
とする。streamがファイルへのストリーム又はファイルからのストリームでない場合は,エラーが発生す
る(エラー名domain-error)。
例 ;; この例では,8ビットの文字コードが,ファイルに格納されるものと仮定する。
(defglobal example (open-output-file "example.lsp")) ⇒ example
(format example "hello") ⇒ nil
(close example) ⇒ 処理系定義
(setq example (open-input-stream "example.lsp" 8)) ⇒ 処理系定義
(file-position example) ⇒ 0 (処理系定義)
(read-byte example) ⇒ 104 (処理系定義)

――――― [JIS X 3012 pdf 93] ―――――

                                                                                             89
X 3012 : 1998 (ISO/IEC 13816 : 1997)
(file-position example) ⇒ 1 (処理系定義)
(set-file-position stream z) →<integer> 関数
関数set-file-positionは,ストリームstreamのファイル位置(file-position参照)を,zに変更しようとす
る。正確にzの位置に移動することができない場合,ファイル内で処理系定義の動作が実行される。zの
位置に移動できた場合でも,移動できなかった場合でも,返される値は新しいファイル位置とする。
streamがファイルへのストリームでもファイルからのストリームでもない場合,又はzが非負整数でな
い場合は,エラーが発生する(エラー名domain-error)。
例 (set-file-position example 4) ⇒4
(file-length filename element-class) →<object> 関数
関数file-lengthは,filenameによって指定されたファイルの長さを返す。長さが決定できない場合は,nil
を返す。element-classは,要素の種類(18.1参照)を指定する。filenameが文字列でない場合は,エラーが
発生する(エラー名domain-error)。
例 (file-length "file27.dat" 8) ⇒ 25
;; 処理系は,2ビットからなるバイトを実装する必要はない。
(file-length "file27.dat" 2) ⇒ 100

21. 例外処理機能

 例外処理機能は,エラー処理機能 (error system) とも呼ばれる。実行時に何らかの問
題が検出されたとき,適合するプログラムの制御の下でその状態を表現し,解決する手段を,例外処理機
能が提供する。

21.1 例外状態

 問題が検出されたとき,その状況を表現する例外状態 (condition) が生成され,例外状態
によって表された状況が,通知 (signaling) と呼ぶ処理によって伝えられる。この通知処理は,動的に設定
されるハンドラ (handler) に,問題を解決する機会を与える。通常のISLISPオブジェクトであることを強
調するために,例外状態は,例外オブジェクト (condition object) とも呼ばれる。
図1に,例外状態クラスに関する継承関係を示す。
幾つかの例外状態クラスに対しては,インスタンス生成時に,そのインスタンスに付随するデータ(21.3
参照)を与えるために,createが初期化引数を要求する。
実行的に検出されるプログラム誤りを表す例外状態は,エラー (error) と呼ぶ。エラー及び処理系の制
約を表す例外状態を総称して,重大な例外状態 (serious condition) と呼ぶ。
備考 LISPの方言によっては,“重大でない”例外状態の考え方をもつものがある。そのような例外
状態は,この規格の範囲を超えている。したがって,ここでは,最も一般的な例外状態クラス
として,<serious-condition>を使用する。

21.2 例外状態の通知及び扱い

 例外状態が通知されたとき,状況を表す例外オブジェクトをただ一つの
引数として活性ハンドラ (active handler) が起動される。初期の活性ハンドラは,システムによって生成さ
れている。このハンドラの動作は,処理系定義(例えば,最上位へ戻る,プログラムを終了する,対話型
デバッガに入るなど)とする。利用者のプログラムが,ハンドラを生成してもよい(with-handler参照)。
ある時点では,ただ一つのハンドラが活性であるものとする。with-handlerで新しいハンドラを生成する
と,前の活性ハンドラは遮へいされる。この新しく生成されたハンドラは,別のwith-handlerの利用によ

――――― [JIS X 3012 pdf 94] ―――――

90
X 3012 : 1998 (ISO/IEC 13816 : 1997)
って遮へいされない限り,それが付随するコード本体の実行中,活性であるものとする。
ハンドラ関数が呼び出されると,signal-conditionが呼び出された時点の動的環境において実行を行う。
ただし,ハンドラ全体の状態は,呼び出されたハンドラ関数が活性ハンドラとして設定された時点の状態
に戻る。
備考 これは,ハンドラの実行中にエラーが起きても,そのハンドラ自身がエラーを処理することを
期待されていないことを意味する。ハンドラがそれ自身の実行中のエラーを処理する必要があ
れば,関数定義にlabelsを利用し,ハンドラ関数の本体内で自分自身をハンドラとして再設定
すればよい。
ハンドラは,その実行終了時に,signal-conditionの呼出しの外側へ制御を移行しなければならない。そ
のような制御の移行は,go,throw若しくはreturn-fromの利用によって明示的に行われるか,又は,これ
らと同等の効果をもつcontinue-conditionの利用によって行われなければならない。ハンドラが正常に戻る
場合は,結果は未定義とする。ハンドラは,必ず制御を移行する。
ハンドラは,引数として受け取った例外オブジェクトをsignal-conditionに受け渡すことによって,他の
ハンドラに例外処理を委任してもよい。

21.2.1 例外通知に関する操作

 (error error-string obj*) →<object>                                                     関数
関数errorは,エラーを通知する。
error-string及び一連のobjは,formatに与えられるとエラーメッセージを生成するが,これらの引数が
使われるかどうかは,処理系定義とする。
これは,次と同値とする。
(signal-condition
(create (class <simple-error>)
format-string error-string
format-arguments (list obj*)))
nil)
(cerror continue-string error-string obj*) →<object> 関数
関数cerrorは,errorと似ているが,通知されるエラーは継続可能(continue-condition参照)とする。引
数continue-stringは,この関数が戻る場合に何が起こるかを記述する文字列とする。
これは,次と同値とする。
(signal-condition
(create (class <simple-error>)
format-string error-string
format-arguments (list obj*)))
(let ((str (create-string-output-stream)))
(format str continue-string obj*)
(get-output-stream-string str)))
(signal-condition condition continuable) →<object> 関数
関数signal-conditionは,conditionを処理するために,例外処理機能を呼び出す。
continuableがnilのとき,継続(continue-condition参照)しようとした場合の結果は,未定義とする。こ

――――― [JIS X 3012 pdf 95] ―――――

次のページ PDF 96

JIS X 3012:1998の引用国際規格 ISO 一覧

  • ISO/IEC 13816:1997(IDT)

JIS X 3012:1998の国際規格 ICS 分類一覧