10. 標準文書照会言語(SDQL) 標準文書照会言語(SDQL)は,データ型node-list及びデータ型named-node-listの二つを式言語に追加する。また,SDQLは式に次の構文を追加する。SDQLでは,式expressionが出現可能な任意の文脈において,特殊照会式special-query-expressionが出現してよい。 核照会言語と呼ぶSDQLの部分集合を,10.2.4において定義する。 データ型node-listは,グローブ内の0個以上のノードの順序リストで表現する。 備考 ノードを表わす型はない。一つのノードは,一つの要素をもつnode-listで示す。 備考 ノードリストは,典型的には遅延を用いて実装する。つまり,ノードリストの内部表現はノードのリストではなく,そのノードリストを構成する指定の表現となる。例えば,応用が手続きnode-list-countを使用した場合,ノードリストを構成するのは非効率的で,単純にいくつのノードがノードリストの指定に合致するかを数えた方がよいだろう。 単一の要素をもつノードリストを,単一要素ノードリストと呼ぶ。 データ型named-node-listは,データ型node-listの下位型であって,各要素がノードリスト内のそのノードを一意に識別する文字列を値とする特性をもつ。 引数表記において,次の規約を用いる。 (1) nlを,ノードリストの場合に用いる。 (2) snlを,単一要素ノードリストの場合に用いる。 (3) nnlを,名前付きノードリストの場合に用いる。 10.1 基本手続き この10.1内の手続きは,基本手続きとする。他のすべてのSDQL手続きは,これらの手続きに関連して定義できる。しかし,10.1の手続きは,他の手続きに関連して定義できない。 10.1.1 応用束縛 (current-node) 単一要素ノードリストを返す。この手続きの意味は,その手続きが出現したSDQL式の文脈によって定義する。 (current-root) 単一要素ノードリストを返す。この手続きの意味は,その手続きが出現したSDQL式の文脈によって定義する。 10.1.2 ノードリスト (node-list? obj) 引数objがノードリストの場合#tを,その他の場合に#fを返す。 (node-list-empty? nl) 引数nlが空ノードリストの場合に#tを,その他の場合に#fを返す。 (node-list-first nl) 引数nlが空でない場合に,その最初の要素を含むノードリストを,その他の場合に空ノードリストを返す。 (node-list-rest nl) 引数nlが少なくとも一つの要素をもつ場合に,その最初の要素以外の要素を含むノードリストを返却し,その他の場合に空ノードリストを返す。 (node-list nl1 nl2 ...) 引数nl1,引数nl2,...のノードリストを結合したノードリストを返す。引数がない場合には,空ノードリストを返す。 (node-list=? nl1 nl2) 引数nl1及び引数nl2が,同じ要素を同じ順序で含むノードリストの場合に#tを,その他の場合に#fを返す。 (node-list-no-order nl) 引数nlと同じ要素を含むノードリストを返すが,要素の順序は規定しない。 備考 実装は,(node-list-no-order q)をqより効率よく実装できる。 10.1.3 名前付きノードリスト (named-node-list? obj) 引数objが名前付きノードリストの場合に#tを,その他の場合に#fを返す。 (named-node string nnl) 引数nnlにおいて,名前が引数stringに等しいノードがある場合,そのノードを含む単一要素ノードリストを返す。存在しない場合,空ノードリストを返す。引数stringは,引数nnlの要素と比較する以前に,引数nnlに関連する文字列正規化規則に基づいて正規化する。 (named-node-list-normalize string nnl symbol) 引数symbolによって指定するクラスに適用可能な,引数nnlの正規化規則に基づいて,引数stringを正規化して返す。 (named-node-list-names nnl) 引数nnlの各要素の名前のリストを,要素の配列順で返す。結果は引数nnlと同じ数の要素をもつ,文字列のリストとなる。 10.1.4 エラー報告 (node-list-error string nl) 手続きerrorと類似の方法でエラーを発生する。この手続きによってエラーが発生した場合,処理系は引数nlノードリストに関してエラーが発生したことを利用者に報告することが望ましい。報告の方法は,処理系依存とする。 10.1.5 応用名変換 SDQLのあらゆる文脈において,応用名は次の通常変換の対象となる。 (1) スペースをハイフンに置き換える。 (2) 宣言したデータ型が型booleanのオブジェクトの特性の場合,その応用名に疑問符(?)を追加する。 10.1.6 特性値 (node-property propname snl #!key default: null: rcs?:) 引数snlで示すノードが,特性propnameに関して開示する特性の値を返す。ノードが特性propnameを開示せず,引数default:が指定されている場合には,その値を返す。引数default:が指定されていない場合,エラーを発生する。ノードがその特性についてヌル値を開示し,引数null:に値が指定されている場合,その値を返す。引数null:に値が指定されず,default:に値が指定されている場合,default:で指定した値を返す。それ以外の場合エラーを発生する。 引数propnameは,シンボル又は文字列であって,応用名又は特性のRCS名のいずれかを示す。引数propnameと特性名の比較は,文字の大小の区別なしで行う。 特性値は,その抽象データ型に基づいて式言語オブジェクトとして表現する。 (1) 抽象文字型(abstract character)は,型characterのオブジェクトで表現する。 (2) 抽象文字列型(abstract string)は,型stringのオブジェクトで表現する。 (3) 抽象型booleanのオブジェクト(abstract boolean)は,型boolのオブジェクトで表現する。 (4) 抽象整数型(abstract integer)は,型integerのオブジェクトで表現する。 (5) 抽象整数リスト(abstract integer list)は,整数のリストで表現する。 (6) 抽象文字列リスト(abstract string list)は,文字列のリストで表現する。 (7) 列挙型(enumeration)は,列挙値の応用名を通常変換した名前のシンボルで表現する。 (8) 構成要素名(component name)は,シンボルで表現する。シンボルの名前は,10.1.5に規定する変換を施した後の応用名とする。ただし,引数rcs?:に真の値が指定されている場合,RCS名を用いる。 (9) 抽象構成要素名リスト(abstract component name list)は,各構成要素の名前を表現するシンボルのリストで表現する。 (10) 抽象ノード(abstract node)は,単一要素ノードリストで表現する。 (11) 抽象ノードリスト(abstract nodelist)は,型node-listのオブジェクトで表現する。 (12) 抽象名前付きノードリスト(abstract nmndlist)は,型named-node-listのオブジェクトで表現する。 (13) ヌル値は,式言語表現をもたない。 10.1.7 SGMLグローブ構築 (sgml-parse string #!key active: parent:) SGML文書又は副文書を解析し,SGML特性集合を用いて構成したグローブの根となるノードを含む単一要素ノードリストを返す。引数stringは,SGML文書実体又はSGML副文書実体のシステム識別子とする。引数active:は,活性状態のDTD又はLPDの名前を指定する文字列とする。活性状態のDTDは,高々一つでなければならない。引数parent:を指定した場合,実体はSGML副文書実体として解析する。引数parent:の値は,単一要素ノードリストであって,副文書がグローブ内のその位置で宣言されたと取り扱う。この手続きは,応用依存の方式で決定する無指定時グローブ設計を用いる。 10.2 派生手続き いくつかの手続きに関して,式言語の形式的定義を提供する。それらは,簡略化のためエラーの処理を含んでいない。正しい実装では,手続き原型及び手続き記述が示す型に,引数が適合することを最初に検証する必要がある。 10.2.1 HyTime支援 HyTime支援の機能を,スタイル言語又は変換言語で用いるには,機能hytimeを必要とする。抽象データ型groveposは,各要素が次のいずれかとなるリストで表現する。 (1) 整数 (2) シンボル及び文字列からなるリスト (3) シンボル及び整数からなるリスト (value-proploc propname snl #!key apropsrc?: default:) 引数snlの要素が,引数propnameで示す名前をもつ特性に関して開示する値を返す。引数propnameは,シンボル又は文字列であって,その解釈は手続きnode-propertyと同じとする。引数snlの要素が,引数propnameを名前にもつ特性に関して値を開示しない場合又はヌル値を開示する場合に,引数default:が指定してあればその値が返し,その他の場合エラーとする。引数apropsrc?:が真の場合,ISO/IEC 10744の体系形式proplocに関して,属性apropsrcに属性値apropsrcに指定するのと同じ効果をもつ。 (list-proploc propname nl #!key apropsrc?: ignore-missing?:) 引数nlの各要素に関して,引数propnameの名前をもつ特性が開示する値を取り出し,そのリストを返す。引数propnameは,シンボル又は文字列であって,その解釈は手続きnode-propertyと同じとする。引数nlのいくつかの要素が,引数propnameを名前にもつ特性に関して値を開示していない場合又はヌル値を開示している場合には,引数ignore-missing?:が真なら,結果のリストはその要素に対応するオブジェクトを含まない。引数ignore-missing?:が偽であればエラーを発生する。引数apropsrc?:の要素が真の場合,ISO/IEC 10744の体系形式proplocに関して,属性apropsrcに属性値apropsrcに指定するのと同じ効果をもつ。 (node-list-proploc propname nl #!key apropsrc?: ignore-missing?:) 引数nlの要素であって,引数propnameの名前をもつ特性を開示する各要素の値を結合したノードリストを返す。引数propnameは,シンボル又は文字列であって,その解釈は手続きnode-propertyと同じとする。引数nlの各要素において,引数propnameが指定する特性は型nodalでなければならない。引数nlのいくつかの要素が,引数propnameを名前にもつ特性に関して値を開示していない場合又はヌル値を開示している場合には,引数ignore-missing?:が真なら,結果のリストはその要素に対応するオブジェクトを含まず,引数ignore-missing?:が偽であればエラーを発生する。引数apropsrc?:の要素が真の場合,ISO/IEC 10744の体系形式proplocに関して,属性apropsrcに属性値apropsrc属性を指定するのと同じ効果をもつ。 (listloc dimlist nl #!key overrun:) (listloc dimlist list #!key overrun:) (listloc dimlist string #!key overrun:) ISO/IEC 10744で定義する,体系形式listlocと同一の方法で第二引数から要素を特定する。第二引数の型にしたがって,ノードリスト,リスト又は文字列を返す。引数dimlistは,整数のリストとする。引数overrun:は,シンボルerror,シンボルwrap,シンボルtruncae,シンボルignoreのいずれかを値とする。無指定時は,シンボルerrorとする。 (nameloc nmlist nnl #!key ignore-missing?:) 引数nmlistの各要素に対して一つの要素を含むノードリストを返す。ここで引数nmlistは,文字列,シンボル,シンボル又は文字列からなるリストのいずれかとする。引数nmlistの任意の要素が,引数nnlのうちのいくつかの名前と一致しない場合,引数ignore-missing?:が真でなければエラーとなる。 (groveloc list nl #!key overrun:) ISO/IEC 10744が定義する,体系形式grovelocと同一の方法で探索し,結果のノードリストを返す。引数listは,抽象データ型groveposの表現形式と同じ形式のリストとする。overrun:の解釈は,listlocと同様とする。 (treeloc marklist nl #!key overrun: treecom?:) ISO/IEC 10744が定義する,体系形式treelocと同一の方法で探索し,結果のノードリストを返す。引数marklistは,整数のリストとする。引数overrun:の解釈は,listlocと同一とする。引数treecom?:が真の場合,属性値treecomをもつtreecom属性に対応する。 (pathloc dimlist nl #!key overrun: treecom?:) ISO/IEC 10744が定義する,体系形式pathlocと同一の方法で探索し,結果のノードのリストを返す。引数dimlistは,整数のリストとする。引数overrun:の解釈は,listlocと同一とする。引数treecom?:が真の場合,属性値treecomをもつtreecom属性に対応する。 (relloc-anc dimlist nl #!key overrun:) (relloc-esib dimlist nl #!key overrun:) (relloc-ysib dimlist nl #!key overrun:) (relloc-des dimlist nl #!key overrun:) ISO/IEC 10744が定義する,体系形式rellocと同一の方法で探索し,結果のノードリストを返す。手続きrelloc-anc,手続きrelloc-esib,手続きrelloc-ysib 及び手続きrelloc-desは,それぞれ属性relationに,属性値anc,属性値esib,属性値ysib及び属性値desを指定した場合に対応する。引数dimlistは,整数のリストとする。引数overrun:の解釈は,listlocと同一とする。 備考 親及び子の関係は,それぞれ手続きparent,手続きchildrenで扱う。 (datatok nl #!key filter: concat: catsrcsp: catressp: tokensep: ascp: stop: min: max: nlword: stem?:) ISO/IEC 10744が定義する,体系形式datatokと同一の方法で探索し,結果のノードリストを返す。 (1) 引数filter:は,属性filterに指定可能なシンボルのいずれかを値とする。 (2) 引数concat:の解釈は,属性concatと同様とし,シンボルcatshi,シンボルcatslo,シンボルcattk,シンボルcatshitk,シンボルcatslotk,シンボルcatrhitk,シンボルcatrlotk,シンボルnconcatのいずれかを値とする。 (3) 引数catscrsp:,引数catressp:,引数tokensp:,引数ascp:の解釈は同名の属性と同様とし,文字列を値とする。 (4) 引数nlword:は,ISO 639で定義する言語符号を指定する文字列とする。 (5) 引数stem?:が真の場合,属性nlwordに属性値#STEMを指定するのと同じ効果をもつ。 (6) 引数stop:は文字列リストを値とし,停止リストを意味する。無指定時値は,空リストとする。 (7) 引数min:は整数を値とし,切り捨てを行わない最小トークン長を意味する。 (8) 引数max:は整数を値とし,切り捨てを行わない最大トークン長を意味する。 (make-grove string nl) 手続きmake-groveは新規のグローブを構築し,グローブ根を含むノードリストを返す。引数stringは,グローブ設計の名前とする。引数nlは,入力テキストとする。 (literal-match string nl #!key level: boundary: min-hits: max-hits:) (hylex-match string nl #!key norm?: level: boundary: min-hits: max-hits:) 引数nlの各要素のデータ内で見つかった,重複しない合致ごとに,データトークン化特性集合を用いて構築した,一つのトークン化文字列ノードを含む新規のグローブを構築する。すべてのトークン化した文字列ノードをノードリストとして返す。 (1) 引数boundary:の解釈は,ISO/IEC 10744が定義する要素HyLexの属性boundaryと同一とし,シンボルsodeod,シンボルsodiec,シンボルisceod及びシンボルiscecを値とする。 (2) 引数level:は数値であって,文字列比較を行う際に,現言語の照合指定における比較レベルを表わす。引数level:が指定されない場合,単純に文字列を構成する文字によって比較する。 (3) 引数min-hits:及び引数max-hits:は正の整数を値とし,任意の合致対象の親ノードが指定した範囲の数の合致を含まない場合には,返すノードリストからその合致対象を削除する。引数min-hits:の無指定時値を1とする。引数max-hits:が指定されない場合,最大合致数の制限はない。 (4) 引数norm?:は型booleanのオブジェクトであって,字句モデルが正規化されているかを指定する。 (compare proc list) 引数procは,二つの文字列を引数にもち,型booleanのオブジェクトを返す手続きとする。引数list中の連続する二つずつの文字列に,引数手続きprocを適用し,そのすべてが#tを返す場合に#tを返す。この手続きは,次のとおりに定義できる。 (define (compare proc l) (if (null? l) #t (let loop ((prev (car l)) (rest (cdr l))) (cond ((null? rest) #t) ((proc prev (car rest)) (loop (car rest) (cdr rest))) (else #f))))) (ordered-may-overlap? nl) (ordered-no-overlap? nl) 引数nlの要素となる各ノードは,補助グローブ内のノードとし,すべての入力ノードは単一の木内とする。入力ノードがその属する木内で,順序付けられている場合に#tを返却し,その他の場合に#fを返す。手続きordered-no-overlap?に関しては,各引数ノードについて,そのすべての入力ノードが,次の引数ノードの入力ノードに先行する場合に,入力ノードが順序付けられていると見なす。手続きordered-may-overlap?に関しては,各引数ノードについて,その入力ノードの最初のノードが,次の引数ノードの入力ノードの最初のノードに先行する場合に,入力ノードが順序付けられていると見なす。 (span nl symbol) 引数nlの各ノードは,補助グローブ内のノードとし,すべてのノードの入力ノードは単一の木内とする。入力ノードの最初と最後の間の量子数を返す。引数symbolは量子を指定する。引数symbolには,手続きdatatokの引数filter:で指定できる値のいずれかを指定する。 10.2.2 リスト手続き これらの手続きは,通常のリストに対する手続きに類似している。 (empty-node-list) この手続きは,空ノードリストを返す。 (node-list-reduce nl proc obj) 引数nlが要素をもたない場合,引数objを返却し,その他の場合に手続きnode-list-reduceに,次のそれぞれを引数として適用した結果を返す。 (1) 引数nlから最初の要素を除いたすべてを含むノードリスト。 (2) 引数proc。 (3) 引数procを,引数obj及び引数nlの最初の要素に適用した結果。 手続きnode-list-reduceは,次の様に定義できる。 (define (node-list-reduce nl combine init) (if (node-list-empty? nl) init (node-list-reduce (node-list-rest nl) combine (combine init (node-list-first nl))))) (node-list-contains? nl snl) 引数nlが,引数snlの要素と等しいノードを含む場合に#tを返却し,その他の場合に#fを返す。この手続きは,次の様に定義できる。 (define (node-list-contains? nl snl) (node-list-reduce nl (lambda (result i) (or result (node-list=? snl i))) #f)) (node-list-remove-duplicates nl) 先行する任意の要素に等しい要素を取り除くこと以外では,引数nlと同一のノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-remove-duplicates nl) (node-list-reduce nl (lambda (result snl) (if (node-list-contains? result snl) result (node-list result snl))) (empty-node-list))) (node-list-union #!rest args) すべての引数ノードリストの和集合を返す。結果は,重複を含まない。引数がない場合,空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-union #!rest args) (reduce args (lambda (nl1 nl2) (node-list-reduce nl2 (lambda (result snl) (if (node-list-contains? result snl) result (node-list result snl))) nl1)) (empty-node-list))) ここで,手続きreduceは,次の様に定義できる。 (define (reduce list combine init) (let loop ((result init) (list list)) (if (null? list) result (loop (combine result (car list)) (cdr list))))) (node-list-intersection #!rest args) この手続きは,引数ノードリストの積集合を含むノードリストを返す。結果は,重複を含まない。引数がない場合,空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-intersection #!rest args) (if (null? args) (empty-node-list) (reduce (cdr args) (lambda (nl1 nl2) (node-list-reduce nl1 (lambda (result snl) (if (node-list-contains? nl2 snl) (node-list result snl) result)) (empty-node-list))) (node-list-remove-duplicates (car args))))) (node-list-difference #!rest args) この手続きは,引数ノードリストすべての差集合を含むノードリストを返す。集合の差は,最初の引数ノードリストの要素であって,任意の他の引数ノードリストの要素とはならない要素からなる集合と定義できる。結果は,重複を含まない。引数がない場合,空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-difference #!rest args) (if (null? args) (empty-node-list) (reduce (cdr args) (lambda (nl1 nl2) (node-list-reduce nl1 (lambda (result snl) (if (node-list-contains? nl2 snl) result (node-list result snl))) (empty-node-list))) (node-list-remove-duplicates (car args))))) (node-list-symmetric-difference #!rest args) この手続きは,すべての引数ノードリストの対称差集合を含むノードリストを返す。対称差集合は,引数ノードリストグループの中で一度しか出現しないノードからなる集合と定義する。結果は,重複を含まない。引数がない場合,空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-symmetric-difference #!rest args) (if (null? args) (empty-node-list) (reduce (cdr args) (lambda (nl1 nl2) (node-list-difference (node-list-union nl1 nl2) (node-list-intersection nl1 nl2))) (node-list-remove-duplicates (car args))))) (node-list-map proc nl) 引数nlの各要素について,その要素だけを含む単一要素ノードリストを作成し,引数procを適用した結果をノードリストに付加した結果を返す。引数procが,引数nlの任意の要素に関してノードリストを返却しない場合エラーとする。この手続きは,次の様に定義できる。 (define (node-list-map proc nl) (node-list-reduce nl (lambda (result snl) (node-list (proc snl) result)) (empty-node-list))) (node-list-union-map proc nl) 引数nlの各要素について,その要素だけを含む単一要素ノードリストを作成し,引数procを適用した結果のノードリスト和集合を返す。引数procが,引数nlの任意の要素に関してノードリストを返却しない場合エラーとする。この手続きは,次の様に定義できる。 (define (node-list-union-map proc nl) (node-list-reduce nl (lambda (result snl) (node-list-union (proc snl) result)) (empty-node-list))) (node-list-some? proc nl) 引数nlの各要素について,その要素だけを含む単一要素ノードリストを作成し,そのノードリストを引数procを適用した結果のうち,#fを返却するものがない場合に#tを返却し,その他の場合に#fを返す。引数nlのいくつかに関して,引数手続きprocがエラーを発生した場合,この手続きの実装はエラーを発生してもよいが,必す(須)とはしない。この手続きは,次の様に定義できる。 (define (node-list-some? proc nl) (node-list-reduce nl (lambda (result snl) (if (or result (proc snl)) #t #f)) #f)) (node-list-every? proc nl) 引数nlの各要素について,その要素だけを含む単一要素ノードリストに引数procを適用し,すべての結果が#fを返さない場合に#tを返却し,その他の場合#fを返す。引数nlのいくつかについて,引数procがエラーを発生した場合,この手続きの実装はエラーを発生してよい。この手続きは,次の様に定義できる。 (define (node-list-every? proc nl) (node-list-reduce nl (lambda (result snl) (if (and result (proc snl)) #t #f)) #t)) (node-list-filter proc nl) 引数nlの各要素について,その要素だけを含む単一要素ノードリストに引数procを適用し,その結果が#fにならない要素からなるノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-filter proc nl) (node-list-reduce nl (lambda (result snl) (if (proc snl) (node-list snl result) result)) (empty-node-list))) (node-list->list nl) 引数nlの各要素についてその要素だけを含む単一要素ノードリストを作成し,そのリストを返す。この手続きは,次の様に定義できる。 (define (node-list->list nl) (reverse (node-list-reduce nl (lambda (result snl) (cons snl result)) '()))) (node-list-length nl) 引数nlの要素数を返す。この手続きは,次の様に定義できる。 (define (node-list-length nl) (node-list-reduce nl (lambda (result snl) (+ result 1)) 0)) (node-list-reverse nl) 引数nlの要素を逆順で含むノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-reverse nl) (node-list-reduce nl (lambda (result snl) (node-list snl result)) (empty-node-list))) (node-list-ref nl k) 引数nlの引数kの示す位置(0を基底とする)のノードを含むノードリストを返す。引数kに対応する要素が存在しない場合,空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-ref nl i) (cond ((< i 0) (empty-node-list)) ((zero? i) (node-list-first nl)) (else (node-list-ref (node-list-rest nl) (- i 1))))) (node-list-tail nl k) 引数nlから最初の引数kの要素を除いたノードリストを返す。引数nlが引数kより少ない個数の要素をもつ場合,空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-tail nl i) (cond ((< i 0) (empty-node-list)) ((zero? i) nl) (else (node-list-tail (node-list-rest nl) (- i 1))))) (node-list-head nl k) 引数nlの最初の引数k個の要素からなるノードリストを返す。引数nlが,引数kより少ない個数の要素をもつ場合,引数nlを返す。この手続きは,次の様に定義できる。 (define (node-list-head nl i) (if (zero? i) (empty-node-list) (node-list (node-list-first nl) (node-list-head nl (- i 1))))) (node-list-sublist nl k1 k2) 引数nlの中で引数k1以上,引数k2未満の要素に先行される要素を含むノードリストを返す。0を基底とした指標で引数k1以上,引数k2未満の要素を選択することに等しい。この手続きは,次の様に定義できる。 (define (node-list-sublist nl i j) (node-list-head (node-list-tail nl i) (- j i))) (node-list-count nl) 引数nl内の異なる要素の数を返す。この手続きは,次の様に定義できる。 (define (node-list-count nl) (node-list-length (node-list-remove-duplicates nl))) (node-list-last nl) 引数nlが空ノードリストでない場合に最後の要素を返却し,その他の場合に空ノードリストを返す。この手続きは,次の様に定義できる。 (define (node-list-last nl) (node-list-ref nl (- (node-list-length nl) 1))) 手続きnode-list-some?,手続きnode-list-every?,手続きnode-list-filter及び手続きnode-list-union-mapを使用する場合,最初の引数はしばしば仮引数を伴うlambda式となる。この規格では,これらの式内で明示的なlambda式を使用する必要性を避けるための構文を提供する。 [146] special-query-expression = there-exists?-expression | for-all?-expression | select-each-expression | union-for-each-expression [147] there-exists?-expression = (there-exists? variable expression expression ) 次の二つの式は等価となる。 (there-exists? var nl-expr expr) (node-list-some? (lambda (var) expr) nl-expr) これは,"変数varを用いた条件式exprを満たす,ノードリストnl-expr内のノードが存在するか?"と読む。 [148] for-all?-expression = (for-all? variable expression expression ) 次の二つの式は等価となる。 (for-all? var nl-expr expr) (node-list-every? (lambda (var) expr) nl-expr) これは,"変数varを用いた条件式exprを,ノードリストnl-expr内のノードすべてが満たすか?"と読む。 [149] select-each-expression = (select-each variable expression expression) 次の二つの式は等価となる。 (select-each var nl-expr expr) (node-list-filter (lambda (var) expr) nl-expr) これは,"変数varを用いた条件式exprを満たすノードを,ノードリストnl-exprから選択する"と読む。 [150] union-for-each-expression = (union-for-each variable expression expression ) 次の二つの式は等価となる。 (union-for-each var nl-expr expr) (node-list-union-map (lambda (var) expr) nl-expr) これは,"変数varを用いた条件式exprを満たす,ノードリストnl-expr内の各要素の和集合"と読む。 10.2.3 共通特性操作 これらの手続きは,任意のグローブに対して機能するが,内在特性においてだけ使用できる。 次に示す手続きのうちの多くが,ノードに対する関数をノードリスト全体に写像した結果を返す。これは,ノードリストの各要素に機能を適用した結果を順に付加してできたノードリストとして定義できる。 (node-list-property propname nl) ノードが,引数propnameの名前をもつ特質を開示をしている場合には,その値を返し,開示していない場合又はヌル値を開示している場合には,空ノードリストを返す関数を,引数nl全体に対応させた結果を返す。引数propnameは,node-property手続きで可能な任意の方法で指定できる。引数nlの任意のノードが,ヌル値ではなく,型nodalでない値をpropnameの名前で公開している場合エラーとする。この手続きは,次の様に定義できる。 (define (node-list-property prop nl) (node-list-map (lambda (snl) (node-property prop snl default: (empty-node-list))) nl)) (origin nl) この手続きは,次の定義に等しい。 (define (origin nl) (node-list-property 'origin nl)) (origin-to-subnode-rel snl) 引数snlの要素が,特性origin-to-subnode-rel-property-nameを開示している場合にその値を,開示していないか又はヌル値を開示している場合には,#fを返す。 この手続きは,次の様に定義できる。 (define (origin-to-subnode-rel snl) (node-property 'origin-to-subnode-rel-property-name snl default: #f)) (tree-root nl) この手続きは,次の定義に等しい。 (define (tree-root nl) (node-list-property 'tree-root nl)) (grove-root nl) この手続きは,次の定義に等しい。 (define (grove-root nl) (node-list-property 'grove-root nl)) (children nl) ノードの子ども特性が存在すればその値を,その他の場合空ノードリストを返す関数を,引数nl全体に写像した結果を返す。この手続きは,次の様に定義できる。 (define (children nl) (node-list-map (lambda (snl) (let ((childprop (node-property 'children-property-name snl default: #f))) (if childprop (node-property childprop snl default: (empty-node-list)) (empty-node-list)))) nl)) (data nl) 引数nlの各要素のデータを結合した内容の文字列を返す。ノードのデータは,次のとおりに定義する。 (1)ノードがデータ特性をもつ場合,その特性値を必要に応じて文字列に変換した結果。 (2) 子ノードが子ども特性をもつ場合,各子ノードのデータを特性data-separatorの特性値がヌル値でなければ,その値で各データを区切って連結した結果。 (3) その他の場合は,空文字列。 (parent nl) この手続きは,次の定義に等しい。 (define (parent nl) (node-list-property 'parent nl)) (source nl) この手続きは,次の定義に等しい。 (define (source nl) (node-list-property 'source nl)) (subtree nl) 引数nlの各要素を,ノードの部分木を返す関数で写像したものを返す。ただし,ノードの部分木とは,そのノードとそれに続いてそのノードの子の部分木をリストしたノードリストと定義する。 この手続きは,次の様に定義できる。 (define (subtree nl) (node-list-map (lambda (snl) (node-list snl (subtree (children snl)))) nl)) (subgrove nl) 引数nlの各要素を,ノードの部分グローブを返す関数で写像したものを返す。ただし,ノードの部分グローブとは,そのノードとそれに続いてそのノードの下位ノード(subnode)特性の各値の要素の部分グローブをリストしたノードリストと定義する。 この手続きは,次の様に定義できる。 (define (subgrove nl) (node-list-map (lambda (snl) (node-list snl (subgrove (apply node-list (map (lambda (name) (node-property name snl)) (node-property 'subnode-property-names snl)))))) nl)) (descendants nl) 引数nlの各要素を,ノードの子孫を返す関数で写像したものを返す。ただし,ノードの子孫とは,そのノードの子の部分木を追加したノードリストと定義する。 この手続きは,次の様に定義できる。 (define (descendants nl) (node-list-map (lambda (snl) (subtree (children snl))) nl)) (ancestors nl) 引数nlの各要素を,ノードの先祖を返す関数で写像したものを返す。ただし,ノードの先祖とは,そのノードが根の場合には空ノードリスト,そうでなければ,ノードの親の先祖にノードの親を付加した結果のノードリストと定義する。 (define (ancestors nl) (node-list-map (lambda (snl) (let loop ((cur (parent snl)) (result (empty-node-list))) (if (node-list-empty? cur) result (loop (parent snl) (node-list cur result))))) nl)) (grove-root-path nl) 引数nlの各要素をグローブ根経路を返す関数で写像した結果を返す。ただし,グローブ根経路とは,ノードが根ノードであれば空ノードリスト,その他の場合には,ノードの起点のグローブ根経路にノードの起点を付加した結果と定義する。この手続きは,次の様に定義できる。 (define (grove-root-path nl) (node-list-map (lambda (snl) (let loop ((cur (origin snl)) (result (empty-node-list))) (if (node-list-empty? cur) result (loop (origin nl) (node-list cur result))))) nl)) (rsiblings nl) 引数nlの各要素を,再帰兄弟関数で写像した結果を返す。ただし,ノードの再帰兄弟とは,そのノードが起点をもてばその起点の特性origin-to-subnodeとなり,起点をもたなければそのノード自身と定義する。 (define (rsiblings nl) (node-list-map (lambda (snl) (let ((rel (origin-to-subnode-rel snl))) (if rel (node-property rel (origin snl) default: (empty-node-list)) snl))) nl)) (ipreced nl) 引数nlの各要素を,直前兄弟が存在する場合にそれを返す関数で写像した結果を返す。この手続きは,次の様に定義できる。 (define (ipreced nl) (node-list-map (lambda (snl) (let loop ((prev (empty-node-list)) (rest (siblings snl))) (cond ((node-list-empty? rest) (empty-node-list)) ((node-list=? (node-list-first rest) snl) prev) (else (loop (node-list-first rest) (node-list-rest rest)))))) nl)) (ifollow nl) 引数nlの各要素を,直後兄弟が存在する場合にそれを返す関数で写像した結果を返す。この手続きは,次の様に定義できる。 (define (ifollow nl) (node-list-map (lambda (snl) (let loop ((rest (siblings snl))) (cond ((node-list-empty? rest) (empty-node-list)) ((node-list=? (node-list-first rest) snl) (node-list-first (node-list-rest rest))) (else (loop (node-list-rest rest)))))) nl)) (preced nl) 引数nlの各要素を,先行兄弟が存在する場合にそれを返す関数で写像した結果を返す。この手続きは,次の様に定義できる。 (define (preced nl) (node-list-map (lambda (snl) (let loop ((scanned (empty-node-list)) (rest (siblings snl))) (cond ((node-list-empty? rest) (empty-node-list)) ((node-list=? (node-list-first rest) snl) scanned) (else (loop (node-list scanned (node-list-first rest)) (node-list-rest rest)))))) nl)) (follow nl) 引数nlの各要素を,後続兄弟が存在する場合にそれを返す関数で写像した結果を返す。この手続きは,次の様に定義できる。 (define (follow nl) (node-list-map (lambda (snl) (let loop ((rest (siblings snl))) (cond ((node-list-empty? rest) (empty-node-list)) ((node-list=? (node-list-first rest) snl) (node-list-rest rest)) (else (loop (node-list-rest rest)))))) nl)) (grove-before? snl1 snl2) 引数snl1が,グローブ順において引数snl2に先行する場合#tを返す。引数snl1と引数snl2が同じグローブ内にない場合はエラーとする。この手続きは,次の様に定義できる。 (define (grove-before? snl1 snl2) (let ((sorted (node-list-intersection (subgrove (grove-root snl1)) (node-list snl1 snl2)))) (and (= (node-list-length sorted) 2) (node-list=? (node-list-first sorted) snl1)))) (sort-in-tree-order nl) 引数nlの要素を,木順で整列したノードリストを返す。重複するノードは取り除く。引数nlの要素が,すべて同じ木内でなければエラーとする。この手続きは,次の様に定義できる。 (define (sort-in-tree-order nl) (node-list-intersection (subtree (tree-root nl)) nl)) (tree-before? snl1 snl2) 引数snl1が,木順において引数snl2より先行する場合に#tを返す。引数snl1と引数snl2が同じ木内でなければエラーとする。この手続きは,次の様に定義できる。 (define (tree-before? snl1 snl2) (let ((sorted (sort-in-tree-order (node-list snl1 snl2)))) (and (= (node-list-length sorted) 2) (node-list=? (node-list-first sorted) snl1)))) (tree-before nl) 引数nlの各要素を,同じ木内において先行するノードを返す関数で写像した結果を返す。この手続きは,次の様に定義できる。 (define (tree-before nl) (node-list-map (lambda (snl) (node-list-filter (lambda (x) (tree-before? x snl)) (subtree (tree-root snl)))) nl)) (property-lookup propname snl if-present if-not-present) 引数snlが引数propnameに関して非ヌル値を開示している場合,引数if-presentをその値に適用した結果を,その他の場合には引数if-not-presentを引数なしで呼び出した結果を返す。引数propnameは,手続きnode-propertyに対して可能な任意の方法で指定できる。この手続きは,次の様に定義できる。 (define (property-lookup name snl if-present if-not-present) (let ((val (node-property name snl default: #f))) (cond (val (if-present val)) ((node-property name snl default: #t) (if-not-present)) (else (if-present val))))) (select-by-class nl sym) 引数nlの要素のうち,ノードのクラスとして引数symをもつノードからなるノードリストを返す。引数symは,10.1.5で規定のとおりに変換したクラスの応用名又はRCS名とする。 (select-by-property nl sym proc) 引数nlの要素であって,引数symの名前をもつ型nodalでない特性が非ヌル値を開示しており,その値に引数procを適用した場合に真の値を返すノードからなるノードリストを返す。 (select-by-null-property nl sym) 引数nlの要素であって,引数symが示す特性に関してヌル値を開示しているものからなるノードリストを返却する。 (select-by-missing-property nl sym) 引数nlの要素であって,引数symが示す特性に関して値を開示していないものからなるノードリストを返却する。 10.2.4 核照会言語 この項は,SDQLの部分集合を定義する。この部分集合では,10.2.4で定義する手続きに加え,手続きcurrent-node,手続きnode-list-empty?,手続きnode-list?,手続きparent及び手続きnode-list-errorを利用できる。この部分集合は,ノードリストが一つ以上のノードを決して含まず,ノードリストが含むすべてのノードが型elementとなる設計がなされている。10.2.4の以降に続く手続きでは,型node-listの引数を省略でき,その場合には(current-node)が指定されたと解釈する。引数osnl(optional singleton node-list)は,ノードを0個又は1個含むノードリストを意味する。 10.2.4.1 探査 (ancestor string osnl) 引数osnlの先祖であって,共通識別子として引数stringをもつ最も近いものを含むノードリストを返す。そのようなノードリストが存在しない場合又はosnlが空ノードリストの場合には,空ノードリストを返却する。 (gi osnl) 引数osnlに含まれるノードの特性giの値を返す。引数osnlが空の場合,引数osnlの要素が特性giをもたない場合又は特性giにヌル値をもつ場合には,#fを返す。 (first-child-gi osnl) 引数osnlの要素の子であって,クラスがelementの最初のものの特性giの値を返す。引数osnlが空の場合又はそのような子をもたない場合には#fを返す。 (id osnl) 引数osnlに含まれるノードの特性idの値を返す。引数osnlが空の場合,特性idをもたない場合又は特性idがヌル値をもつ場合には,#fを返す。 10.2.4.2 計数 (child-number snl) 引数snlの子番号を返す。 要素の子番号は,現要素と同じ共通識別子をもち,現要素に先行する兄弟の数に1を加えたものとなる。 (ancestor-child-number string snl) 共通識別子が引数stringに等しい最も近い先祖の子番号を返す。そのような先祖が存在しない場合には#fを返す。 (hierarchical-number list snl) 引数listの要素数と等しい数の非負整数からなるリストを返す。引数listは,文字列のリストとする。返すリストの最後の要素は,引数snlの先祖であって,その共通識別子が引数listの最後の要素に等しい最も近いものの子番号とする。返すリストの最後から二番目の要素は,引数snlの先祖であって,その共通識別子が引数listの最後から二番目要素に等しい最も近いものの子番号とする。引数listの各要素について同様とする。 (hierarchical-number-recursive string snl) 非負整数のリストを返却する。返すリストの最後の要素は,引数snlの要素の先祖であって,その共通識別子が引数stringに等しいものの子番号となる。返すリストの最後から二番目の要素は,上述の要素の先祖であって,その共通識別子が引数stringに等しいものの子番号となる。同様に現要素の先祖であって,共通識別子が引数stringに等しい各要素に関して続ける。このリストの長さは,stringの入れ子のレベルに等しいことに注意。 (element-number snl) 引数snlと同じ共通識別子をもち,引数snlと同じ又は先行する要素の数を返す。 (element-number-list list snl) 非負整数のリストを返す。引数listは,文字列のリストとする。引数listの各要素について,i番目の整数は次の条件を満たす要素の数となる。 (1) 引数snlに先行する又は等しい。 (2) 共通識別子が,引数listのi番目の要素に等しい。 (3) iが1より大きい場合,引数snlの要素に先行し,その共通識別子が引数listのi - 1番目の要素に等しい最後の要素に後続する。 備考 実効上各引数のためのカウンタは,直前の引数によって参照される要素の 先頭でリセットされる。 備考 要素はその親より後だと考える。 備考 この手続きは,リストの最後の数を用いることで脚注を章内で連続する番号をふるために利用できる。また,これはコンテナ要素をもたないDTDでの見出しの番号付けにも利用できる。 10.2.4.3 属性値のアクセス 次の手続きでは,属性値はクラスattribute-assignmentのノードに手続きdataを適用して,文字列として表現する。 (attribute-string string osnl) 引数stringに等しい名前をもつ,引数osnlの属性値の文字列表現を返す。引数osnlが指定した名前の属性をもたない場合,属性が暗黙指定の場合又は引数osnlが空の場合には,#fを返す。 (inherited-attribute-string string osnl) 引数stringに等しい名前をもち,引数osnlの属性値又は引数osnlの先祖であってその属性が暗黙指定でない,最も近いものの値の文字列表現を返す。そのような要素が存在しない場合又は引数osnlが空の場合には,#fを返す。この手続きに関しては,ノードはそれ自体の先祖とみなす。 (inherited-element-attribute-string string1 string2 osnl ) 引数osnlの先祖であって,その共通識別子が引数string1に等しく,名前が引数string2に等しい明示的な属性をもつ,最も近いものの属性値の文字列表現を返す。そのようなようそがない場合又は引数osnlが空の場合,#fを返す。この手続きに関しては,ノードはそれ自体の先祖とみなす。 10.2.4.4 現所在の判定 (first-sibling? snl) 引数snlが,同じ共通識別子の先行する兄弟をもたない場合に#tを,その他の場合に#fを返す。 (absolute-first-sibling? snl) 引数snlが,先行する兄弟要素をもたない場合に#tを,その他の場合に#fを返す。 (last-sibling? snl) 引数snlが,同じ共通識別子の後続する兄弟をもたない場合に#tを,その他の場合に#fを返す。 (absolute-last-sibling? snl) 引数snlが,後続する兄弟要素をもたない場合に#tを,その他の場合に#fを返す。 (have-ancestor? obj snl) 引数objは,文字列又は文字列のリストとする。引数objが文字列の場合,have-ancestor?は引数snlが引数objに一致する共通識別子の先祖をもつ場合に#tを,その他の場合に#fを返す。 10.2.4.5 実体及び記法 この10.2.4.5において,snlは実体を探す文書を特定する。 (entity-public-id string snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前が引数stringとなるノードの特性external-idの値ノードのもつ特性public-idの値を返す。名前が引数stringとなる実体がない場合,実体が特性external-idにヌル値をもつ場合又は特性external-idの値が特性public-idにヌル値をもつ場合には,#fを返す。 (entity-system-id string snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前が引数stringとなるノードの特性external-idの値ノードのもつ特性system-idの値を返す。名前が引数stringとなる実体がない場合,実体が特性external-idにヌル値をもつ場合又は特性external-idの値が特性system-idにヌル値をもつ場合には,#fを返す。 (entity-generated-system-id string snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前が引数stringとなるノードの特性textの値を返す。名前が引数stringとなる実体がない場合,特性textにヌル値をもつ場合には,#fを返す。 (entity-notation string snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前が引数stringとなるノードの特性notation-nameの値を返す。名前が引数stringとなる実体がない場合,特性notation-nameにヌル値をもつ場合には,#fを返す。 (entity-attribute-string string1 string2 snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前が引数string1となるノードの,引数string2の名前をもつ属性の値の文字列表現を返す。名前が引数string1となる実体がない場合又はその属性が暗黙指定の場合には,#fを返却する。 (entity-type string snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前がstringとなるノードの特性entity-typeの値を返す。名前がstringとなる実体がない場合,特性entity-typeにヌル値をもつ場合には,#fを返す。 (notation-public-id string snl) 引数snlと同じグローブを律する文書型内の一般記法実体で,その名前が引数stringとなるノードの特性external-idの値ノードのもつ特性public-idの値を返す。名前が引数stringとなる実体がない場合,実体が特性external-idにヌル値をもつ場合又は特性external-idの値が特性public-idにヌル値をもつ場合には,#fを返す。 (notation-system-id string snl) 引数snlと同じグローブを律する文書型内の一般記法実体で,その名前がstringとなるノードの特性external-idの値ノードのもつ特性system-idの値を返す。名前が引数stringとなる実体がない場合,実体が特性external-idにヌル値をもつ場合又は特性external-idの値が特性system-idにヌル値をもつ場合には,#fを返す。 (notation-generated-system-id string snl) 引数snlと同じグローブを律する文書型内の一般実体で,その名前が引数stringとなるノードの特性external-idの値ノードのもつ特性generated-system-idの値を返す。名前が引数stringとなる実体がない場合,実体が特性external-idにヌル値をもつ場合又は特性external-idの値が特性generated-system-idにヌル値をもつ場合には,#fを返す。 10.2.4.6 名前正規化  (general-name-normalize string snl) 引数snlが出現するグローブのもつ,一般大小代替文字列正規化規則を用いて,引数stringを変換した結果を返す。この手続きは,次の様に定義できる。 (define (general-name-normalize string snl) (named-node-list-normalize string (node-property 'elements (grove-root snl)) 'element)) (entity-name-normalize string snl) 引数snlが出現するグローブのもつ,実体大小代替文字列正規化規則を用いて,引数stringを変換した結果を返す。この手続きは,次の様に定義できる。 (define (entity-name-normalize string snl) (named-node-list-normalize string (node-property 'entities (grove-root snl)) 'entity)) 10.2.5 SGML特性操作 この10.2.5の手続きは,SGMLのための特性集合によって定義された特定の特性の取扱いを可能にする。 (attributes nl) これは,次の定義に等しい。 (define (attributes nl) (node-list-property 'attributes nl)) (attribute string nl) 名前が引数stringに等しい特性attributesの値の要素を返す関数をnlに適用した結果を返す。この手続きは,次の様に定義できる。 (define (attribute name nl) (node-list-map (lambda (snl) (named-node name (attributes snl))) nl)) (element-with-id string snl) 引数snlと同じグローブ内にあって一意識別子が引数stringとなる要素を含む単一要素ノードリストを返す。名前が引数stringとなる要素が存在しない場合には,空ノードリストを返す。引数snlが無指定の場合,(current-node)と解釈する。 (referent nl) これは,次の定義に等しい。 (define (referent nl) (node-list-property 'referent nl)) (match-element? pattern snl) 引数snlが,引数patternに合致するクラスelementのノードの場合に#tを返す。引数patternは,リスト,単一の文字列又は単一シンボルのいずれかとする。単一の文字列又は単一のシンボルは,その文字列又はシンボルだけを含むリストと等しく解釈する。リストには,文字列又はシンボルを含むことができる。リストの最後の文字列又はシンボルがその要素の特性giに合致し,それ以前が順次,その要素の親,祖父,それ以前の複数の先祖に一致する場合に,その要素がリストに合致するとみなす。各文字列又はシンボルは,オプションで偶数個の文字列又はシンボルからなるリストを後続させてよい。その場合,要素が合致するためには,リストに先行する文字列又はシンボルが特性giに合致し,さらにリスト内のすべての属性と値の対をもたなければならない。 例えば,この式は次の条件を満たす場合に真を返す。 (match-element? '(e1 (a1 v1 a2 v2) e2 (a3 v3) e3 e4) n) (1) 引数nのもつ特性giがe4であって, (2) 引数nの親のもつ特性giがe3であって, (3) 引数nの祖父のもつ特性giがe2であって, (4) 引数nの祖父が,値がv3の属性a3をもち, (5) 引数nの曾祖父のもつ特性giがe1であって, (6) 引数nの曾祖父が値がv2の属性a2をもち, (7) 引数nの曾祖父が値がv1の属性a1をもつ場合。 引数snlが無指定の場合,(current-node)と解釈する。 パターン内の文字列又はシンボルを特性値と比較し,特性値が大文字代替されていた場合,文字列比較の前に比較対象の大文字代替を行う。 (select-elements nl pattern) 引数nl内の要素であって,手続きmatch-element?によって定義したとおりに,引数patternに合致するノードからなるノードリストを返す。 (q-element pattern nl) (q-element pattern) 引数nlの各要素を根とする部分グローブ内から,手続きmatch-element?によって定義したとおりにpatternに合致する要素を探索する。引数nlが無指定の場合,(current-node)と解釈する。 (q-class symbol nl) (q-class symbol) 引数nlの各要素を根とする部分グローブ内から,クラスがsymbolである要素を探索する。引数nlが無指定の場合,(current-node)と解釈する。 (q-sdata string nl) (q-sdata string) 引数nlの各要素を根とする部分グローブ内から,クラスがsdataであってその特性sysdataがstringである要素を検索する。引数nlが無指定の場合,(current-node)と解釈する。 10.3 補助解析 10.3.1 単語検索 この項の機能をスタイル言語又は変換言語で用いる場合,機能wordが必要となる。 (word-parse nl string) (word-parse nl) 次に示すデータトークン化処理特性集合を用いて補助解析を行い,新規のグローブを構築する。引数stringを指定した場合,その内容はISO 639の言語符号であって,何が単語を構成するか決定するために仮定する言語を指定する。この規格では,使用するアルゴリズムを指定しない。 引数nlの各要素に関して,その要素のデータ内の各単語ごとにトークン化文字列ノードが作成される。補助グローブの根は,それらのトークン化文字列ノードを子としてもつ。すべてのトークン化文字列ノードからなるノードリストを返す。引数nlの要素xが,他の要素,つまり引数nl内のyを子孫として含む場合に,yのデータはxを単語に解析する前に,xのデータからは除かれる。 (select-tokens nl string) 引数nlの要素であって,特性stringが引数stringに等しいトークン化文字列ノードからなるノードリストを返す。 10.3.2 ノード正規式 この項の機能をスタイル言語又は変換言語で用いる場合,機能regexpが必要となる。 型regexpは,ノード正規式を表わす。ノード正規式は,グローブの補助解析の実行に用いることのできるオブジェクトとする。この補助解析は,もともとのグローブに対応するノードをまとめたノードを含むグローブを作成する。ノード正規式の意味は,任意のノードリストs及びsの部分リストとなる任意のノードリストtについて,tがsについてノード正規式に合致するかどうかを定義する。これは正規式を構築する各手続きについて帰納的に定義される。sは,検索リストとして参照する。ノードリストs及びtの両方の要素すべてをふくむノードリストxにおいて,ノードリストsは次の条件を満たす場合にtの直前となる。 (1) sが空の場合又は (2) tが空の場合又は (3) (a) sの要素でxの中で最後に出現するものが,tの要素出xの中で最初に出現するものより前に出現し, (b) 次のようなxの中のノードが存在しない。 (ア) sの中で出現するxのすべての要素に後続し, (イ) tの中で出現するxのすべての要素に先行する。 (regexp? obj) 引数objが正規表現の場合に#tを,その他の場合に#fを返す。 10.3.3 正規式構築子 この10.3.3の手続きで正規式を構築するものは,部分解析手続きで用いられる。 (regexp-node proc) 任意の検索リストに関して,ノードリストが一意ノードを含み,そのノードリストに引数procを適用した結果が真の値を返す場合に合致する正規式を返す。 (regexp-seq regexp1 regexp2 ... regexpn) 手続きregexp-seqは,検索リストxに関して,ノードリストが部分リストs1,s2,...,snに分割でき,検索リストにおいて引数regexpiが,xが1 <= i <= nの範囲でsiに合致し,さらにsiが1 <= i <= n-1の範囲のxについて直前にある場合にノードリストと合致する正規式を返す。 (regexp-or regexp1 regexp2 ... regexpn) 手続きregexp-orは,1 <= i <= nの範囲にあるiにおいて,検索リストxに関して引数regexpiに合致するノードリストに合致する正規式を返す。 (regexp-and regexp1 regexp2 ... regexpn) 手続きregexp-andは,1 <= i <= nの範囲にある各iに関して,引数regexpiに合致するノードリストに合致する正規式を返す。 (regexp-rep regexp) 手続きregexp-repは,ノードリストが空の場合,整数n >= 1に関してノードリストが,部分リストs1,s2,...,snに分割でき,siが1 <= i <= nの範囲のiのそれぞれについて引数regexpに合致し,1 <= i <= n-1の範囲の各iについて,si+1がxに関して直前にあるノードリストの場合に合致する正規式を返す。 (regexp-plus regexp) 手続きregexp-plusは,ノードリストがある整数n >= 1について部分リストs1,s2,...,snに分割でき,1 <= i <= nの範囲のiのそれぞれについて引数regexpに合致し,1 <= i <= n-1の範囲の各iに関してsiがsi+1の直前となるノードリストの場合に合致する正規式を返す。 (regexp-opt regexp) 手続きregexp-optは,ノードリストが空の場合又はノードリストが検索リストxについて引数regexpに合致する場合に,合致する正規式を返す。 (regexp-range regexp k1 k2) 手続きregexp-rangeは,ノードリストをs1,s2,...,snに分割できる,ある整数n,k1 <= n <= k2が存在し,1 <= i <= nの範囲の各iについて,siが引数regexpに合致し,siが1 <= i <= n-1の各iについてsiがsi+1の直前となるノードリストに合致する正規式を返す。k1が0の場合,返される正規式は空ノードリストに合致する。 (string->regexp string) 手続きstring->regexpは,引数stringが示す正規式を返す。引数stringが正しい正規式表現でない場合にはエラーとする。引数stringがISO 9945-2で定義する拡張正規式とする。引数string内の通常の文字は,値がその文字となる特性charをもつノードと合致する。 備考 これは,上述の原始手続きを用いて実装されるかもしれない。 10.3.4 正規式探索手続き この10.3.4の手続きは,次に示す正規式特性集合を用いて新たに補助グローブを作成するために正規式を用いる。 グローブ根 (regexp-search nl regexp) 正規式特性集合を用いて構築した新たな補助グローブを返す。グローブは,nlに関してregexpに合致するnlの各部分リストごとに一つのグループノードを含む。各グループノードの入力特性は,合致する部分リスト内のノードを含む。 備考 入力特性は,補助グローブ内のすべてのノードの特性として内在する。 (regexp-search-disjoint nl regexp) これは部分リストが連続でないことを除いてregexp-searchと同じとなる。二つの部分リストに重なりがあり,nl内の要素で他方のリストのすべての要素に先行する要素が存在する場合,その要素を含むリストを優先して合致させる。一方の部分リストが他方の部分リストを包含する場合,包含する部分リストを優先して合致させる。