3.2.4. 手続きの解説

 代表的な手続きについて説明します。
 手続きはプロシージャ(procedure)とも呼ばれます。

(a) 標準手続き

 式言語の標準手続きについて説明します。

・論理型

  • (not obj)objが#fならば#tを、そうでなければ#fを返します。
  • (boolean? obj)objが#tまたは#fならば#tを、そうでなければ#fを返します。

・等価

  • (equal? obj1 obj2)obj1とobj2が同一とみなされたら#tを、そうでなければ#fを返します。(<等値の意義とは>参照)

・対(ペア)およびリスト

  • (pair? obj)objが対(ペア)ならば#tを、そうでなければ#fを返します。
  • (cons obj1 obj2)obj1をcarに、obj2をcdrにした対(ペア)を返します。
  • (car pair)pairのcar(先頭の要素)を返します。
  • (cdr pair)pairのcdr(先頭要素を除外したもの)を返します。
  • (null? obj)objが空リストならば#tを、そうでなければ#fを返します。
  • (list? obj)objがリスト型ならば#tを、そうでなければ#fを返します。
  • (list obj …)obj …をリストにして返します。
  • (length list)リストの長さ(要素の数)を返します。
  • (append list …)listに、リストである…を追加したものを返します。

・シンボル

  • (symbol? obj)objがシンボルならば#tを、そうでなければ#fを返します。
  • (symbol−>string symbol)symbolの名前を返します。
  • (string−>symbol string)名前がstringとなるようなシンボルを返します。

・キーワード

  • (keyword? obj)objがキーワードならば#tを、そうでなければ#fを返します。
  • (keyword−>string keyword)keywordの名前を返します。
  • (string−>keyword string)名前がstringとなるようなkeywordを返します。

・数量および数値

  • (define−unit unit−name expression)unit−nameがexpressionと等しいとして定義します。
  • (quantity? obj)数量型
  • (number? obj)数値型
  • (real? obj)実数型
  • (integer? obj)整数型
  • それぞれobjが求める型ならば#tを、そうでなければ#fを返します。
  • (= q1 q2 q3 …)等順
  • (< q1 q2 q3 …)昇順
  • (> q1 q2 q3 …)降順
  • (<= q1 q2 q3 …)昇順(等順を含む)
  • (>= q1 q2 q3 …)降順(等順を含む)
  • それぞれ全ての引数が求める順で並んでいるならば#tを、そうでなければ#fを返します。
  • (zero? q)ゼロ
  • (positive? q)
  • (negative? q)
  • (odd? n)奇数
  • (even? n)偶数
  • それぞれ求める性質の数値ならば#tを、そうでなければ#fを返します。
  • (max q1 q2 …)引数のうちの最大値を返します。
  • (min q1 q2 …)引数のうちの最小値を返します。
  • (+ q1 …)全ての引数の和を返します。
  • (* q1 …)全ての引数の積を返します。
  • (− q1 q2)= q1 − q2 を返します。
  • (− q)= −q を返します。
  • (− q1 q2 …)= q1 − q2 …、q1から全ての引数を順に引いたものを返します。
  • (/ q1 q2)= q1/q2 を返します。
  • (/ q)= 1/q を返します。
  • (/ q1 q2 …)= (q1/q2)/ …、q1を全ての引数で順に割ったものを返します。
  • (abs q)引数の絶対値を返します。
  • (quotient n1 n2)n1/n2の整数除算における商を返します。
  • (remainder n1 n2)n1/n2の整数除算における剰余を返します。符号はn1によります。
  • (modulo n1 n2)n1/n2の整数除算における剰余を返します。符号はn2によります。
  • (floor x)xより大きくならない最大の整数を返します。
  • (ceiling x)xより小さくならない最小の整数を返します。
  • (truncate x)xの絶対値より大きくならない最も近い整数を返します。
  • (round x)xを整数に四捨五入して返します。
  • (exp x)e(自然対数の底)のx乗を返します。
  • (log x)xの自然対数を返します。
  • (sin x)sin(サイン)を返します。
  • (cos x)con(コサイン)を返します。
  • (tan x)tan(タンジェント)を返します。
  • (asin x)asin(アークサイン)を返します。
  • (acos x)acos(アークコサイン)を返します。
  • (atan x)atan(アークタンジェント)を返します。
  • (atan q1 q2)実数部がq2、虚数部がq1となる複素数を返します。
  • (sqrt q)qの平方根を返します。
  • (expt x1 x2)x1のx2乗を返します。
  • (quantity−>number q)qが示す数量の数値を返します。
  • (number−>string number)
  • (number−>string number radix)
  • 数値を文字列にして返します。radixは、数値を文字列に変換する際の基数を指定します。2(=2進数)、8(=8進数)、10(=10進数)、16(=16進数)が指定できます。radixを省略すると10として扱われます。
  • (format−number n string)
  • (format−number−list list obj1 obj2)
  • nをstringで指定した書式で文字列にします。listの場合には、obj1は書式、obj2は区切り子としてlist全体を文字列にして返します。
  • (string−>number string)
  • (string−>number string radix)
  • 文字列を数値にして返します。radixは、数値を文字列に変換する際の基数(2,8,10,16)を指定します。

・文字

  • (toupper case−conversion−list)リストの小文字を大文字に変換します。
  • (tolower case−conversion−list)リストの大文字を小文字に変換します。
  • (character character)*第1文字めと第2文字めの変換を指定します。
  • (char? obj)objが文字ならば#tを、そうでなければ#fを返します。
  • (char=? char1 char2)
  • (char<? char1 char2)
  • (char>? char1 char2)
  • (char<=? char1 char2)
  • (char>=? char1 char2)
  • 文字の大小・等値関係を調べます。
  • (char−ci=? char1 char2)
  • (char−ci<? char1 char2)
  • (char−ci>? char1 char2)
  • (char−ci<=? char1 char2)
  • (char−ci>=? char1 char2)
  • 大文字・小文字の区別なしに文字の大小・等値関係を調べます。
  • (char−upcase char)
  • (char−downcase char)
  • charを大文字または小文字に変換します。

・文字列

  • (string? obj)objが文字列ならば#tを、そうでなければ#fを返します。
  • (string char …)char …から文字列を生成します。
  • (string−length string)stringの文字数を返します。
  • (string−ref string k)stringのk番目の文字を返します。
  • (string=? string1 string2)string1とstring2が等しければ(長さと同じ配列の文字を持つならば)#tを返します。
  • (string−ci=? string1 string2)同様に大文字小文字の区別なしにstring1とstring2が等しいかを調査します。
  • (string−equiv? string1 string2)現在の言語によって照合し、比較レベルkにおいて等しければ#tを返します。
  • (string<? string1 string2)
  • (string>? string1 string2)
  • (string<=? string1 string2)
  • (string>=? string1 string2)
  • (string−ci< string1 string2)
  • (string−ci> string1 string2)
  • (string−ci=<? string1 string2)
  • (string−ci=>? string1 string2)
  • 文字列の大小を比較します。
  • (substring string start end)stringのstartからendまでを抜き出して返します。
  • (string−append string …)与えられた文字列を連結して返します。
  • (string−>list string)文字列を構成する文字のリストを返します。
  • (list−>string list)文字のリストを文字列にして返します。

・手続き

  • (procedure? obj)objが手続きならば#tを返します。
  • (apply proc args)手続きprocを呼び出します 。
  • (apply proc arg1 … args)引数のリストargをもつ手続きprocを呼び出します。(注意:引数procには手続きでなく手続き名を記述します。)
  • (map proc list1 list2 …)listの1つ1つの要素にprocを適用した結果をリストにして返します。
  • (external−procedure string)公開識別子stringを外部手続きとして実行します。

日付および時間

  • (time)1970年1月1日午前0時0分0秒(GMT:グリニッジ標準時間)から経過した時間を秒数(整数)で返します。
  • (time−string k)
  • (time−string k boolean)
  • 日付けおよび時間の整数表現をISO 8601形式の文字列に変換します。boolean指定が#tならばGMTに、そうでなければローカルタイムに変換します。

・エラー発生

  • (error string)stringで説明されるエラーを発生させます。

<等値の意義とは>

  • 論理値ともに#tまたはともに#fであること。
  • シンボルともに文字列化してstring=?で#tであること。
  • 数値正確性が同一で、= の意味で等しいこと。
  • 文字列ともにstring=?で#tであること。
  • 文字ともにchar=?で#tであること。
  • リストともに空リストであること。
  • ペアcarとcdrがともにequal?で#tであること。
  • 手続き(等値の意義は、完全には定義されていません。)

(b) SDQL手続き

 SDQL手続きはグローブを参照するのが目的です。
 SGML文書をDTDを参照して論理構造データとして構築したものがぶグローブです。
 グローブには各タグの依存関係が木構造のデータとして保持されています。このようなグローブにはSGML文書のもつすべての情報(論理構造+文書)が含まれているといえます。
 DSSSLスタイル言語の役割の一つに、このグローブという木構造にスタイル情報を付加して、流し込みオブジェクト木という木構造を構築することがあります。
 この流し込みオブジェクト木を構築するためにグローブを参照するための手段が必要になります。
SDQLとは、式言語にグローブを参照するための手続きを追加したものです。
 グローブを式言語の形で表現するために、新たにnode−listという型が用意されています。これはリストの形でグローブの木構造を表現するためのものです。
 (グローブには、nodeという型はありませんので初心者の方は注意が必要です。)
 ここではSDQLの代表的な手続きを選んで説明します。
 スタイル言語スクリプトで必要となる主な手続きのいくつかを説明してありますので、充分に理解をしてください。

  1. (current−node)
  2. (node−list−empty? nl)
  3. (node−list? nl)
  4. (parent nl)
  5. (node−list−length nl)
  6. (node−list−first nl)
  7. (node−list−rest nl)
  8. (child−number snl)
  9. (first−sibling? snl)

<1>( current−node )

 カレントノード(現在処理しているノード)を返します。

<例>
  (element title
    (make paragraph
          font−weight: ’bold
          (let ((chapter−num (child−number (parent (current−node)))))
          (literal (number−>string chapter−num) " "))
          (process−children)))

 このように記述すると、<title>タグ内に書かれた文章の前に章番号を入れる事ができます。
 (parent nl) はノード nl の親ノードを返します。
 (child−number snl) は snl の子番号を返します。(child−number snl) 参照のこと。
 (number−>string num) は、数字を文字列に変換します。

<2>( node−list−empty? nl )

 ノードリスト nl が空リストの場合は #t を、空リストでなければ #f を返します。
 通常のリストにおける(null? xs)に相当します。

<例>
  (element report
    (make paragraph
          (if (node−list−empty? (parent (current−node)))
              (literal "root")
              (literal "not root"))))

 
 このように記述した場合、report がルートの時は

root

 
と表示され、report がルートでない時は

not root

 
と表示されます。

<3>( node−list? nl )

 nl がノードリストならば #t を返し、ノードリストでないならば#f を返します。(nl が空ノードリストの場合でも、#t を返します。)
 通常のリストにおける ( list? xs ) に相当します。

<4>( parent nl )

 =ノード nl の親ノードを返します。
 <例>は ( current−node ) のものを参照してください。

<5>( node−list−length nl )

 ノードリスト nl の要素数を返します。
 通常のリストにおける ( length xs )に相当します。

<6>( node−list−first nl )

 ノードリスト nl の最初の要素を返します。
 通常のリストにおける ( car xs ) に相当します。

<7>( node−list−rest nl )

 ノードリスト nl の最初の要素以外の要素を返します。
 通常のリストにおける ( cdr xs ) に相当します。

<8>( child−number snl )

 引数snlの子番号を返します。
 子番号とは現要素と同じ共通識別子をもち、現要素に先行する兄弟の数に1を加えたものとなります。すなわち、グローブの木構造で同じ親を持つ同一種類の要素同士を比べて、何番目に位置するかを示します。

<9>( first−sibling? snl )

 引数snlが同じ共通識別子の先行する兄弟をもたない場合に #t、その他の場合には#fを返します。
 すなわち、グローブの木構造で同じ親をもつ同一種類の要素のうちで、最も先に現れる要素であれば #tを返します。

(c) sosofo手続き

 sosofoは、DSSSLスタイル言語に特有の流し込みオブジェクトクラスを指す型です。
 sosofoを返す手続きで代表的なものを解説します。

  1. (process−children)
  2. (process−children−trim)
  3. (process−matching−children pattern)
  4. (empty−sosofo)
  5. (literal string)
  6. (sosofo−append sosofo sosofo … )

<1>( process−children )

 カレントノードの子を処理して得たsosofoを返します。
<例>
 DSSSLで

(element list               ;3節を参照
  (make paragraph           ;3節を参照
        font−size: 12pt
        font−weight: ’bold
        (literal " o ")     ;5を参照
        (process−children)))

のように記述し、SGMLで

<list>リストです。</list>
<list>これもリストです。</list>
<list>さらにリストです。</list>

のように書くと

o リストです。
o これもリストです。
o さらにリストです。

のように表示されます。

<2>( process−children−trim )

 process−childrenと同様。
 ただし、特性input−white−spaceが真となる特性charを持つノード列の(空白文字)を取り除く点が異なります。ノード列の先頭や末尾の空白を取り除きたい場合に使います。

<3>( process−matching−children pattern )

 自分の子のタグの中のpatternという名前のタグに囲まれた文章を表示します。
<例>
 DTDで

<!element report  − − (title,section*) >
<!element title   − − (#pcdata)        >
<!element section − − (#pcdata)        >

のように指定されていて、DSSSLスクリプトで

(element report
  (make simple−page−sequence
        page−width: 210mm
        page−height: 297mm
        (process−matching−children "title")))

のように記述した場合、<section>タグ内に文章が書かれていてもその文章は表示されず<title>タグ内で書かれている文章のみが表示されます。

<4>( empty−sosofo )

 タグ内に書かれた文章を表示しないようにします。

<5>( literal string )

 文字列を表示します。
 この手続きを使うとタグ内に書かれた文章が表示されなくなりますから多くの場合は同時に( process−children ) を使用します。<例>は ( process−children ) 等を参照してください。

<6>(sosofo−append sosofo sosofo … )

 複数のsosofoを結合して、一つのsosofoとして扱うようにします。

<例>
  (define page2
    (sosofo−append (literal "− ")
                   (page−number−sosofo)
                   (literal " −")))

  (element report
    (make simple−page−sequence
          footer−margin: 2cm
          center−footer: page2))

 このように記述するとページ数の表示の仕方が“− 3 −”のようになります。
 (page−number−sosofo) はページ数を表示する sosofo です。
 この例のように center−footer: を指定するとページのフッタ部の中心にページ数が表示されます。

<<prev      next>>