[Top] [Contents] [Index] [ ? ]

Yorick

1. Basic Ideas  A tutorial-like introductory chapter.
2. Using Array Syntax  Using array syntax.
3. Graphics  How to plot things.
4. Embedding Compiled Routines Inside Yorick  Embedding compiled code in a custom Yorick.
Concept Index  

 -- The Detailed Node Listing ---

Basic Ideas

1.1 Simple Statements  
1.2 Flow Control Statements  Defining functions, conditionals, and loops.
1.3 The Interpreted Environment  How to use Yorick's interpreted environment.

Simple Statements

1.1.1 Defining a variable  
1.1.2 Invoking a procedure  
1.1.3 Printing an expression  

Flow Control Statements

1.2.1 Defining a function  
1.2.2 Defining Procedures  
1.2.3 Conditional Execution  Conditionally executing statements.
1.2.4 Loops  Repeatedly executing statements.
1.2.5 Variable scope  Local and external variables.

Conditional Execution

1.2.3.1 General if and else constructs  
1.2.3.2 Combining conditions with && and ||  

Loops

1.2.4.1 The while and do while statements  
1.2.4.2 The for statement  
1.2.4.3 Using break, continue, and goto  How to break, continue, and goto from a loop body.

Variable scope

1.2.5.1 extern statements  
1.2.5.2 local statements  

The Interpreted Environment

1.3.1 Starting, stopping, and interrupting Yorick  
1.3.2 Include files  How to read Yorick statements from a file.
1.3.3 The help function  Using the help command.
1.3.4 The info function  Getting information about a variable.
1.3.5 Prompts  What Yorick prompts mean.
1.3.6 Shell commands, removing and renaming files  Issuing shell commands from within Yorick.
1.3.7 Error Messages  What to do when Yorick detects an error.

Include files

1.3.2.1 A sample include file  
1.3.2.2 Comments  
1.3.2.3 DOCUMENT comments  The help command recognizes special comments.
1.3.2.4 Where Yorick looks for include files  Directories Yorick searches for include files.
1.3.2.5 The `custom.i' file  How to execute Yorick statements at startup.

Error Messages

1.3.7.1 Runtime errors  
1.3.7.2 How to respond to a runtime error  

Using Array Syntax

2.1 Creating Arrays  How to originate arrays.
2.2 Interpolating  Interpolation functions.
2.3 Indexing  How to reference array elements.
2.4 Sorting  How to sort an array.
2.5 Transposing  How to change the order of array dimensions.
2.6 Broadcasting and conformability  Making arrays conformable.
2.7 Dimension Lists  

Indexing

2.3.1 Scalar indices and array order  
2.3.2 Selecting a range of indices  
2.3.3 Nil index refers to an entire dimension  
2.3.4 Selecting an arbitrary list of indices  
2.3.5 Creating a pseudo-index  
2.3.6 Numbering a dimension from its last element  
2.3.7 Using a rubber index  
2.3.8 Marking an index for matrix multiplication  
2.3.9 Rank reducing (statistical) range functions  
2.3.10 Rank preserving (finite difference) range functions  

Graphics

3.1 Primitive plotting functions  The basic drawing functions.
3.2 Plot limits and relatives  Setting plot limits, log scaling, etc.
3.3 Managing a display list  The display list model.
3.4 Getting hardcopy  How to get it.
3.5 Graphics style  How to change it.
3.6 Queries, edits, and legends  Seeing legends and making minor changes.
3.7 Defaults for keywords  Setting (non-default) defaults.
3.8 Writing new plotting functions  Combining the plotting primitives.
3.9 Animation  Spielberg look out.
3.10 3D graphics interfaces  An experimental interface.

Primitive plotting functions

3.1.1 plg  Plot graph.
3.1.2 pldj  Plot disjoint lines.
3.1.3 plm  Plot quadrilateral mesh.
3.1.4 plc  Plot contours.
3.1.5 plf  Plot filled quadrilateral mesh.
3.1.6 pli  Plot image.
3.1.7 plfp  Plot filled polygons.
3.1.8 plv  Plot vectors.
3.1.9 plt  Plot text.

Plot limits and relatives

3.2.1 limits  Set plot limits.
3.2.2 logxy  Set log axis scaling.
3.2.3 gridxy  Set grid lines.
3.2.4 palette  Set color palette.
3.2.5 Color model  More about color.

limits

3.2.1.1 Zooming with the mouse  How to zoom by mouse clicks.
3.2.1.2 Saving plot limits  Save and restore plot limits.
3.2.1.3 Forcing square limits  Assure that circles are not ellipses.

Managing a display list

3.3.1 fma and redraw  Frame advance (begin next picture).
3.3.2 Multiple graphics windows  How to get them.

Getting hardcopy

3.4.1 Color hardcopy  Dumping palettes into hardcopy files.
3.4.2 Binary CGM caveats  Caveats about binary CGM format.
3.4.3 Encapsulated PostScript  Encapsulated PostScript output.

Graphics style

3.5.1 Style keyword  Accessing predefined graphics styles.
3.5.2 `style.i' functions  Bypassing predefined graphics styles.
3.5.3 Coordinate systems  Multiple coordinate systems.
3.5.4 Ticks and labels  How to change them.

Queries, edits, and legends

3.6.1 Legends  Setting plot legends.
3.6.2 plq and pledit  The plot query and edit functions.

3D graphics interfaces

3.10.1 Coordinate mapping  Changing your viewpoint.
3.10.2 Lighting  The 3D lighting model.
3.10.3 gnomon  Gnomon indicates axis orientation.
3.10.4 plwf interface  The plot wire frame interface.
3.10.5 slice3 interface  The slice and isosurface interface.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1. Basic Ideas

Yorickはインタプリタ プログラミング言語である。Yorickを使って、任意の テキストファイルやバイナリファイルからの入力(通常、数値リストである)を 読込んで処理し、結果を他のファイルに書込む事が出来る。計算機の画面に結果 を表示する事も可能である。

Yorickの式と流れ制御構文はC言語と似ているが、Yorick言語は宣言文を欠いている。 又、Yorickの配列添字構文はCよりもFortranに似ている。

1.1 Simple Statements  
1.2 Flow Control Statements  Defining functions, conditionals, and loops.
1.3 The Interpreted Environment  How to use Yorick's interpreted environment.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1 Simple Statements

インタプリタは入力行を即座に実行する。Yorickの入力行の殆どは変数定義、手続 呼出、或いは式の値表示である。

1.1.1 Defining a variable  
1.1.2 Invoking a procedure  
1.1.3 Printing an expression  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1.1 Defining a variable

次の5個のYorickの構文は、5個の変数c,m, E,thetafileを定義する:

 
c = 3.00e10;  m = 9.11e-28
E = m*c^2
theta = span(0, 6*pi, 200)
file = create("damped.txt")

変数名では大文字と小文字を区別する。従って、Eは変数@kdb{e}と同一物 ではない。変数名はアルファベット(大文字或いは小文字)や下線(@kdb{_})で開始 しなければならないが、後続の文字に数字を含んでいても良い。

セミコロンでYorickの文(Statement)を終える。従って、例題の最初の行は二つの文 を含む。Yorickの文を入力し易くする為、殆どの行末にセミコロンを入れる必要が 無い様にすれば良い。ここで、もし貴方がYorickのプログラムをテキストファイル で記述するのであれば(Yorick自体に直接入力する方法の真反対)、各行末の セミコロンは誤った解釈による修正を減らし、その上、プログラムがより読み易く なる。逆に、改行(new line)で文末を表現する必要はない。もし、行が不完全で あれば、自動的に文が次の行へと続けられる。だから、上の例で、第二、第三の 行は以下の様に入力可能である:

 
E=
  m *
  c^2
theta= span(0, 6*pi,
            200)

例題の二行目にある*^は積と羃を表現する。その他の一般的な 算術演算子は+,-,/(割算)と% (余り、即ち剰余)である。 Yorickでの、これらの演算子の算術的表現書式と括弧(parentheses)の規則は FortranやCの場合と同様である(但し、^はCに於ける羃の意味ではなく、 Fortranでは**をその演算子として用いている)。

span函数は0から開始し、6*piで終了する200個の均等に区切 られた値を返す。変数piは3.14159...と予め定義されている。

create)函数は新しいファイルに対象を返す。変数fileで、出力函数 がデータを書込むべき場所を指定する。cmEの様な数、 thetaの様な数配列、fileの様なファイルに加えて、Yorickの変数は、 後の章で取り上げる幾つかの対象の種類を表現していても良い。

=演算子はそれ自体が二項演算子で、左被演算子を再定義する副作用がある。 それは右から左へと繋ぎ合せる。即ち、一番右端の=の演算が最初に実行さ れる(^を除く全ての他の二項演算子は左から右に繋ぎ合せる)。従って、 幾つかの変数は単一の文で単一の値に設定しても良い:

 
psi = phi = theta = span(0, 6*pi, 200)

変数を定義すると、Yorickは凡る以前の値やデータ型を忘却してしまう:

 
phi = create("junk.txt")


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1.2 Invoking a procedure

副作用があるYorick函数を手続として呼出しても良い。その函数による返却値は 無用のものとして捨てられる。

 
plg, sin(theta)*exp(-theta/6), theta
write, file, theta, sin(theta)*exp(-theta/6)
close, file

plg函数は画面にグラフを表示する。ここでは減衰正弦波を三周期分描く。 そのグラフは200個の隣接する点を直線で繋いだものになる。

write函数はファイル`damped.txt'にその同じ減衰正弦波を2列200行 の値の表を書込む。そして、closeでファイルを閉じ、後のwrite操作 で使えなくする。

長い引数リストをコンマで行を区切って複数の行にしても良い。例えば、 write文を次の様に書出す:

 
write, file, theta,
             sin(theta)*exp(-theta/6)

手続(procedure)を無引数で呼出しても良い。幾つかのグラフィックス函数で 屡々この方法が使われている:

 
hcp
fma

hcp函数は後の再描画や印刷の為の"ハードコピーファイル"に現時点での グラフィックスウインドウの内容を書込む。fma函数は "コマ進行(frame advance)"用である。つまり、新しい頁上に後続の描画命令で 描ける様にする。通常、plgの様な描画命令は、以前のfmaから後に 描画された物全ての真上に描かれる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1.3 Printing an expression

非修飾式(unadorned expression)はYorickの構文でも誤りではない。Yorickは それ自体の値を表示する。これから紹介する例には、貴方が打込むものが文字列 だけのもの見受けられる。print函数とその出力を禁じる為に、私は画面が どの様に見えているかを示す必要がある -- 単に貴方が打ち込んだもののみならず、 Yorickの表示も含めて。開始する際にYorickは入力の為にプロンプト>と後に 続けて空行を出す(@oxref{Prompts})。だから、この節の例では、>で開始し ている行が入力行である。ここでの行の順番はYorickの応答順となっている。

 
> E
8.199e-07
> print, E
8.199e-07
> m;c;m*c^2
9.11e-28
3.e+10
8.199e-07
> span(0,2,5)
[0,0.5,1,1.5,2]
> max(sin(theta)*exp(-theta/6))
0.780288

spanの例題で、鍵括弧([])で閉じられて、コンマで区切られたリストで配列 が表示されている事に注意しよう。これはまたYorickの配列の構文である。 数値データについては、print函数は常にYorickの文で文法に則った書式で、 その出力を常に表示する。尚、"より整った"出力を望むなら、write函数を 使わなければならない。大きな配列の式や変数名の入力に注意しよう。と云うのも、 沢山の出力が容易だからである(偶々、この様な羽目に陥った場合、control-cを 押してYorickを停止する事が可能であるsee section 1.3.1 Starting, stopping, and interrupting Yorick)。

殆どの非数値的対象は或る有用な情報を表示する。例えば、上のファイルを閉じる 前に、上のfile変数を入力すると次が表示される:

 
> file
write-only text stream at:
  LINE: 201  FILE: /home/icf/munro/damped.txt

貴方は気付いているかもしれないが、変数表示と無引数手続の起動との文法的区分が 出来ない。Yorickはどの操作が実行時に適切であるかを判断する。だから、 fileが函数であれば、前の例題の入力行で@kbf{file}函数を呼出す。更に、 それが函数でなければ、Yorickはfile変数を表示する。print函数の 明示的な利用は函数を表示する事だけである:

 
> print, fma
builtin fma()


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2 Flow Control Statements

会話的操作でYorickに入力する殆ど全ての事は、以前の利用で記述された単純な Yorickの文、即ち、変数定義、手続の呼出し、そして式の表示と云った事である。

とは言え、実際にYorickを使う為には、貴方自身の函数や手続を記述する必要 がある。キーボードでYorickの構文を打込む事でこれが行えるが、通常は函数定義 をテキストファイルに記述すべきである。どの様にして、この様な"包含(include)" ファイルを構成するかは次の節の話題とする。この節では函数、条件やループを 定義するYorickの構文を紹介する。

1.2.1 Defining a function  
1.2.2 Defining Procedures  
1.2.3 Conditional Execution  Conditionally executing statements.
1.2.4 Loops  Repeatedly executing statements.
1.2.5 Variable scope  Local and external variables.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.1 Defining a function

減衰正弦波を考えよう。丁度、バネ上の錘の様に錘を弾くと上下に揺れる振動子の 時間経過を記述したものである。

基本的な波形は振動子のQで決定される。ここで、高いQは僅かな摩擦力がある事を 意味し、その場合、錘は長い周期の間中、揺れ続ける。低いQであれば摩擦力が 大きく、短周期になる。振動子の振幅はそれ故に二つの助変数、即ち、phase (位相:振動子の単位時間での自然周期)、そしてQの函数となる:

 
func damped_wave(phase, Q)
{
  nu = 0.5/Q;
  omega = sqrt(1.-nu*nu);
  return sin(omega*phase)*exp(-nu*phase);
}

この函数本体では各Yorickの文をセミコロンで終えている(see section 1.1.1 Defining a variable)。

変数phaseQは函数の助変数と呼ばれる。変数nuomega は函数本体の最初の二行で定義され、この函数の局所変数となる。つまり、 damped_waveを呼出しても、環境内のphaseQnuomegaと名付けられた変数の何れもが変更されない。

実際にdamped_waveを呼出す事で生じる唯一の影響は、本体の第三行目の return文で実行した結果を返す事である。つまり、damped_waveの 呼出では何等の副作用も無い。damped_waveを次の様に式中で用いる事も 可能である:

 
> damped_wave(1.5, 3)
0.775523
> damped_wave([.5,1,1.5,2,2.5], 3)
[0.435436,0.705823,0.775523,0.659625,0.41276]
> q5 = damped_wave(theta,5)
> fma; plg, damped_wave(theta,3), theta
> plg, damped_wave(theta,1), theta

この例題の最後の二つの行では、Q=3の場合とQ=1の場合の振動をグラフで比較 している。

damped_waveの引数が配列であっても良い事に注意しよう。この場合、結果は 入力の各成分に対応する結果の配列となる。この例ではq5が200個の数の配列 となる。phase引数(theta)が配列だったりするが、Yorickは混同しない。 と云うのも、Q引数(5)がスカラーの為である。二つの配列間の"適合性 (conformability)"に関する厳密な規則は後(see section 2.6 Broadcasting and conformability)で述べる; 尚、通常は貴方が期待した通りのものが得られる。

ここで、YorickはQがスカラーの為、damped_wavenuomegaの両方をスカラーとして評価する。その一方で、phaseが配列 だから、omega*phasenu*phaseが配列となる。被演算子が配列で あれば、何時でも結果は配列になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.2 Defining Procedures

任意のYorick函数を手続として呼出しても良い;その返却値は単純に棄却される。 手続としてkbd{damped_wave}を呼出しても、副作用が無い為に、取り付く島も無い。 その逆の場合が、その副作用から単に呼出された函数である。その様な函数 は明示的なreturn文を持つ必要は無い。

 
func q_out(Q, file_name)
{
  file = create(file_name);
  write, file, "Q = "+pr1(Q);
  write, file, "   theta       amplitude";
  write, file, theta, damped_wave(theta,Q);
}

pr1函数("print one value(一つの値を表示)"向け)は、その数値引数を表現 する文字列を返し、それから+演算子で二つの文字列の結合を行う。

次の行でq_outを呼出そう:

 
q_out, 3, "q.out"

はっきりとしたreturn文を欠いているものの、q_out函数は語るに 足る二つの特異性を持っている。

第一に、変数thetaは決して定義されていない。而し、函数createwriteの両方はそうではない。函数内部で定義されていない任意の記号は 函数に対しては外部(external)となる。既に記した様に、函数内部で定義 された助変数と変数はその函数に対して局所的(local)になる。ここで、 thetaはq_outが呼出される前に定義された位相角(phase angle)の200個の 配列である。q_outを次に呼出す前に、theta(その次元と値の両方)を変更 する事が可能である。即ち、外部参照では、それを用いる函数の呼出との間で変更 しても良い。

第二に、fileは決して明示的に閉じられない。函数が値を返す時、 (fileの様な)局所変数は消える。ファイル対象が消えると、対応する ファイルは自動的に閉じられる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.3 Conditional Execution

q_out函数の設計は改善可能である。記述された様に、各出力ファイルは一つ の波動だけを含んでいる。幾つかの波動を一つのファイルに書込むオプションが 欲しいなら、この別の方法を考えよう:

 
func q_out(Q, file)
{
  if (structof(file)==string) file = create(file);
  write, file, "Q = "+pr1(Q);
  write, file, "   theta       amplitude";
  write, file, theta, damped_wave(theta,Q);
  return file;
}

if文は、条件(structof(file)==string)が真(true)の場合、又、その時 に限って、本体(fileの再定義)を実行する。任意のスカラー数を条件として 用いても良い。この場合、非零の値が"真(true)"となり、値が零であれば "偽(false)"となる。

structof()函数は、その引数が配列であればデータ型対象を返し、その他で あればnil([])を返す。殊に、fileが("q.out"の様な)文字列で あれば、structofは文字列のデータ型の文字列を返す。二項演算子== (割当=と区別される)が同値性を検証し、"真(true)"か"偽(false)"を返す。 これは文字列の様な非数値対象に対しても動作する事に注意しよう。

それ故、file引数が文字列であれば、新しいq_outでは、fileが ファイル名であると仮定して、それを生成し、対応するファイル対象として、再定義 する。そうして、函数本体の最初の行の後で、たとえ、ファイル名が函数に引き渡 されたとしても、fileはファイル対象となる。更に、助変数fileq_outに対して局所的なので、この謎めいた処理の何れも、q_out外部 に何等の影響を与えない。

新しいq_outでの第二の仕掛はreturn文の再出現である。大元の列の 呼出:

 
q_out, 3, "q.out"

で以前と同じ結果を得る。即ち、ifの条件が真であれば、ファイルが生成され、 それから波動データが記入される。この時、ファイル対象が返され、棄却されるだけ である。何故なら、q_outが手続として呼出されたからである。ファイル対象が 消えると、ファイルが閉じられる。しかし、q_outが函数として呼出されて いれば、そのファイル対象を保存する事が可能で、その場合、ファイルは開いたまま である:

 
f = q_out(3,"q.out")
q_out,2,f
q_out,1,f
close,f

すると、ファイルq.outはQ=3の波動、後に続いてQ=2とQ=1の波動を含む。 第二と第三行でのq_outの呼出では、file助変数は既にファイル対象 なので、ifの条件が偽となり、そこで、createが呼出されない。 第二(又は第三)の呼出からの返却値が破棄される時、そのファイルが閉じられ ない事に注意しよう。即ち、、変数@knd{fは同じファイル対象を破棄された 返却値として同じファイル対象を参照する。closeの明瞭な呼出が無くても、 それへの最後の参照が消えた時に、ファイルは閉じられる。

1.2.3.1 General if and else constructs  
1.2.3.2 Combining conditions with && and ||  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.3.1 General if and else constructs

最も一般的なif文の書式は次のものである:

 
if (条件) 真の場合の文;
else 偽の場合の文;

幾つかの選択肢の中から選ばなければならない時、else文自体に if文を追加する:

 
if (条件_1) 1であった場合の文;
else if (条件_2) 2であった場合の文;
else if (条件_3) 3であった場合の文;
...
else 何も無い場合の文;

最後のelseは常に予備である。それが無ければ、どの条件も満たされない 場合には、結局、何も起きない。

条件的に一つ以上の文を実行しなければならい場合がままある。Yorickでは非常に 一般的だが、曲り括弧(curly bracket)で幾つかの文を囲む事で、一つの合成文に 纏めても良い:

 
{ statement_1; statement_2; statement_3; statement_4; }

通常、曲り括弧と各文は、合成文中の一員である事がより明確になる様に意図し、 行に分けて記述すべきである。更に、if-else構築で一つの分岐が一つ以上の文を 要求する場合は、各分岐を曲り括弧で括った合成文として記述するべきである。 それ故、四個の分枝を持つifで、その第二のifは二つの文、そして、 elseが三個の文を要求するものに対し、これを記述すると次の様になる:

 
if (条件_1) {
  1_の場合の文;
} else if (条件_2) {
  2_の場合の文A;
  2_の場合の文B;
} else if (条件_3) {
  3_の場合の文;
} else {
  対応するものが無い場合の文A;
  対応するものが無い場合の文B;
  対応するものが無い場合の文C;
}

else文は非常に特殊な構文を持っている:Yorickでは、前の文の書式 に依存する唯一の文である。即ち、elseifに従わなければならない。 函数外部のYorick文(と合成文)が直ちに実行されるので、その様な状況でelse の利用には非常に慎重でなければならない。ifが既に実行されていれば (曲り括弧の無い例題の様に)、その後続のelseは構文上の誤謬となる!

この複雑怪奇な問題を回避する最善の方法は、函数外部でelse文を利用する 場合、常に先程の例題の曲り括弧の構文を用いる事である(その様な文脈では、 兎に角、貴方はそれを屡々必要としない)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.3.2 Combining conditions with && and ||

論理演算子&&("and")と||("or")で条件式を結合する。!("not") 演算子は条件式を否定する。!は最高位の順位を持ち、&&|| もそうである。従って、異った順位を強要する為には括弧で括る必要がある。

("and"と"or"演算子&!に各々注意しよう。 これらは決して 条件とは組合せて利用してはならない。即ち、それらはビットの設定と隠蔽の検出 (set-and-mask bit fiddling)で用いられるものである)

数値を比較する演算子は==(等号)、!=(不等号)、>(大なり)、 <(小なり)、>=(以上)、そして<=(以下)である。これら全てが &&よりも高い順位を持つが、!や任意の算術的演算子よりも低い。

 
if ((a<b && x>a && x<b) || (a>b && x<a && x>b))
  write, "xはaとbの間にある"

ここで、&&の右被演算子の式は、その左被演算子が実際に真の場合のみ 実行される。同様に、||の右被演算子は左側が偽の場合のみ実行される。 それ故、&&||の被演算子の順番は、最も計算負荷の高い式を右に 置く事が重要である。論理的"and"や"or"函数は可換であるものの、&&||の被演算子の順番は厳密である、

例題では、a>bであればx>ax<bが実際に実行されていない。 何故なら、a<bが偽である事が示された為である。||の左被演算子が 偽なので、その右被演算子が評価される事になる。

演算子&&||には、右被演算子は必要が無ければ絶対実行しないと云う 賢さがある事はさておいて、例題には明かな非効率性がある: 第一に、a>=b であれば、a<ba>bは検証されている。第二に、a<bの場合、 xabの間になくても、||の右被演算子は兎に角評価 される。Yorickは非効率なこの方法を避ける為に、3成分演算子(ternary operator) を持っている:

 
expr_A_or_B= (条件? Aが真の場合の式 : Bが偽の場合の式);

?:演算子は、条件が真であれば、真中の式を評価し、そうでなれば右側の 式を評価する。つまり、" 本当? その通り : 否 "の形である。その効率性を 調べよう:

 
if (a<b? (x>a && x<b) : (x<a && x>b))
  write, "xはaとbの間にあるよ";


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.4 Loops

Yorickプログラムで大半のループが陰的である。即ち、配列引数同士の演算は配列 になる事を思い出そう。Yorickプログラムを記述する時は何時でも、陽的な 全てのループに対して懐疑的となるべきである。配列構文を賢く利用して、 ループが避けられるかどうか常に自問自答しよう。

適切なYorickのループを説明する為に、一つの呼出でQの幾つかの値を書き出す q_outを見直そう。兎に角、この種の函数改訂はYorickのプログラム開発では 非常に一般的である。貴方がある函数を使うに従い、組込まれているコードが屡々 同じである事に気付き、それが、あたかも函数の一部として含まれているかの様で あれば、労力を減らせる事を示唆している。再度、注意深く作業を進めれば、 q_outの以前の挙動全てが完璧なものになる:

 
func q_out(Q, file)
{
  if (structof(file)==string) file = create(file);
  n = numberof(Q);
  for (i=1 ; i<=n ; ++i) {
    write, file, "Q = "+pr1(Q(i));
    write, file, "   theta       amplitude";
    write, file, theta, damped_wave(theta,Q(i));
  }
  return file;
}

ここには二つの新しい機能がある。一つは配列Qの長さを返すnumberof 函数で、配列Qi番目の成分を引出す配列見出し構文である。 Qがスカラーであれば(この最新版の前はそうであった)、numberofは1 を返し、Q(1)Qの場合と同様である。だから、スカラーのQは 以前と同様に動作する。

しかし、最も重要な新しい機能はforループである。それはiを1に 初期化し、それから、in以下である限り、3個のwrite文から成る ループ本体を実行する。最後に、各文の遂行後にi<=n条件が評価される前に、 増分式++iが実行される。++ii=i+1と同値である。又、 --ii=i-1を意味する。

ループの本体はまた単文でも良く、その場合は曲り括弧は不必要である。例えば、 次の例ではQ=3,Q=2とQ=1の曲線をファイル`q.out'に書込んでから、それらを 描くものである:

 
q_list = [3,2,1]
q_out, q_list, "q.out"
fma; for(i=1;i<=3;++i) plg, damped_wave(theta,q_list(i)), theta

plgを本体に持つforループは曲線列を重ねて描く最も簡単な方法である。 3個の単文型の後で、for文がキーボードからの最も頻繁に直接利用されている 事が判る。

1.2.4.1 The while and do while statements  
1.2.4.2 The for statement  
1.2.4.3 Using break, continue, and goto  How to break, continue, and goto from a loop body.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.4.1 The while and do while statements

whileループはforループよりも単純である:

 
while (条件) 本体の文

本体の文は、複数の文で合成され、曲り括弧で括られている事が非常に多いが、 条件が偽となるまで実行される。 条件が最初から偽であれば、 本体の文は決して実行されない。

時に、本体の文を実行したければ、条件を最初に検証するに 設置すれば良い。この場合ではdo_while文を使おう:

 
do {
  本体の文_A;
  本体の文_B;
  ...等々...
} while (条件);


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.4.2 The for statement

for文はwhileループを"纏めた"書式である。この一般的なfor文は、 次のwhile文と全く同じ意味になる:

 
for (開始の文 ; 条件 ; 増分の文) 本体の文

開始の文
while (条件) {
  本体の文
  増分に関する文
}

forwhileよりも望ましい、ただ二つの理由は、最も重要な事として、 forではループの添字がどの様に初期化され、増分が幾らであるかと云う事が、 増分に関する文(step_statements)がループの末端に追い遣られるのではなく "頭"で示す事が可能な事、第二に、continue文(see section 1.2.4.3 Using break, continue, and goto)でループの直前 に分岐する事である。尚、そのループはwhileループの増分の文を含む 一方で、forループのそれを含まないものである。

Yorickのループ構文がCのものと一致させるには、Yorickのfor文に構文的な 不整合がある。開始の文増分に関する文が一つ以上の文で構成され ていれば、カンマ(セミコロンではない)で文を切り分ける(Cのカンマ演算子は Yorickの他の如何なる文脈でも利用出来ない)。二つのセミコロンで開始、条件、 増分の文節に分け、それらは常に存在していなければならないが、この三文節の 何れか、或いは全てが空行であっても良い。例えば、2変数ijを 増分する為に、ループを以下の様にしても良い:

 
for (i=1000, j=1 ; i>j ; i+=1000, j*=2);

この例題はまた本体の文を省略しても良い事を示してもいる:このループの 要点は単に最初のijを条件が満されない間に計算する事である。 この場合、後のセミコロンは必要である。何故なら、(そのループ本体が後に続く事 を仮定している為に)その他で行が継続されるからである。

+=*==演算子の特殊な書式である。上の例で、i+=1000j*=2ではi=i+1000j=j*2が各々同じ意味になる。任意の 二項演算子で、変数を増分する為に、この短縮型書式を用いても良い。++i--iの様に、ループの増分式で殊に便利である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.4.3 Using break, continue, and goto

break文で、それを含むループの外に飛び出す。continue文でループ 本体の末尾に飛び、そのループの次の試行を"継続する"。Yorickのプログラムで 非常に稀な深く入り込んだループでは、goto文を使う事でより一般的な場所 に飛ぶ事が出来る。例えば、一段、又は二重入れ子のループの両方の水準から、 どの様にしてbreak文を使うか、或いはcontinue文を使うかを以下に示す:

 
 for (i=1 ; i<=n ; ++i) {
   for (j=1 ; j<=m ; ++j) {
     if (次のjに直に飛ぶ) continue;
     if (次のiに直に飛ぶ) goto skip_i;
     if (内部ループの外に直に出る) break;
     if (両方のループの外に直に出る) goto done;
     色々な文_A;
   }
   色々な文_B; 
  skip_i:
 }
 done:
 色々な文_C;  

continueで、色々な文_Aの直後に飛び、break色々な文_Bの直前に飛ぶ。

BreakとContinue文はwhiledo whileループから同様に抜け出す為に 使っても良い。

whileがループ本体の前に条件を検証し、do whileがループ本体前で 条件を検証するので、ループ本体の真中で条件を検証する必要がある場合は何が使 えるのかと思うかもしれない。その答は、"do forever"構成、それに加えて breake文である(条件文の趣向返しである事に注意しよう):

 
for (;;) {
  テスト前の本体;
  if (!条件) break;
  テストの前の本体;
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.5 Variable scope

他の全てのものの利用前に函数本体で定義された擬態助変数と変数は、デフォルトで 局所変数である。その定義前に用いられた変数(或いは函数)は外部 変数となる(see section 1.2.2 Defining Procedures、see section 1.2.1 Defining a function)。全ての函数 外部で定義された変数(或いは函数)は正にそうなる。即ち、全ての函数に対して 外部変数となるものの、局所変数にはならない。

函数が呼出されると何時でも、Yorickは全ての局所変数の外部値を覚えており、 それらを局所値で置き換える。それ故、局所変数の全てが、それが呼出す任意の 函数の外部変数として潜在的に"可視的"である。値を戻す時に、函数は記憶して いる値で全ての局所変数を置き換える。函数、或いはそれが呼出す任意の函数 の何れもが、これらの記憶している値に影響を与える事は出来ない。つまり、 Yorickは如何なる意味でも局所変数の"非隠蔽(unmask)"を提供しない。

変数が局所、或いは外部スコープを持つかどうかを決定するデフォルトの規則は、 次の二つの場合で失敗する。第一のものは、その値を見ずに外部変数の再定義を 行なおうとした場合。第二のものは、幾つかの手続が助変数の値が戻った時に、 それらを設定する場合である。Yorickの構文解析にとって、その函数に対して 局所的であると貴方が意図していたとしても、その様な変数が定義される事無く 用いられている様になる。externlocal文はこれらの二つの問題を 夫々解決する。

1.2.5.1 extern statements  
1.2.5.2 local statements  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.5.1 extern statements

函数q_outの全ての変種で用いられている配列thetaの値を設定する 函数を記述したい場合には以下の様にする:

 
func q_out_domain(start, stop, n)
{
  extern theta;
  theta = span(start, stop, n);
}

extern文無しではthetaが局所変数となり、その外部値は q_out_domain文が値を返す時に元に戻される(だから、函数は無操作(no-op) となる)。extern文で、q_out_domainにはthetaの値設定の 意図的な副作用がある。新しいthetaは後続のq_outでの呼出しで 用いられる。

変数がexterm文に幾つもあっても良い:

 
extern var1, var2, var3, var4;


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2.5.2 local statements

saverestore函数は自己記述的(self-descriptive)バイナリファイル (PDBファイルと呼ばれる)にYorickの変数を元に戻したり再取得したりする。 バイナリファイル`demo.pdb'を生成するには、変数theta,E, mcをsave命令でそのファイルに保存し、それからファイルを閉じれば 良い;

 
f = createb("demo.pdb")
save, f, theta, E, m, c
close, f

このファイルを開いてtheta変数を読込む為には、以下の様にする:

 
restore, openb("demo.pdb"), theta, c

saveとの対称性の為に、restore函数は非通常的な属性を持つ。 それは助変数を(一番最初のものを除いて)再定義する事である。だから、 thetaはこのrestore文で再定義される。これは丁度、theta=文 で為されるものと同様である。Yorickの構文解析はこれを理解しない。これは、 貴方がこの様な函数を或る函数内部に配置する場合に注意しなければならない事を 意味する。

 
func q_out_file(infile, Q, outfile)
{
  if (!is_stream(infile)) infile = openb(infile);
  local theta;
  restore, infile, theta;
  return q_out(Q, outfile);
}

このq_outの変種で、infileから読込んだ変数thetathetaの外部値の代りに用いる。local宣言無しに、restorethetaの外部値を叩き出す。この方法で、q_out_fileq_outを 呼出す場合、thetaの外部値を覚えているものの、q_outinfile から復旧したthetaの値を"参照する"。q_out_fileが最終的に戻ると、 theta本来の値に置き換える。

変数がlocal文中に幾つも現われても良い:

 
local var1, var2, var3, var4;


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3 The Interpreted Environment

Yorickプログラムはキーボードで入力された完全な入力行のみを受け取る。Yorick への命令入力では、Yorickの一部ではない"命令行入力インターフェイス"、或いは "端末エミュレータ"を前提としている。私は貴方が良い端末模擬プログラムを 持っていると想定してYorickを設計した。

殊に、以前入力した行を呼出したり、編集が出来るのであれば、Yorickはより使い 易いものになる。つまり、音楽の場合の様に変奏を伴った繰返はプログラムの 要である。私個人のお勧めはGNU Emacsのshell-modeである。 (訳者註:yorick-mbではreadlineを用いている為、emacs風のキー操作で行編集が 行える)。 それ故、Yorickは端末エミュレータ自体の"見掛"に殆ど依存する。Yorickの個々 のプロンプトとエラーメッセージはこの節の後に記述しておく。

幾つかの重要なYorickのプログラムはテキストファイルに蓄えられ、 包含(include)ファイルと呼ぶ。後で命令がそれを読込む。包含ファイルを 生成したり、修正する場合には、貴方が好きなテキストエディタを使おう。再度、 GNU Emacsが私の好みである。ここで、C言語と同様にYorickの包含ファイルを記述 する場合はc-modeを使おう。`.c'や@file}.h}で終えなければならないCの ソースファイル名、更には、`.f'で終えなければならないFortranのソース ファイル名の様に、Yorickの包含ファイル名は`.i'で終えなければならない。

この節は、包含ファイルに関する追加の様式提案について始める。殊に、Yorickの help命令は、もし、包含ファイルが適切に書式に則っていれば、その包含 ファイル内部の文書註釈を見付ける事が可能である。全ての組込Yorick函数、例えば、 sin,write或いはplgは、その様な註釈を持っている。

1.3.1 Starting, stopping, and interrupting Yorick  
1.3.2 Include files  How to read Yorick statements from a file.
1.3.3 The help function  Using the help command.
1.3.4 The info function  Getting information about a variable.
1.3.5 Prompts  What Yorick prompts mean.
1.3.6 Shell commands, removing and renaming files  Issuing shell commands from within Yorick.
1.3.7 Error Messages  What to do when Yorick detects an error.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.1 Starting, stopping, and interrupting Yorick

貴方の端末エミュレータにてyorickと入力し、Yorickを起動する。実行すれば、 quit函数を使ってするっと抜けよう:

 
% yorick
 Yorick ready.  For help type 'help'.
> quit
%

Control-Cを入力すると何時でもYorickを中断する事が可能である。つまり、これは 直ちに実行時エラー(runtime error)となる(see section 1.3.7 Error Messages)。(これが動作する為 には、端末エミュレータとオペレーティングシステムがYorickにSIGINT信号を送れ なければならない。UNIXでは、この文字をstty命令のオプションのintr を使って設定出来る。ここで、Control-Cは通常の設定である。)


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2 Include files

Yorickをウインドウ内部やEmacs環境下で動かしている時、貴方が記述している 包含ファイル(include file)を含むウインドウ、加えて、Yorickを動かしている ウインドウをそのままにしておこう。この包含ファイル、ここでは`damped.i' と呼ぶ事にしよう、その最新の修正を検証したい場合、そのファイルを保存し、 それからYorickウインドウに移動して次の様に入力しよう:

 
#include "damped.i"

特殊文字#は、その読込操作がYorickへの他の全ての入力の様なYorick文では ない事を貴方に思い出させる。実際、#includeはYorickにキーボードから 引用されたファイルに入力系を切替える事を指図する。Yorickはそこで、 キーボードに入力した行であるかの様に、正確にファイルの各行を(勿論、 #include行も含めて)扱う。ファイルに行が無くなると、入力系は キーボードに戻される。

包含ファイルの虫取をしている間、それが正確に動作する迄、通常は幾度も読込ん だりするだろう。これは無害である。と言うのも、ファイルで定義された任意の 函数や変数は、新しい定義を入力した場合の様に、ファイルを読込んだ時点で 新しい定義に置換されるからである。

理想的には、包含ファイルに函数定義と変数初期化を含むべきである。この躾に 従えば、函数のライブラリとして各包含ファイルを看倣す事が出来る。ライブラリ を読込む為に#includeを一度入力すると、あたかもYorickの組込函数である かの様に、定義された函数が利用可能となる。Bessel函数、3次元補間等々の多様な ライブラリがYorickに附属している。

1.3.2.1 A sample include file  
1.3.2.2 Comments  
1.3.2.3 DOCUMENT comments  The help command recognizes special comments.
1.3.2.4 Where Yorick looks for include files  Directories Yorick searches for include files.
1.3.2.5 The `custom.i' file  How to execute Yorick statements at startup.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2.1 A sample include file

以下に`damped.i'を示す。これは減衰正弦波函数を定義するもので、我々が この章を通して設計してきたものである:

 
/* damped.i */

local damped;
/* DOCUMENT damped.i --- 減衰正弦波を計算し出力する
   SEE ALSO: damped_wave, q_out
 */

func damped_wave(phase, Q)
/* DOCUMENT damped_wave(phase, Q)
     この函数は、因子Qに対してPHASEで評価された減衰正弦波を返す。
     (高いQは少ない減衰を意味する)。PHASEは振動子の自然周波数の1周期2*pi
     PHASEとQは同じ大きさの配列でなければならない。
     SEE ALSO: q_out
 */
{
  nu = 0.5/Q;
  omega = sqrt(1.-nu*nu);
  return sin(omega*phase)*exp(-nu*phase);  /* always zero at phase==0 */
}

func q_out(Q, file)
/* DOCUMENT q_out, Q, file
         又は q_out(Q, file)
     FILEに因子Qの減衰正弦波を書込む。FILEはそのファイルを生成すべき
     ファイル名、或いは、以前生成したものやq_out操作で返却されたファイル
     対象の何れかであっても良い。q_outが函数として呼出されていれば、
     ファイル対象を返す。

     外部変数thetaは減衰正弦波が評価される相点(phase points)を決定する;
     q_outは二つのヘッダ行を書込み、それに二つの列が続き、その一行は
     theta配列の各成分である。最初の列はthetaであり;第二は
     damped_wave(theta,Q)である。   

     Qが配列であれば、二つのヘッダ行と二つの列がQの各成分向けに繰返される。

     SEE ALSO: damped_wave
*/
{
  if (structof(file)==string) file = create(file);
  n = numberof(Q);
  for (i=1 ; i<=n ; ++i) { /* loop on elements of Q */
    write, file, "Q = "+pr1(Q(i));
    write, file, "   theta       amplitude";
    write, file, theta, damped_wave(theta,Q(i));
  }
  return file;
}

ファイル中のYorick文を読む為に次を入力しよう:

 
#include "damped.i"

最初に気付く事に/* */で括られた文章の註釈がある。包含ファイル中の プログラムを保存しようとして問題が発生した場合、後で貴方を混乱させるか もしれない怪しい文の説明が何であるかを記録する程度に賢明であるべきだ。 良い註釈を書く事は、謂わばプログラミングでは最も難しい技能である。努めて 練習しよう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2.2 Comments

Yorickプログラムに註釈を挿入する二つの方法がある。それらはC風の/* */と C++風の//である:

 
// C++風の註釈は(行の任意の場所で)//から開始する。
//そして、行末端で終了する。

E = m*c^2;  /* C風はスュラッシュとアスタリスクで開始し、
               アスタリスクとスラッシュが、例え、
               幾つかの行の後であっても、それが現われるまでは
               終らない。 */         
/* C風の註釈は単一の行を追加する必要はない。
 * 貴方のプログラムが魅力的で読み易い様に、註釈の形を
 * 指定すべきである */

F = m*a;         // これは他のC++風の註釈だよ…
divE = 4*pi*rho; /* …そして、最後にC風の註釈 */

貴方がYorickの文の羅列を"註釈して行く"場合、私は強くC++風の註釈を勧める。 C風の註釈は適切に入れ子にならない。だから、貴方は註釈を含む行の羅列を註釈し 切る事は出来ない:

 
/*
E = m*c^2;   /* 誤 -- これで端の註釈を終える --> */
F = m*a
*/ <-- すると、これは構文上の錯誤の原因となる

C++風は正確の動作するだけではない。即ち、該当の行が註釈である事がより明確 になる。。

 
// E = m*c^2;   /* 何如なる種類の註釈でも、ここに書いて良い。 */
// F = m*a;

Yorickは特別な註釈を認識する。ここで、包含ファイルの最初の行を#!で 開始していれば、その行をYorickは無視する。これで、"叩きのめし(pound bang)" 表記を提供するUNIXシステム上で実行されるべきスクリプトをYorickが読込める:

 
#!/usr/local/bin/yorick -batch
/* もしこのファイルが実行可能であれば、UNIXはそれを実行する為に
 * Yorickを用いる。Yorick函数のget_argvは入力行引数を受け取る為に
 * 用いる事が可能である(helpのget_argvを参照の事)。第一行で、
 * -batchの代りに-iを使っても良い。より詳しくはprocess_argvとbatch
 * に関するhelpを読まれたい。*/
write, "piの平方根は",sqrt(pi);
quit;


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2.3 DOCUMENT comments

funcexternlocal文の直後に、11文字の/* DOCUMENT で開始する註釈を置いても良い。DOCUMENT註釈に対しては、その他の註釈程、 Yorick自体は何等の注意も払わないものの、helpと呼ばれる函数があって、 それが注目する。Yorickが(任意の函数の本体外部で)func,externlocalを見付けた際に、Yorickが実際に実行する事は、函数や変数が定義され ている個所の包含ファイル名と行番号を記録する事である。

後に、ある事項についてhelpで調べる際に、help函数はYorickにそのファイル が判っているかどうか、次に、その事項(函数や変数)が定義されている個所の行番号 を尋ねる。もしも、そうであれば、そのファイルを開いて、その行番号に行き、 DOCUMENT註釈を探す為に幾つかの行を調べる。それを見付けると、註釈全体を 表示する。

ファイルdamped.iは3個のDOCUMENT註釈を持っている。先ず、一つは dampedと呼ばれる仮想的な変数で、そのファイルを見る人は誰でも内部の 函数の名前を知らなくても見付ける事が可能な様になっている。それから、 damped_waveq_out函数向けのものである。

DOCUMENT註釈の大半の末端近くに、DOCUMENT註釈がある関連する函数 や変数を読者に伝えるSEE ALSO:欄を見付けるだろう。貴方がこれらを賢く 使えば、貴方のパッケージを使う為に必要な全ての文書に、誰か(往々にして、 後の自分)を導く事が可能になる。

このオンライン文書の古い技術的な書式は驚く程に効果的である。即ち、書くにも 管理するにも使うにも易い。より整った文書を目指して自動化された段階では、 mkdoc函数(Yorickライブラリの中にファイル`mkdoc.i'が含まれている) が一つ、或いはそれ以上の包含ファイルのDOCUMENT註釈の全てを収集、 アルファベット順にして目次を足し、それらを印刷し易いファイルに書込む。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2.4 Where Yorick looks for include files

#includeには直接、ファイルの完全な(ディレクトリを含む)経路名を指定 しても良い。より一般的に、貴方は相対経路名が使える。その場合、Yorickは ファイルを、四個のディレクトリにて次の順番で探す:

  1. 貴方が現在作業しているディレクトリ。
  2. `~/Yorick'。これは貴方のホームディレクトリ上の `Yorick'副ディレクトリである。
  3. `Y_SITE/include'。ここで、@fi;e{Y_SITE}はディレクトリで、そこに Yorickがインストールされている(helpでこれが何処であるかが判る)。
  4. `Y_SITE/contrib'

set_path命令を貴方のファイル`custom.i'の中でこの経路を変更する為 に使っても良いが、これを実行する場合、非常に慎重であるべきだ。

`~/Yorick'ディレクトリは、貴方が屡々使うYorickの包含ファイルを置く場所で、 その包含ファイルは貴方のサイトのincludeやcontribディレクトリに置いていない もの全てである。それらの場所の何れかに存在する包含ファイルと同名のファイルを `~/Yorick'ディレクトリに置けば、その包含ファイルが置換される。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2.5 The `custom.i' file

Yorickを起動する際、プロンプトを出す直前に`custom.i'を取込む。デフォルト の`custom.i'は`Y_SITE/include/custom.i'にある。(Yorickのhelp 命令を使えば、貴方の環境での`Y_SITE'ディレクトリの実名が判る。)

もし、貴方が`~/Yorick'ディレクトリを生成すれば、デフォルトのものを 置換する貴方自身のcustom.iがそこに置ける。常に、デフォルトのファイル を貴方のディレクトリに複製する事から始めよう。そうして、デフォルトの ファイルの末尾に貴方固有のものを追加しよう。一般的に、こう云った固有化は、 貴方が頻繁に使う函数ライブラリに対する#include命令、更に、グラフの 様式設定行う為のpldefaultの様な命令で構成されている。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.3 The help function

オンラインヘルプを得る為にhelp函数を使おう。Yorickは貴方の端末に対し、 対応するDOCUMENT註釈を鸚鵡返しにする:

 
> #include "damped.i"
> help, damped
  DOCUMENT damped.i --- 減衰正弦波を計算し出力する
  SEE ALSO: damped_wave, q_out
defined at:   LINE: 3  FILE: /home/icf/munro/damped.i
>

全てのYorick函数(helpも含む!)は、それが何を実行するのかを記述した DOCUMENT註釈を持っている。大半はhelpの項目に関連するSEE_ALSO: 参照があり、関連した項目群から指針が得られる。

Yorick函数について詳細を知りたい場合、何時でも最初に実行すべき事は helpがそれについて何を述べているかを参照する事である。 DOCUMENT註釈に加え、helpはその函数が定義されているファイル名と その行番号の全てを報告する事に注意しよう。だから、その註釈に貴方が知る必要 のあるものが何も無ければ、そのファイルに行って、その函数の定義をまるごと 読める。

デフォルトの項目であるが、help自身の説明は殊に興味深いものである。 それはYorickの専門家にとってさえもそうである。それから、Yorickのライブラリ 函数全てに対する包含ファイルが見付けられるディレクトリが判る。helpと 入力すると、正に、Yorickが起動した時点で表示されるものを示す。Yorick ディレクトリ中の`doc'ディレクトリに、このマニュアルのソースだけ ではなく、全てのDOCUMENT註釈のアルファベット順の一覧が含まれている。 `doc'ディレクトリにある@kbf{README}ファイルを読もう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.4 The info function

貴方が変数の型や次元を知りたければ、info函数を用いよう。物事の 意味するものを伝えるhelpと違い、infoは単に、その物が 何であるかを伝えるものである。

 
> info, theta
 array(double,200)
> info, E
 array(double)

ここで、doubleは "倍精度浮動点数(double precision floating point number)"を意味し、任意の 実数に対してデフォルトのデータ型である。デフォルトの整数データ型はlong と呼ばれる(これらの名称は共にCに由来し、それが正確な意味を与える)。

スカラー値Eは幾分紛らわしいが、"配列(array)"と呼ばれる。事実、スカラー は配列の特殊なもので、零次元の配列である。info函数は、同じデータ型の 変数を生成したり、その引数として構築するYorickの式を表示する為に設計されて いる。だから、式中のarray(double,200)は200成分の実数配列となり、 そして、array(double)は実スカラー(その値は常に零)となる。

非数値のもの(ファイル対象、函数等々)にinfoを用いると、print函数 と同じ結果が帰ってくる。数値配列が大きな場合は、infoprintの 前に試そう。@refii


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.5 Prompts

Yorickは時々、>以外のプロンプトを出す。通常の>プロンプトは、 Yorickが入力行待ちである事を示すものである。その他のプロンプトは通常とは 異なる状況にある事を警告するものである:

cont>
前の入力行が完全でない場合。つまり、Yorickは何かを実行する前に、その続きを 待っている。その行を継続したくなければ、幾つかの閉じ括弧やControl-Cを入力 しよう。

dbug>
Yorickプログラムの実行中にエラーが生じた場合、Yorickの "虫取モード(debug mode)"に入る。このモードで、貴方はエラーが発生した函数 "内部"に入る。Yorickの任意の文が入力可能であるが、dbexit函数で虫取 モードから確実に抜ける迄、Yorickは通常のプロンプトの代りにdbug>を 出している。 (see section 1.3.7.2 How to respond to a runtime error)

quot>
複数行に渡る長い文字列定数を続ける事が可能である。その様な文字列を入力して いれば、閉じ"を入力する迄、このプロンプトのままである。これを意図的 に実行しない様に。文字列結合演算子+を代りに用いて、長い文字列を一つの 行に収まる様に分割しよう。

comm>
幾つかの理由から、註釈を前に入力した行から開始していれば、Yorickは註釈を 終える為の*/を待っている。私には、端末で入力しているものに何故、 註釈を入れようとするのか、その理由が想像出来ない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.6 Shell commands, removing and renaming files

Yorickはsystem函数を持っており、これでオペレーティングシステムの 小道具を立ち上げる事が出来る。例えば、ls *.txtと入力すると、現在の 作業ディレクトリの.txtで終るファイルの一覧表示を行う。同様に、 pwdは貴方の作業ディレクトリ名を表示する:

 
> system, "pwd"
/home/icf/munro
> system, "ls *.txt"
   damped.txt      junk.txt

これはとても便利で、自動的にシステムコールを実行する特殊な脱出構文を 持っている。だから、systemと云った名前や引数全ての穴埋めを入力する 必要は無い。この規則は、もし、Yorick文の最初の文字が$(ドル記号) であれば、その行の残りが引用符で囲まれた文字列となってsystem函数に 渡される。だから、貴方は次の様に入力すれば良い:

 
> $pwd
/home/icf/munro
> $ls *.txt
   damped.txt      junk.txt

$の脱出行を積み重ねる為に;が使えない。ここでは、セミコロンは systemに引き渡される。明かに、この構文はYorickの文法の通常の規則 全てを破る。

UNIXシステムでは、system函数(これは同名前のANSI C標準ライブラリ函数を 呼出す)は通常、Bourne Shellの命令を実行する。もし、貴方が異ったシェルを使っ ていれば、ある結果に驚くかもしれない。もし、貴方が必要とするシェル命令で混乱 した場合、例えば、C-シェルcshであれば、命令を入力する前に、そのシェルの 複製を起動しよう:

 
> $csh
% ls *.txt
  damped.txt    junk.txt
% exit
>

この例で示す様に、貴方はsystem函数を使って会話的なプログラムを開始する 事が可能である。そのプログラムを抜ければYorickに戻る。

使えないシステム命令はディレクトリを変更するcd(或いはpushd、 又はpopd)である。Yorickの下で開始したシェルの作業ディレクトリは換られ るが、その変更によってYorick自身の作業ディレクトリには何らの影響も与えない。 その代りに、Yorick固有のcd命令を使おう。

 
> cd, "new/working/directory"
>

又、一時ファイルを操作するYorickのプログラムを記述するのであれば、ファイルの 名前の変更やファイルの削除にUNIX命令のmvrmを使ってはならない。 殊に、system命令を使う時は何時でも、オペレーティングシステムのある特定 の階級に貴方のプログラムが拘束される。その代りに、どの様なオペレーティング システムでも動作するYorickのrenameremove函数を用いよう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7 Error Messages

Yorickが文意を理解出来ない場合、構文上の誤謬となる。構文上の誤謬 の大半が単純な入力間違いだが、Yorickの様な機構的言語は厳密に指摘が行える:

 
> th= span(0,2*pi,200)
> for (i=1 ; i<=5 ; ++i) { r=cos(i*th); plg,r*sin(th),r*cos(th) }
SYNTAX: parse error near }
>

ここでの唯一の誤りは、複数の文を曲り括弧で閉じる前にYorickがセミコロン (或いは改行(newline))を必要とする事である。"硬直している"、この手の対応が 単純と思っているのであれば、私は構文解析を学ぶ事を貴方に勧める。全ての プログラム言語はこの機構(quirk)を持っている。

Yorickは構文の誤りを検出した時、エラーメッセージは常にSYNTAX:で開始 する。誤謬を含む区画全体が拒絶される:誤謬を含む文の実行に繋がる如何なる 文も実行されない。もし、誤謬が函数本体の中にあれば、その函数は定義されない。 しかしながら、構文上の誤謬が包含ファイルの読込で生じた場合、Yorickはその他の 構文の誤りを探しながら構文解析を継続する。単一のファイルで沢山の構文上の 誤謬が出るれば、Yorickは諦めて入力行待ちになる。それ故、そのファイルを 再度読込む前に、幾つかの構文上の誤謬を修正する事が出来るかもしれない。

全ての他の誤謬は実行時の誤謬である。

1.3.7.1 Runtime errors  
1.3.7.2 How to respond to a runtime error  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7.1 Runtime errors

Yorickでの実行時(Runtime)の誤謬は屡々、単純な入力誤謬や構文上の誤謬である:

 
> theta = span(0,2*pi,200)
> wave = sin(thta)*exp(-0.5*theta)
ERROR (*main*) expecting numeric argument
WARNING source code unavailable (try dbdis function)
now at pc= 1 (of 23), failed at pc= 5
 To enter debug mode, type <RETURN> now (then dbexit to get out)
(*訳者注*
誤謬 (*main*)数値引数を要求
警告 ソースコードが利用出来ない( dbdis函数を使おう )
現在(23行の)pc= 1、pc= 5で失敗
デバッグモードに入る為に、ここで<RETURN>を入力しよう(そして抜ける為にはdbexit))
> 

貴方がYorick変数の宣言を行わなければならない場合、この類の沢山の誤謬が構文 上の誤謬として検出されるかもしれない。非常に稀に実行される条件分岐に、 文法的にYorickが噛みつきかねない様な怪しい文がある場合、Yorickの変数宣言に 対するお気楽・極楽な性質が殊に混乱の源となる。その様な虫が貴方を待ち伏せて いる時は、哲人の様にあるべきだ。と云うのも、非常に精密に宣言された言語は、 より繊細で判り難い方法で貴方を待ち伏せているものだ。

他の実行時の誤謬は遥かに興味深いものである。即ち、その様な虫は屡々、 アルゴリズム、果ては物理学的問題に関しても、貴方に教示する事になるだろう。

 
> #include "damped.i"
> theta = span(0, 6*pi, 300)
> amplitude = damped_wave(theta, 0.25)
ERROR (damped_wave) math library exception handler called
  LINE: 19  FILE: /home/icf/munro/damped.i
 To enter debug mode, type <RETURN> now (then dbexit to get out)
(* 訳者注*
誤謬 (damped_wave)数学ライブラリ例外ハンドラが呼出された
  行: 19 ファイル: /home/icf/munro/damped.i
デバッグモードに入る為に、ここで<RETURN>を入力しよう(そして抜ける為にはdbexit))
>

1/2よりも小さなQを持った単振子とは何だろう? 恐らく、貴方は所謂過減衰 の場合について注意した事は無いだろう。ここで、貴方は本当はQが2.5であって 欲しく、0.25ではなかった。一方で、過減衰の場合が扱える様にdamped_wave 函数を修正する必要があるかもしれない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7.2 How to respond to a runtime error

Yorickが実行時の誤謬で止まる時、貴方には次の選択がある:貴方が実行したい 次の文を入力するか、或いは、虫取モードに入る為に、carriage return (即ち、空行)を入力する。その二つの可能性は次の様なものだろう:

 
ERROR (damped_wave) math library exception handler called
  LINE: 19  FILE: /home/icf/munro/damped.i
 To enter debug mode, type <RETURN> now (then dbexit to get out)
> amplitude = damped_wave(theta, 2.5)
>

 
ERROR (damped_wave) math library exception handler called
  LINE: 19  FILE: /home/icf/munro/damped.i
 To enter debug mode, type <RETURN> now (then dbexit to get out)
>
dbug>

第二の場合では、貴方は虫取モードに入っており、プロンプトdbugが現われ ている。虫取モードでは、Yorickは実行している函数とその全体の呼出の連鎖に手 を加えず、そのままにしている。任意のYorick文が入力可能である。通常、幾つか の値を表示したり、何が悪くしているのかを見定める為に幾つかの配列を表示した りするだろう。その函数にとっての局所変数を参照したり、修正する時に、それの 局所値を"見る"だろう:

 
dbug> nu; 1-nu*nu
2
-3
dbug>

可能な限り早く、dbexit函数を使って虫取モードから抜けるべきである:

 
dbug> dbexit
>

貴方は函数の局所変数を修正したり、実行を一時停止する事をやっても良い。 変数の値を変更する為には、単純に通常のYorick文でそれを再定義しよう。 dbcont函数は、完遂する事に失敗した文の再実行を行う事で実行を再開する。 他の虫取函数について学ぶ為には、help函数(see section 1.3.3 The help function)を用いよう。 ここで、dbexit函数のヘルプには、それら全てが記述されりいる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2. Using Array Syntax

大半のYorick文は代数学の書式に似ている。変数名はVar_1の様な文字列で、 大文字や小文字、最初の文字が十進数であってはならない事を除いて、十進数や 下線(_)の任意の組合せから成る。式は通常の算術演算子+,-,*,/を含み、 その演算子の順序を示す為(その順序が代数学での通常の順位規則と異なっていたり、 不明瞭な場合)に括弧を伴う。exp(x)cos(x)atan(x)の様な 初等的数学函数も全く同様である。

通常、Yorick変数は数学的函数の助変数表現となっている。変数は数値配列で、 それらは各点での函数の値である。ここで、函数を表現する点が少なければ、 粗く、正確な値を引出すには多く要る。函数の助変数は配列の添字であり、 それは稀にYorickのプログラムで明示的にする事がある。即ち、

 
theta = span(0.0, 2*pi, 100)

0.0で開始し、@end{2*pi}で終る100個の空行で分割された数値を含む変数 thetaを定義している。

ここで、thetaは100個の成分リストとして定義されており、thetaの 任意の函数は100個の成分のリスト、つまり、thetaの100個の特定の値での 函数値として確固たる表現を持つ。ここで、単位円の座標を表現する変数xyを次の様に定義しよう:

 
x = cos(theta);   y = sin(theta)

ここでのcossinはYorickの組込函数である。大半のYorick函数の様に、 それらは数値配列全体に作用し、同じ大きさの配列を返す。ここで、xyは100成分の数値リスト、即ち、thetaの100点の余弦と正弦である。

セミコロンがYorick文の末尾を示し、これで単一行に幾つかの文が置ける。行末 (更に、改行(newline))でもYorick文の末尾を示せる。然し、ある括弧が開いた ままであったり、二項演算子やコンマがその行の末尾にあったりすれば、その改行 (newline)が空行やタブの様に扱われて、Yorick文を終えない。

行末に逆スラッシュ(backslash)\があれば、それに続く改行は決してYorick の文を終えない。(即ち、逆スラッシュ\はYorickの継続文字となる)。ここで、 二項演算子で継続されるべき行を終えたり、行末で、サブルーチン引数を分ける コンマをそのままにしたり、或いは、行に渡る助変数式を分離したりする事で、 逆スラッシュを用いる様な事を私は決して勧めない。そもそも、自動的に継続 されるものだからである。

2.1 Creating Arrays  How to originate arrays.
2.2 Interpolating  Interpolation functions.
2.3 Indexing  How to reference array elements.
2.4 Sorting  How to sort an array.
2.5 Transposing  How to change the order of array dimensions.
2.6 Broadcasting and conformability  Making arrays conformable.
2.7 Dimension Lists  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 Creating Arrays

前節で紹介したspan函数を含めて配列を生成する、即ち、スカラー値から 配列を作る場合、五つの一般的な方法がある:

[val1, val2, val3, ...]
配列を作る最も原始的な方法は鍵括弧の中に配列成分を次々と竝べる事である。 配列の長さがリストの値の総数である。例外が[]で、これは"nil"と呼ばれる。 Yorick変数は、それが定義される前に値nilを持ち、[]はこの特殊な値を記述 する為の方法である。

array(value, dimlist)

次元が増えれば、配列に値を"仕込む"(prxref{Broadcasting})為にarrayを 使おう。dimlistは標準的なリスト引数で、幾つかのYorick函数で使われる ものである(see section 2.7 Dimension Lists)。屡々、擬似添字値域函数 (pseudo-index range function,see section 2.3.5 Creating a pseudo-index)はarray函数の明瞭な 代役になる。(*訳者註* この種の函数は、例えば配列aに対しては、添字の個所で、 a(fun)の様に使われる函数である。出力は函数によって異なるので、一概に言え ない。)

span(start, stop, number)
等間隔に区切られた値のリストを生成する為にはspanを使おう。

indgen(n)
indgen(lower:upper)
indgen(start:stop:step)
等分された整数値を生成する為にはspanの代りにindgen("添字生成器") を使おう。デフォルトでは1から開始する。

spanl(start, stop, number)
一定の比率で増加、或いは減少する数値リストを生成する為にはspan ("対数幅(span logarithmically)")を使おう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 Interpolating

私が述べてきた様に、Yorickの配列は一通りの離散点で連続函数の値を屡々表現する。 その函数値を他の点で見付ける為には、与えられた点間で(又はそれを越えて)、 どの様にそれが変化するかを知っている必要がある。一般的に、内挿(或いは外挿) する為には、その最初の場所で、函数がどの様に離散化されているかを詳細に 理解している事が必要である。とは言え、値のリストが正確に函数を表現する場合、 判っている点間の線形補間で十分であろう。隣接する点間で線形な函数は "区分線形(piecewise linear)"と呼ばれる。

interp函数は、離散点での関数値リストを任意の点で評価出来る区分線形函数 に変換する機能を持っている。

 
theta = span(0, pi, 100);
x_circle = cos(theta);
y_circle = sin(theta);
x = span(-2, 2, 64);
y = interp(y_circle, x_circle, x);

このプログラムの断章では、点列(x_circle,y_circle)で定義された区分線形 函数の値で、xと同じ点数(64個)の配列yを生成する。x_cirvleで 網羅される値域外では、区分線形函数は一定、即ち、最も単純で可能な外挿則と なる。

その三番目の引数の函数として看倣せば、interpsincos 函数であるかの様に振舞う。ここで、その最初の二つの引数はinterpが 評価する区分線形函数を指定する実際の助変数となる。

integ函数は、区分線形函数の積分を返す点を除けば、interpの様に 動作する。積分定数はintegが区分線形函数の最初の点で零を返す様に選ばれる (配列xが減少して行けば、この点で実際にxは最大値となる)。そうして、半円に 対する区分線形近似の積分と半円の正確な積分が以下の様にして計算可能である:

 
yi = integ(y_circle, x_circle, x);
yi_exact = 0.5*(acos(max(min(x,1),-1)) - x*sqrt(1-min(x^2,1)));

再び、区分線形函数は指定された最初と最後の点を越えれば定数であると仮定して いる。それ故、integは外挿(extrapolating)している個所は線形函数となり、 内挿(interpolating)している個所には区分放物線になる。

区分線形函数の不定積分が必要な場合に限ってintegを使おう。Yorickには 定積分を計算する為により効果的な手段がある。再度、interpの様に第三の 引数に対し、一定値となる函数としてintegの事を考えよう。ここで、 最初の二つの引数は函数を指定する助変数である。

interpintegの何れも、その第二引数が増加か減少の何れかで無けれ ば意味を成さない。多値函数のどの分枝が返されるべきかを決定する方法は無い。

内部的に、interpintegには、検出函数(lookup function)、即ち、 各xの値を越えるx_circleの点の添字を探す函数が必要である。この検出函数を 直接呼出す事が可能である。その名前はdigitizeである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 Indexing

Yorickには個々の配列成分、或いは配列成分の部分集合を参照する異なった方法が 混乱する程沢山ある。その言語を修得する為には、貴方はそれらについて全てを学ぶ 必要がある。このマニュアルの、後で述べるほぼ全ての例題で、一つ、或いはそれ 以上のこれらの添字技法を用いる。だから、それらをどの様に使えば良いのかを 後で貴方に示すので、私を信頼して欲しい:

2.3.1 Scalar indices and array order  
2.3.2 Selecting a range of indices  
2.3.3 Nil index refers to an entire dimension  
2.3.4 Selecting an arbitrary list of indices  
2.3.5 Creating a pseudo-index  
2.3.6 Numbering a dimension from its last element  
2.3.7 Using a rubber index  
2.3.8 Marking an index for matrix multiplication  
2.3.9 Rank reducing (statistical) range functions  
2.3.10 Rank preserving (finite difference) range functions  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.1 Scalar indices and array order

対象配列はメモリの連続した位置に蓄えられる(ここで各配置は、その対象の内で 一つを蓄えるに十分な大きさである)。例えば、3数値の配列xはメモリでは 3個の連続した区画に[x(1),x(2),x(3)]の順で蓄えられている。3×2配列 yは各々が3個の数値の配列が二つあると云う以上の意味はない。 3×2配列yは各3成分が二つの配列と云う事以上の意味は無い。それ故、 この6成分は、各々3点が入った二つの連続した区画、即ち、 [[y(1,1), y(2,1), y(3,1)],[y(1,2), y(2,2), y(3,2)]]に蓄えられている。

多次元配列はその次元数よりも少ない添字で参照しても良い。ここで、前の例題で、 y(5)y(2,2)と同じ意味である。と云うのも、後者の成分(y(2,2))は yの5番目に蓄えられているからである。

Yorickの構文の殆どがCに従っているにも関わらず、配列添字はFORTRAN配列添字方式 に似せて設計している。YorickではFORTRANの様に配列の最初(左端)の次元は常に メモリ内で最も速く変化する添字である。更に、任意の次元で最初の成分は添字1 となり、だから、長さ3の次元の場合は、添字1(その最初の成分)、添字2(第二成分)、 或いは添字3(第三成分)で参照可能となる。

この不整合にとまどうのであれば、これがYorickの添字付けがFORTRAN風となって いる所以である。即ち、Cでは、例えば、三成分配列は各三成分のデータ型と同じ 土台上のデータ型となる。この技巧で、Cは多次元配列の発行を回避する。ここで、 これらはある配列データ型対象の単配列となっている。この図説は正確に多次元配列 をメモリに蓄える方法を反映しているものの、科学計算プログラムで用いられる 多次元配列の方法を反映するものではない。

その様なプログラムでは、配列は一つ、或いは、他の最も速く変化する添字を持って 蓄えられると云う事実は的を外している。 ここで、貴方は最初の次元を定数にして、 同様に第二の次元で、その切り出した個所を"データ型"として考えたくなるだろう。 更に、全ての次元の長さは、その対応する物理学的な趣向で解析精度を変更するのに 従い、変化する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.2 Selecting a range of indices

幾つかの連続した配列成分を添字値域で参照する事が可能である。例えば、 x(3:6)は四成分の部分配列[x(3), x(4), x(5), x(6)]を意味する。

往々にして、配列の飛び飛びの部分集合を参照したい事がある。この場合、第二の コロンに添字値域の増分を加えれば良い。例えば、x(3:7:2)は三成分の部分 配列[x(3), x(5), x(7)]を意味する。

負の増分は成分の順序を逆にする。即ち、x(7:3:-2)は同じ三成分を表現 するものの、[x(7), x(5), x(3)]と逆順序である。添字の値域に指定して いる第二成分は、結果となる部分集合では実際に表現されていないかもしれない。 例えば、x(7:2:-2)x(7:3:-2)と同じでもので、x(3:6:2)は 二成分の部分配列[x(3), x(5)]を表現する。(訳者註:x(7:2:-2)の 場合、添字値域は[7,5,3]となるので、第二成分の2は含まれない。この様に、 a:b:cで値域を指定する場合、生成される添字はaから開始し、増分がcのa以上、 且つ、b以下となる添字で、bがその配列に含まれるかどうかは、bが或る正整数n に対して、a+n*cの形で表現されるかどうかで決まる。因に、MATLAB系の諸言語 でも、この事は同様である。)

増分が省略されていれば、増分はデフォルトの1と同じで、添字値域の開始と終了 成分もまたデフォルト値を持っており、最初と最後は可能な値である。ここで、 xを10成分の1次元配列とすれば、x(8:)x(8:10)と同じである。 負増分を使うとデフォルトで逆にされ、x(:8:-1)x(10:8:-1)と同じ 意味になる。

添字値域のデフォルトの規則で、便利で特別な場合として、x(::-1)は配列 xを逆順序で表現する。(訳者註: これらの性質はYorick特有のものである。 MATLAB系の言語ではこの様な仕様は無い。)

些細な事に注意しよう。ここで、 x(3:3)x(3)と同じものではない。 たとえ、スカラー添字が単一の値を表現するとしても、添字値域は常に配列値を 表現する。だから、x(3:3)は単一成分の配列、[x(3)]である。 (訳者註:Matlab系の言語では、上述の表現は区別しない。)


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3 Nil index refers to an entire dimension

多次元配列に添字を付ける場合、一つ、或いは複数の次元を"お客(spectator)" にしておきたいと屡々望む事がある。Yorickでは、対応する添字を空白のままに する事で対処する;

 
x(3,)
x(,5:7)
y(,::-1,)
x(,)

これらの例では、xは2次元配列で、yが3次元配列である。 最初の例のx(3,)では、xの最初の添字が3の全ての1次元配列を 表現する。第二の例では、第二の添字が5、6又は7となる成分全てを表現する。 第三のy(,::-1,)はその中間の添字に従った逆順の配列yである。 第四の式、x(,)は2次元配列x全体を変更しない事を意味する。

2.3.4 Selecting an arbitrary list of indices

添字リストは添字値の配列である。配列の任意の部分集合を指定する為に、添字 リストを用いる:x[5,1,2,1])は四成分の配列[x(5),x(1),x(2),x(1)]を 意味する。where函数は添字リストを返す:

 
list= where(x > 3.5)
y= x(list)

これらの行により、配列xの部分集合で、3.5よりも大きな成分を含む配列 yを定義する。(訳者註:このwhereはMatlabのfind函数に相当。)

添字値域の結果の様に、添字リストによる結果はそれ自体が配列である。 しかしながら、添字リストはより一般的な規則に従う。即ち、結果の次元は配列 リストの次元と同じである。それ故、x([[5, 1], [2, 1]])は二次元配列 [[x(5), x(1)], [x(2), x(1)]]を返す。

一般的な添字リストに関する規則は:

 
添字リストの次元からの次元;添字付けられた配列からの値。

スカラー添字値はこの規則に従う添字リストの特殊な場合である。

その規則は多次元配列に同様に作用する。例えば、xが5×9配列であれば、 x(,[[5, 1], [2, 1]])は5×2×2配列となる。そして、 x([[5, 1], [2, 1]], 3:6)は2×2×4配列となる。

2.3.5 Creating a pseudo-index

Yorickでは二つの数値配列間の二項演算から、結果として配列が生成される。 つまり、その演算は対応する被演算子の各成分の対で一度に実行される。ここで、 rhovolを各々4×3配列とすると、式rho*volrho(1,1)*vol(1,1)から開始する積の4×3配列となる。

この配列被演算子に対する二項演算式の拡張が常に適切なものとは限らない。 同じ大きさの配列の対応する成分での操作の代りに、全ての成分の対で演算を 実行しても良い。その最も一般的な例題は二つのベクトルxy の外積である:

 
outer= x*y(-,);

ここで、xが四成分のベクトルで、yが三成分のベクトルであると すれば、outerは四×三配列 [[x(1)*y(1), x(2)*y(1), x(3)*y(1), x(4)*y(1)], [x(1)*y(2), x(2)*y(2), x(3)*y(2), x(4)*y(2)], [x(1)*y(3), x(2)*y(3), x(3)*y(3), x(4)*y(3)]]となる。

Yorickでは、この積の形は依然可換である。即ち、x*y(-,)y(-,)*x と同じである。配列outerの三×四転置行列を生成する為には、x(-,)*y と書かなければならない。

私は-符号を呼出すが、添字として用いる時、ここでは添字付けられる配列で 実際に無い結果の配列に追加の次元を挿入するので、擬似添字となる。すると、 式y(-,)は(三成分ベクトルyとして同じ3個の値を持つ)1×3配列となる。 添字付けている配列の実際の次元に対し、添字のリストの中のお望みの個所に、 沢山の擬似添字を好きなだけ挿入しても良い。例えば、outer(-,-,,-,)は 1×1×4×1×3次元配列となる。

デフォルトで擬似添字は長さ1の次元を結果として生成する。しかし、-符号 に添字値域をコロンで分けて付加すると、使い勝手の良い任意の長さの新しい次元が 生成出来る。

その上、-符号に添字値域をコロンで分けて加えれば、任意の適切な長さで、 新しい次元を生成する事が可能である。

 
x = span(-10, 10, 100)(,-:1:50);
y = span(-5, 5, 50)(-:1:100,);
gauss2d = exp(-0.5*(x^2+y^2))/(2.0*pi);

xy-平面内の点の100×50長方形方眼上での正規化2-Dガウス函数を計算している。 擬似添字(,-:1:50)は50成分あり、(-:1:100)は100成分ある。 非単位長の擬似添字であれば、その次元の値は単純に複製されたものとなる。 それ故、span(-10,10,100)(,-:1:50)は100×50配列で、50個の span(-10,10,100)の複製を含む事になる。

結果のgauss2dのみが必要であれば、一つのデフォルトの擬似添字を入れれば 十分である:@refil

 
gauss2d = exp(-0.5*( span(-10,10,100)^2 +
                     span(-5,5,50)(-,)^2 )) / (2.0*pi);

しかし、長方形方眼点(x,y)は、 例えば、描写ルーチンの入力として 屡々要求される。

2.3.6 Numbering a dimension from its last element

配列添字値は幾分非対称である。つまり、1の添字は先頭の成分を表現し、2は 第二成分を、3は第三成分を表現等々となる。末尾や末尾から二番目、或いは末尾の 成分から相対的な位置の成分を参照する為には、その次元の長さを見つけ出す必要が ある。

この非対称性に対する処方として、Yorickは1よりも小さな数を配列の末尾の成分 からの相対位置として解釈する。ここで、x(1)x(2)xの先頭 と第二の成分で、x(0)x(-1)は末尾と末尾から二番目等々となる。

この負添字表記の御陰で、多くのYorickプログラムを次元の長さを決定する必要 無しに記述する事が可能である:

 
deriv = (f(3:0)-f(1:-2)) / (x(3:0)-x(1:-2));

上の式では、点xで既知の値で、函数fの差分の点中心評価 (point-centerd-estimate)を計算する(この差分を計算するより良い方法は、 以下に記述されているpcendif値域函数を用いる事である。 See section Rank preserving (finite difference) range functions.)

この例題では、配列長を計算する為に要求される余計な手間が一寸ある:

 
vn = numberof(f);
deriv = (f(3:n)-f(1:n-2)) / (x(3:n)-x(1:n-2));

この様に、負添字表記を用いれば、より速いプログラムが生成され、その上、自明 な方法で多次元の場合に対しても一般化される。

負添字表記はスカラー添字値、そして、(その例題の様に)添字値域の開始、終了欄で 使える。添字リストで負添字を扱えば、プログラムの速度を著しく低下させるので、 添字リストの値は零や負であってはならない。

2.3.7 Using a rubber index

沢山のYorickの函数が、次元の判らない配列上で動作しなければならない。 フィルター反応函数をスペクトル(陽子エネルギー函数としての輝度)を入力するのに 従って、受け取るものとして考えれば、その検出器(detector)の反応を返す。 その様な函数はスペクトルを通し、スカラー値を返す。或いは、各光線のリストの 各々に対応するスペクトルの二次元配列が渡され、反応に対応するリストが返される 事を期待しても良い。或いは、二次元画像の各画素でのスペクトルの三次元配列が、 反応値の値の二次元配列として返される。

その様な函数を書く為には、"それから、この配列は他に添字を持っているかも しれない"と述べる方法が必要である。Yorickの引き延し添字..は添字付け られている零、或いは、それ以上の配列の実際の添字上で成り立つ。引き延し添字を 先に置く任意の添字は"left justified"であり、任意のそれに続くものは "right justified"である。この構文を用いると、貴方は簡単に配列に添字付けた りする事が、貴方の興味のある次元が常に先頭が、最後であるかさえ判っていれば 可能になる。たとえ、一つの貴方のルーチンプロセスに加えて、どれだけの数の お客の次元が存在しているかを知らなかったとしても。

だから、そのスペクトル次元が常に入力brightness配列の最終次元である 限り、

 
brightness(..,i)

は、spectral次元の常にi添字に置かれ、brightnessそれ自体は 1-D、2-D、或いは3-D配列の何れかである。

同様に、x(i,..)は、xの最初の添字の値を、後に続く全ての次元を そのままにして選択する。x(i,j,..,k,l)の様な構成もまた遵法で、稀に 必要である。

引き延し添字の第二書式は零や他の次元を一つの添字に潰す事である。潰された次元 の長さは、それが置き換える全ての次元の長さの積となる(もし、それが零次元 を置き換えるのであれば)。この型の引き延し添字の記号はアスタリスク*で ある。例えば、もし、xが2×3×4×2配列であれば、x(*)は120成分の 1次元配列となり、x(,*,)は5×12×2配列となる。

添字付けられた配列で、その最後の実際の添字がnilで、更に、この添字が配列の 最後の実際の次元に対応しないのであれば、Yorickは..引き延し添字を 添字リストの末尾に追加する。ここで、以前の例のx()x(,..)と 同値であり、それはx(..)に同値で、単にxにも同値である。この規則 は単に安定して添字付けられているYorickの配列では単なるはぐれ者であり、 そこで私は意図的に言語的な純粋さの観点で、それを取り除く事を余儀なくされて いる。

貴方が"それから、存在しているかもしれない何か他の次元"を意味する時、引き 延し添字..を用いるが、nil添字ではない。貴方が、"そして、(私が存在して いる事が判っている)単一の残りの次元"を意味する場合のみ、牽引nil添字を 使おう。

2.3.8 Marking an index for matrix multiplication

Yorickは行列の積、より一般的に、内積に関して特別な構文を持っている:
 
A(,+)*B(+,)
B(+,)*A(,+)
x(+)*y(+)
P(,+,,)*Q(,,+)

最初の例題では、AはL×M配列、BはM×N配列であり、その結果はL×Nの 行列積となる。第二の例では、その結果は第一の結果のN×L転置となる。一般的な 規則は、その結果で、左被演算子の全ての"お客(spectator)"次元が、 その結果の右被演算子のお客の次元の前になると云う事である。

第三の例では、同じ長さの二つのベクトルxyの内積をどの様に形成 するかを示している。第四の例では、どの様にして、3-D配列Qの第三の次元 を持った4-D配列Pの第二の次元を潰すかを示している。Pを2×3×4×5、 Qを6×7×3であれば、その結果の配列は2×4×5×6×7となる。

他の特別な添字記号(nil,_,..*等々)全てと違い、+符号 は実際にYorickの構文解析で特別に扱われる。+添字は、添字されている配列 (或いは式)が二項演算*の左、或いは右被演算子で無い限り、構文解析上の 誤謬となる。この二項演算*はYorickの通常の成分毎の積の代りに行列積として 構文解析される。どちらかの被演算子が+で刻印された次元を持っている場合 でも、構文解析の誤謬がその結果となる。両方の被演算子は正確に一つの刻印された 次元を持たねばならず、その刻印された次元は実行時には同じ長さでなければなら ない。

2.3.9 Rank reducing (statistical) range functions

Yorickの行列積構文の美しさは、対応する添字に+印を置く事で、縮めるべき 次元を貴方が"指定"する事にある。この節と次節で、私はYorickの値域函数を紹介 する。これは行列積で"この次元はここで正しい"構文を持つものである。 この節での項目は統計的値域函数である。これらの函数は配列の階数を、それらが 単スカラー添字であるかの様に減らす。しかし、その次元に沿った特定の成分を 選択する代りに、統計的値域函数は選択された次元に沿って全成分の検証に基いた 値を選択する。統計的函数は任意のお客の次元の各値に対して個別に繰返される。 利用可能な函数は:

min
max
は最小(最大)値を返す。これらは通常の函数としても使える。

sum
は全ての値の和を返す。これも通常の函数として使える。

avg
は全ての値の算術的平均値を返す。結果は、その入力が整数であったとしても、 実数となる。これもまた通常の函数として利用可能である。

ptp
は頂点から頂点の差(最大値と最小値間の差)を返す。結果は、もし、最小値 よりも最大値の添字が大きければ正となり、それ以外なら結果は負になる。

rms
は値の算術的平均値からのroot mean square deviationを返す。結果はたとえ 入力が整数配列であったとしても実数になる。

mnx
mxx
は最小(最大)値を取る成分の添字を返す。結果は整数添字値となり、その添字付け られている配列のデータ型から独立している。もし、一つ以上の成分が極値に達した 場合、結果はその最小の添字となる。

@kbd{min、maxsumavg函数は通常の函数構文で適用しても 良い。もし、貴方が、単スカラの結果を得る為、函数を配列の次元全てに亘って 適用したければ、そうする事が望ましい。

与えられたbrightness配列は、検出器或いは検出器の集合に対するスペクトル を表現するもので、最も明いincident lightに於ける陽子エネルギーを見付ける為に mxx函数を用いても良い。brightnessの最後の次元が常にスペクトル次元 であり、陽子エネルギーの1-D配列gav(brightnessの最後の次元と同じ 長さである)も与えられたものと仮定する;

 
max_index_list = brightness(.., mxx);
gav_at_max = gav(max_index_list);

gav_at_maxは、もし、brightnessが単検出器の1-Dスペクトルであれば スカラで、もし、brightnessが画像の各点での3-Dスペクトル配列であれば、 2-D配列、等々となる。

任意の添字値域(開始:終了或いは開始:終了:刻幅)を任意の値域函数に 指定しても良い、他のコロンにより、その値域から関数名を分離する事、例えば、 1.0よりも大きな陽子エネルギーに関するbrightnessの相対極大値のみを 分離する為に、小さなエネルギーでの可能な大きな値を無視する事で次が使える:

 
i = min(where(gav > 1.0));
max_index_list = brightness(.., mxx:i:0);
gav_at_max = gav(max_index_list);

この例の第一行での通常の函数として呼出されたminの利用に注意しよう。 (whereは条件が真(true)となる添字リストを返す事を思い出そう)。 第二行のmxx:i:0mxx:i:と同値である。Yorickの現在の実装の細々と した事で、前者の実行の方が僅かに速い。

一つ以上の値域函数が添字リストに現われるかもしれない。もしそうであれば、 それらは左側から右側へと順番に計算される。別の順序でそれらを実行する為には、 最初の適用から明示的にその結果に添字付けをしなければならない:

 
x = [[1, 3, 2], [8, 0, 9]];
max_min = x(max, min);
min_max = x(, min)(max);

max_minの値は3となるが、min_maxの値は2になる。

 
(* 訳者註 *
> x
[[1,3,2],[8,0,9]]
> x(max,min)
3
> x(max,)
[3,9]
> x(max,)(min)
3
> x(,min)(max)
2
> x(,min)
[1,0,2]
)

2.3.10 Rank preserving (finite difference) range functions

Yorickの配列は殆ど不可変に関数値を表現する為に、Yorickは微分や積分の共通 する演算に対する数値的な同値性を与える。

直接的な方法で幾つかの変数函数を持たせる為に、それらの演算子は値域函数 として実装されている。スカラー値を返す統計的値域函数とは違い、有限差分 値域函数(finite difference range function)は添字付けられた配列 (subscripted array)の階数を減じない。その代りに、単添字値域開始:終了 が階数を保つのと同じ方法で、それらは階数を保つ。利用可能な有限差分函数は:

cum
はcumulative和を返す(最も小さな添字での全ての値の和で、結果の最初の添字は 値0を持っている)。その結果の次元は添字付けられた配列の次元よりも長さが1程 大きい。

psum
は部分和(等しいか最も小さな添字での全ての値の和)を各成分に対して返す。 結果の次元は添字付けられた配列と同じ長さである。これはcumと、結果で 頭の値0のものが省略される事を除いて同じものである。

dif
は後続の成分の対毎の差を返し、その関数値が次元に沿って増加する場合は 正で、それらが減少する場合は負になる。その結果の次元は添字付けられた 配列の次元よりも一つ少ない。dif函数はcum函数の逆である。

zcen
は後続の成分の対毎の平均値を返す。その結果の次元は添字付けられた配列 の次元よりも一つ少ない。名前は"zero center"を略したものである。

pcen
は後続の成分の対毎の平均値を返す。だが、その二つの終点は、結果の次元が 添字付けられた配列の次元よりも一つ大きくなる様に、何も変えずに複写される。 その名前は"point center"を短縮したものである。

uncp
pcen操作の逆を返す(Gibberishはこの函数をpcen操作で生成 されていない配列次元に対して適用した結果である)。結果の次元は,その添字 付けられた配列の次元よりも一つ小さくなる。その名前は "uncenter point centered"を短かくしたものである。

同じ長さの1-D配列yxで表現された函数y(x)の 差分dy/dxは次の様になる:

 
deriv = y(dif)/x(dif);

derivはpkbd{yやxの何れよりも一つ元が少ない事に注意しよう。 その差分はy(x)から、与えられた(x,y)を通過する区間線形函数である かの様に計算される。尚、線分は点数よりも一つ少ない。

derivの値を"zone-centered"と呼ぶ事が出来るのであれば、xyの値は"point-centered"と呼べる。

zcenpcen函数はpoint-centeredやzone-centeredの物の間を 行き来する為の簡単な機構を提供する。通常、point-centerとzone centered data 等への幾つかの合理的な方法がある。例えば:

 
deriv_pc1 = deriv(pcen);
deriv_pc2 = y(dif)(pcen)/x(dif)(pcen);
deriv_pc3 = y(pcen)(dif)/x(pcen)(dif);

よくresolvedな函数に対して、これらの3個の配列の間の差異は無視可能なものになる。 つまり、その差はx(dif)の二次項になる、それは最初の段階での生成された xyの計算での誤差の次数である。

もし、xyがより正確にy(x)を表現すれば、貴方はより良い 単純な区分線形モデルよりもy(x)の型のモデルを知らなければならず、 更に、貴方はderiv_pcl,deriv_pc2deriv_pc3、或いは 幾つかの他の式を選択する為に、そのモデルを使うべきである。

不定積分は台形則を用いて評価しても良い:

 
indef_integ = (y(zcen)*x(dif))(psum);

再度、indef_integxyよりも一つ点が少ない。何故なら、 点よりも台形が一つ少ないからである。この時、intef_integは領域中心化 (zone centered)ではない。その代りに、indef_integは上限x(2:) (或いは下限x(:-1))で値を表現する。

屡々、x(1)から各x(i)迄の定積分の点を中心に置いた配列として 貴方はy(x)の積分を考えたくなる。この場合(これは実際に屡々生じる事 である)、xyと同数の点でdef_integsの結果を生成する為に、 cum函数をpsumの代りに用いる、

 
def_integs = (y(zcen)*x(dif))(cum);

定積分単体に対しては、行列積構文がdif値域函数を使った結合で用いられる。 例えば、貴方がフィルターのtransmission fraction ffの事が、幾つかの陽子 エネルギーefで判っていたとしよう。つまり、ffefは同じ長さ の1-D配列で、その与えられた点に対応する区分線形函数としてフィルタ fransmission函数を指定する。

配列brightnessの最後の次元はincident spectrumを表現する(任意の他の 次元が異った光線(ray)、imaging detectorの画素毎に一つを表現する)。1-D配列 gbは群境界エネルギーを表現する。つまり、brightnessで表現された spectral群の境界での陽子エネルギーである。次のYorick文で検出器反応を計算す:

 
filter = integ(ff, ef, gb)(dif);
response = brightness(..,+)*filter(+);

この適用に対し、その正しい補間ルーチンはintegである。その積分された transmission函数は、その群の境界gbで評価される。ここで、各群に対する 効果的なtransmission fractionは上bin境界と下bin境界での積分の差である。 dif値域函数はこれらの区分での差分を計算する。gb配列が自然に brightnessの最終次元よりも一つ以上の成分を持ち(群よりも一つ以上の 群境界エネルギーがある)、difが一つ次元を縮小するので、filter 配列はbrightnessの最終次元と全く同じ長さを持つ。

cum函数はff(ef)を積分する為に使う事が出来ない事に注意しよう。 何故なら、そこで積分が評価されなければならないgbは、そこでの積分が 判っているefと同数の点ではない。積分が必要とされる点が、そこでの積分 が判っているものと同じ(或いは部分)点である場合は何時でも、より一般的な integ補間器の代りに、zcen,difと@knd{cum}添字函数を用いて 積分を実行すべきである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 Sorting

函数sortは添字リストを返す:

 
list = sort(x);

そのリストは入力ベクトルxと同じ長さを持ち、list(1)はxの最小 の成分の添字で、list(2)は次に最も小さいもの等々となる。つまり、x(list)xを昇順で並べ変えたものになる。

並び換えられた配列の代りに、添字リストを返す事で、sirtは他の配列の 共同並び換えを単純化する。例えば、一連の実験を考えよう。各実験で、 thermonuclearは計測された入力を燃料質量と同様に生成、laserする。これらは 合理的にベクトルyield,inputmass蓄えられ、各々は実験回数 と同数の成分の1-D配列である。それらの配列での成分の順序は試行された実験での 自然な順序になり、yield(e),input(3)mass(3)が第三番目の 実験を表現する様になっている。実験は次の様にgainが増加する様に並び換えられる:

 
list = sort(yield/input);
yield = yield(list);
input = input(list);
mass = mass(list);

リストの裏返し、これがその本来の順序に返すものだが、それは次の様にする:

 
invlist = list;  /* array(0, dimsof(list))よりも速い */
invlist(list) = indgen(numberof(list));

sort函数は実際に多次元配列の一つの添字に沿ってだけ並び換えを行う。 戻されるリストの次元は入力配列の次元と同じである。ここで、その値は配列全体 の頭に対応する添字であって、並び換えられた次元に対応する添字ではない。 つまり、x(sort(x))はその最初の次元に沿って成分が昇順になる様に並び 換えられた配列xである。他の次元で並び換える為には、sortに 第二引数に渡そう。例えば、@kbq{x(sort(x,2))}で第二の次元に沿って昇順で並び 換えたxとなり、x(sort(x,3))で第三の次元等々となる。@refll

関連する函数はmedianである。これは一つ或いは二つの引数を、丁度、 sortの様に取るが、その結果は、勿論、並び換えられた次元に沿った median値であり、その入力よりも少ない次元になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 Transposing

注意深く設計されたYorickのプログラムでは、配列次元は通常、それらを必要とする 個所を捩り挙げている。しかし、時には、貴方が望む7×5配列の代りに、5×7配列に 捩り挙げるかもしれない。Yorickは非常に一般的なtranspose函数を持っている:

 
x623451 = transpose(x123456);
x561234 = transpose(x123456, 3);
x345612 = transpose(x123456, 5);
x153426 = transpose(x123456, [2,5]);
x145326 = transpose(x123456, [2,5,3,4]);
x653124 = transpose(x123456, [2,5], [1,4,6]);

ここで、x123456は6次元配列を表現している(これらが稀である事を希望する)。 その最初と最後が同じ転置された配列をx623451と呼ぶ。これは transposeのデフォルトの結果である。transpose函数は、その第一引数 の添字の任意の置換を行う為、任意個の追加引数を取る事が可能である。

第二と第三行でのスカラ整数値は全ての次元の巡回転置を表現する。ここで、入力 の第一の次元は、引数値Nに関する結果のN番目の次元となる。

整数値配列は特定の次元の巡回置換を表現する。ここで、第五番目の例題で、 [2,5,3,4]は二番目の次元が五番目となり、第五が第三となり、第三が 第四となり、そして第四が第二の次元になる事を意味する。任意の置換は、 六番目の例で示す様に、巡回置換の組で構成されている。

一つの追加の問題がYorickで生じる。貴方は転置されるべき配列の次元が幾つである か判らないかもしれない。これを上手く扱う為に、スカラー引数、又は任意個数の 巡回置換のリストは、その最後の次元から数えて零、或いは負であっても良い。 つまり、0は最後の次元を表現し、-1は次に最後を表現し、-2でもう一つ前を等々 となる。

典型的な転置操作は:(1)最初の次元を最後に移動し、全ての他のものを巡回的 後に動かす。(2)最後の次元を最初に移動し、その他のものを前方に動かす。 (3)最初の二次元を転置し、他のものをそのままにしておく。(4)最後の二つ の次元を転置し、その他のものはそのままにしておく。次の4行が順番に実行される

 
x234561 = transpose(x123456, 0);
x612345 = transpose(x123456, 2);
x213456 = transpose(x123456, [1,2]);
x123465 = transpose(x123456, [0,-1]);


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 Broadcasting and conformability

二つの配列は、意味のある二項演算を行う為に同一型である必要は無い:

 
y = a*x^3 + b*x^2 + c*x + d;

この割当文の意図は明かに、yxと同じ大きさでなければならず、 yの各値はyに対応する多項式の値でなければならない事である。

その代りに、係数値配列a,b,...は幾つかの多項式、恐らくはLegendre 多項式の配列を表現する。そこで、もしxがスカラー値であれば、その意味は 再び明白になる。ここで、yは係数配列と同じ大きさで、各yは対応する 多項式の値でなければならない。

二項演算は各成分に対して一度実行される。だから、a+bならば、 各i, j, k, lに対し、

 
a(i,j,k,l) + b(i,j,k,l)

が計算される(abは4次元とする)。対応する添字の長さは、この手続 が意味を成す様に同じでなければならない。ここで、二項の被演算子の大きさが適合 しなければ、Yorickは"適合不可な間違い(conformability error)"を出す。 refill

それでも、aに3個の次元しかなくても、a+bには次の様に意味がまだ ある:

 
a(i,j,k) + b(i,j,k,l)

この方法で、二次元、一次元、最後にはスカラも拡張する:

 
a + b(i,j,k,l)

これは、この節の最初の例の単項式x^3をYorickがどの様に翻案しているかを 示すものである。このabの形は、それらが共通する個所で同じ長さの 次元を持つ限り問題が無い。つまり、短かい方の被演算子は、それが持っていない 次元の各添字で、その値を単純に繰返す。この反復は"種蒔き(broadcasting)"と 呼ばれる。

種蒔きはYorickの配列構文の要である。現実問題で、配列aの最後の次元 lを欠く事は、b配列の第二次元(j)を欠いている事と全く同様 である。この場合を扱う為に、Yorickは配列aの最後の次元を欠いている場合 も加え、任意の長さ1の次元の種蒔きを行う。ここで、a配列が長さ1の第二の 次元を持っているのであれば、a+bは各i,j,k,lに対して次を意味する:

 
a(i,1,k,l) + b(i,j,k,l)

必要であれば、擬似添字をその様な単位長さの添字を生成する為に用いても良い (see section 2.3.5 Creating a pseudo-index)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.7 Dimension Lists

決して配列次元の長さを参照する必要の無い方法で、貴方はYorickのプログラムを 書く様に努めるべきである。配列次元は、通常、計算で直接的な重要性が無い。 つまり、貴方のプログラムは、その配列自体を見せるかどうかをより明確なものに すれば良い。

現実問題として、不幸な事だが、次元長に言及せずに済む訳とは限らない。 次の二つの函数が重要である:

numberof(x)
は配列xの項目の総数を返す。

dimsof(x)
は配列xの次元数と、後に次元の長さが続くリストを返す。だから、xが 9×2×6配列であれば、dimsof(x)[3,9,2,6]を返し、もし、xが スカラー値であれば、dimsof(x)[0]を返す。

dimsof(x, y, z, ...)
多引数であれば、dimsof函数は配列x+y+z+...の次元リスト、或いは、 入力配列が適合していなければ、[]を返す。

array函数(see section 2.1 Creating Arrays)とより不可思議な函数 add_variable, add_memberreshapeは全て一つ、或いは それ以上の"次元リスト"助変数で終えられた助変数リストを持つ。 次元リストでの各助変数は、単次元の長さを表現するスカラ整数値、或いは 零又はそれ以上の次元を表現する為のdimsofによって返された書式での 整数リストの何れかである。幾つかの引数は複雑な次元リストを構築する上で 用いても良い:

 
x1 = array(0.0, 9, 2, 6);     /* 値が0.0の9×2×6配列 */
x2 = array(0.0, [3,9,2,6]);  /* もう一つ別の9×2×6配列 */
x3 = array(0.0, 9, [0], [2,2,6]);   /* ...そのまた別の奴 */

flux= array(0.0, 3, dimsof(z), numberof(groups));

最後の例で、fluxは位置zの各数と陽子エネルギーgroups の各数に対応する流れベクトルの三成分を表現する。fluxは長さ3を持ち、 各fluxベクトルの三成分に対応する。その最後の次元はgroups配列と同じ 長さを持つ。それらは零かそれ以上の次元である -- 位置zの配列 の 次元如何である。

引き延し添字構文(see section 2.3.7 Using a rubber index)を用いる事で、貴方はzの大きさ を知る必要無しにflux配列の意味の断面を引出し、それらの長さをその ままにしておく事が可能である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3. Graphics

Yorickのグラフィックス函数は科学的出版物で貴方が見る様な一般的な種類の 絵の大半を生成する。しかしながら、全ての利用者にとって完全なグラフィックス インターフェイスの提供は現実的な設計目標ではない。その代りに、私の目的は 可能な限り最も単純なグラフィックスモデルと最も基本的な描写函数を提供する 事である。もし、貴方がそれ以上を望むのであれば、私が提供する部品から、 貴方自身の"完璧な"インターフェイスを組み立てる事を期待する。

私の夢は、Yorickの配布中の翻訳されたプログラムとしての幾つかの インターフェイスを提供する事である。現時点では、この戦略の最高の例題は `pl3d.i'インターフェイスであり、これは、私がこの章の始めに記述した ものである。全ての新しいグラフィックスインターフェイスが`pl3d.i'の 様な大きな生成物である必要は無く、寧ろ、適度に小さな函数がより便利である; 以下で議論されているplh函数は一例である。

貴方がこれから見る様に、可能な限り最も単純なグラフィックスモデルは 依然非常に複雑である。不幸な事に、私は如何なる簡単な処方も判らないが、 注意深い調査を払う事を私は約束する事が出来る。私は科学的グラフィックス の基礎を学ぶ本として、Edward Tufteの本 "The Visual Display Quantitative Information"と"Envisioning Information" を薦める。

3.1 Primitive plotting functions  The basic drawing functions.
3.2 Plot limits and relatives  Setting plot limits, log scaling, etc.
3.3 Managing a display list  The display list model.
3.4 Getting hardcopy  How to get it.
3.5 Graphics style  How to change it.
3.6 Queries, edits, and legends  Seeing legends and making minor changes.
3.7 Defaults for keywords  Setting (non-default) defaults.
3.8 Writing new plotting functions  Combining the plotting primitives.
3.9 Animation  Spielberg look out.
3.10 3D graphics interfaces  An experimental interface.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 Primitive plotting functions

Yorickには9個の原始的な描写命令機能を持っている:plgは折線やpolymarker を描き、pldjは繋っていない線分を描き、plm,plcとplfは、quadrilateral網目 に対して、各々網目の線、等高線、そして、網目を(色で)塗り、pliは画像を 描き、plfpは色を塗った多角形を描き、plvはベクトルの矢印を描き、pltは 文字列を描く。これらの原始的要素を組合せる事で、、追加の描写函数を書く 事が出来る。

3.1.1 plg  Plot graph.
3.1.2 pldj  Plot disjoint lines.
3.1.3 plm  Plot quadrilateral mesh.
3.1.4 plc  Plot contours.
3.1.5 plf  Plot filled quadrilateral mesh.
3.1.6 pli  Plot image.
3.1.7 plfp  Plot filled polygons.
3.1.8 plv  Plot vectors.
3.1.9 plt  Plot text.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.1 plg

Yorickのplg命令は1次元配列yの値を対応する配列xの値の函数として描く。 より正確には、

 
plg, y, x

で、xとyがN成分の配列の時に、(x(1),y(1))から(x(2),y(2))へ、 次には(x(3),x(3))へ等々と(x(N),y(N))までの線分の列を描く。

plgの引数の"降(backward)"順(x,yの代りにy,x)では、デフォルト値xが許容される。 即ち、

 
plg, y

は1,2,3,...,NやYorickのそれ自体を表現する特別な方法で indgen(numberof(y)に対するyを描く。貴方は配列での列を指し示すだけの 水平軸(yは鉛直に描かれる)と一緒に、配列yを描く事を望む。

オプションのキーワード引数で、直線の書式(実線,破線等)、直線の色、線に沿って 印を置いたり、最後の点と最初の点を結んで閉じた多角形にするかどうか、 方向を示す矢印を描くかどうか、そして、基本の点を繋ぐテーマに基くその他の 変奏を調整する。

type= キーワードで線の型を0や"none"に設定すると、plgは点を折線で繋ぐので はなく、寧ろ、点自体に印を描く様になる。"scatter plot"は次の様にして 行う;

 
plg, type=0, y, x

印字描写に関しては、xとyはスカラーであるか、単位長の配列であっても良い。 もし、貴方自身の印字を指定する必要があれば(恐らく、実験データを描く場合)、 plmk函数が使える。 どの様に使うかはヘルプ函数で調べよう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.2 pldj

pldj命令もまた点を繋ぐが、こちらは離散的な線分としてである:

 
pldj, x0, y0, x1, y1

これは、(x0(1),y0(1))(x1(1),y1(1))、それから、 (x0(2),y0(2))(x1(2),y1(2))等々と繋ぐ。 yとxが1次元配列のplgと違い、pldjの四個の引数は、全ての四個が同じ形で ありさえすれば、任意の次元であって良い。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.3 plm

plm命令はquadrilateral meshを描く。二次元配列xとyで網目を指定する。 配列xは網目の結節点のx座標で、配列yはy座標である。もし、xとyが M×N行列であれば、網目は(M-1)*(N-1)のquadrilateral Zoneから 構成される。四結節点x(1,1),y(1,1)x(2,1),y(2,1)x(1,2),y(1,2)x(2,2),y(2,2)は第一のzoneの境界となる。 --- 結節点kbd{(1,1)}, (2,1), (1,2)(2,2)と 略記する。この隅のzoneは二つの稜線がある近傍を持つ -- 一つは 節点(2,1), (3,1), (2,2)(3,2)のもので、 他は節点(1,2), (2,2), (1,3)である(2,3)。 大半のzoneは稜線に四個の近傍を持たせ、一つはquardrilateralの各稜線を 占める。次のpim命令は全てのquadrilateral網目の(M-1)*N+M*(N-1)個の 稜線を描く:

 
plm, y, x

オプションのキーワードで、両方の線分の族(これらは第一、或いは第二の 添字で定数である)に対して、色や線分の書式の調整の為に分ける事が行える。

オプションの第三引数はexistence mapである -- 全ての(M-1)*(N-1)zone 全てが実際に描かれる必要は無い。論理的には、existence mapはzoneが存在する かどうかを報せる真値の(M-1)×(N-1)配列である。歴史的な理由から、 plmは呼出されたireg、これはireg(1,)ireg(,1)(最初の行と列)は 全て0である。plmはiregで呼出されたM×N配列を代わりに要求する。 ここで@kdb{ireg(1,)}とireg(,1)(最初の行と列)は全て0で、その値は 非存在の領域向けのものである。更に、存在するzoneに対しては、iregは任意の 正値を取る事が可能である;そのireg(i,j)の値は、節点(i-1,j-1), (i,j-1), (i-1,j)(i,j)のメッシュで境界とされるzoneの "領域番号"(存在しないzoneは領域零に属する)である。 boundary=キーワードで、plmが単領域(region=キーワード値)の境界 となる稜線のみを単に描く事になる。

単純な例題として、ここに貴方がその中央の2×2zoneを欠いた4×4zoneメッシュ を描く方法を示す;

 
x = span(-2, 2, 5)(,-:1:5);
y = transpose(x);
ireg = array(0, dimsof(x));
ireg(2:5,2:5) = 1;
ireg(3:4,3:4) = 0;
plm, y, x, ireg;

plcとplf命令はquadrilateral網目上で函数を描く。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.4 plc

plc命令は函数z(x,y)の等高線を描く。もし、zが網目座標配列xとyと同じ 大きさ二次元配列であったとすれば、すると

 
plc, z, y, x

はzの等高線を描く。キーワードlevs=は特定の等高線水準を指定し、 それは、zの値が描かれるものである;デフォルトでは、貴方はzの全値域を8個 に等分した等高線が得られる。各等高線は自動的に折線の集合である。 これはYorickが等高線折線を見付ける竹に用いるアルゴリズムである:

網目の各稜線は、両方の端点で指定されたZ値を持っている。 一方の端点と別の望まれる等高線の水準下の端点を持つこれらの稜線に対し、 稜線上の(x,y)点を見付ける為に、線形にzをその稜線に沿って補間する。 ここで、zは水準値を持っている。

その様な任意の点で開始し、その様な稜線を含む二つの領域の一つを選び、 そして、その領域の他の稜線上のその点に移動して、その反対側の領域に 対する新しい稜線を越える。

貴方がメッシュの境界か、貴方が出発した点に辿り付くまで継続する。 もし、幾つか点が残っていれば、その手順を別の繋っていない等高線で繰返す。 もし、貴方が全てをそのままにして境界点で開始するのである限り、貴方は 最初に全ての等高線 -- メッシュ上の一点から別のものへと渡る -- を巡る 事になり、それは全ての閉等高線である。各等高線の水準は幾つかの折線で 構築されていても良い事に注意しよう。

もう一つおまけの難しさが生じる:幾つかのzoneは、その等高線値の上と 二つの対角線隅、その下に二つの他の隅を持つかもしれない そして、全ての四個の稜線はその等高線上に点を持つ。

実際、貴方のメッシュはこの隅を見付けない -- それは等高線が交差する 本当にX-点を表現するかもしれないし、その場合では、直接、反対側にある 点にその領域を直接渡って動かしたいかもしれない。不幸にして、 もし、反対側の稜線に繋げてしまうと、貴方は非常に醜い等高線描写を得る 事になる。(例え、貴方が他の個所で私の好みに同意しないとしても、ここでは 私を信頼しよう)。

そこで質問、貴方が把持した隣接する稜線はどれかな? もし、貴方が描いた全ての等高線に対して、同様の選択をしていなければ、 異なった水準の等高線が横断する(そして、その絵を解釈しようとした時に、 貴方の目もそうするだろう)。デフォルトで、plcは最小曲率アルゴリズムの 一種を用いる:それは反対向きにして、以前の領域を横切る様にする。 plcのキーワードtriangulate=はメッシュでの任意、又は全ての領域の 特定の三角形分割を行い、plc命令の実行中に、自動的三角形分割決定を返す 事が可能である。再度、もし、三角形分割決定が貴方にとって重要であれば、 貴方のメッシュは恐らく貴方が描こうとする等高線を解決するに十分良いもの ではない。

良い等高線を描くのはアルゴリズムでは無く技巧である。等高線は、それを 質素に用いれば最も効果的である;6個以上の水準は、理解不能な絵の結果 となり易い。

私は貴方に非常に少ない水準を、メッシュ描写(plfで描いたもの)の上に描く のを試みる事を提案する。貴方はcontrasting 色を選択する必要があり、そして、 貴方はplcを各水準向けに異なった線の種類となる様に水準毎に一度plcを 呼出す事を望んでも良い。

もし、貴方が沢山の水準が必要になれば、plf函数を試すべきである。 これは、後続の等高線水準の間に異った色で領域を満すものである。 およそ6水準を越えて、plc命令で描かれる等高線は理解不能だろうが、 plfcを使うと、恐らく、20個の見分け可能な水準になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.5 plf

plf命令はfilled meshを描写する。つまり、二次元メッシュで 各quadrilateral領域に対してsolid colorを与えるものである。 その色はパレットと呼ばれる連続的な色の一覧から取られる。 異なった色は異なった関数値を表現する。パレットは白黒からの灰色の値 の大きさや、赤から紫への色のスペクトルの大きさであっても良い。

xとyとしての同じ大きさを持つz配列に対するplcとは違い、plf命令のz配列は、 もし、xとyがM×Nであれば、M-1×N-1配列でなけばならない。つまり、 一つの節点毎の一つのzの代りに、そのメッシュの各領域に対する一つのz値か 色がある:
 
plf, z, y, x

分離パレット命令はz値を表現する色の列を決定する。plfに対するキーワードで、 zがそのパレット上にどの様に拡大されるか(デフォルトでは、最小のz値がパレット での最初の色を得て、最大のzが最後の色を得る)、zoneの稜線が内部で追加の 色付けで描かれるかどうかを決定する。xとy座標が三次元空間内の二次元曲面の 射影の時、その射影されたメッシュはそれ自身に重なるかもしれず、その場合、 plfが描くzoneの順序が重要になる-- 与えられた(x,y)で、貴方はその点を含む 最新の描かれた領域の色だけを眺める羽目になる。その描く順番はz配列を蓄える 順番と同じで、(1,1), (2,1), (3,1), ..., (1,2), (2,2), (3,2), ..., (1,3), (2,3), (3,3), ...となっている。

満されたメッシュの上で、一つ、或いは二つの描かれた等高線は二変数の函数を 表現する為に最小のこんがらせない方法の一つである。色付けはその函数の滑らかな 変化には沢山の等高線よりも感じがより良いが、色と函数値との間の対応は完全に 任意である。一つ、或いは二つの等高線は、もし、一つ、或いは二つの特別に 重要で、観察者が自然な興味を満す水準が描かれていれば、この視覚的なパズルを 上手く解く。

Yorick 1.5では、zはtrue colorのメッシュを作成する為に、char型の 3×M-1×N-1配列であっても良い。zの最初の添字は(red,green,blue)で、 最小が0、最大が255の輝度である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.6 pli

数値化された画像は通常二次元配列として指定され、これらの値は正方形、或いは 長方形画素の配列の色を表現している。適切なxとyメッシュ配列を構築する事で、 plf函数を用いてその様な画像を表示出来るが、pli命令は劇的に速くてより効率的 である:

 
pli, z, x0, y0, x1, y1

は、zをM×Nの画像画素値の配列とした時に、@kbd((x0,y0)}をz(1,1)に 最も近い隅、(x1,y1)z(M,N)に最も近い隅として画像を描く。 オプションのx0,y0,x1,y1引数のデフォルトは0,0,M,Nである。

Yorick 1.5より、zは色付けされたメッシュを生成する為にchar型の3×M×N配列 であっても良い。 zの最初の添字は(red.green,blue)で、最小0の強度で最大255 である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.7 plfp

plf命令の第三の変種はplfpである。これは任意のfilled polygonsを描くものである; それはquadrilateralに対して制限されていない。 pliはplfの特別の場合であるが、plfpはplfの一般化である:

 
plfp, z, y, x, n

ここでzは色のリストで、xとyは多角形の隅の座標である。第四の引数nは そのリストで続く各多角形に対する隅(側面)の数のリストである。 全ての四引数はここで、1次元配列である;zとnの長さは多角形の数で、xとyの 長さが角の総数、即ち、sum(n)である。再度、plfpはz(或いはn)配列 の順番で、その多角形を描く。

特別な場合として、もし、その最初の後の長さ全てが1であれば、 最初の多角形座標系はNDC単位で取られ、それから残りの孤立点は この多角形のnumberof(n)-1個の複製を描く為のオフセットとして用い られる。この奇妙な機能はplmk函数に必要である。

yorick1.5では、zはtrue colorで描かれたメッシュを生成する為、3×sum(n) のchar型配列としても良い。zの最初の添字は(red,green,blue)で、 0が最小の大きさで、255が最大である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.8 plv

plc,plf,pliとplfpは2変数函数で単一値のものの表現を描くが、plv命令は各点 (x,y)での2Dベクトルを描く。そのベクトルは自動的にdartの様に見える -- それは高さよりもより狭い底辺を持ち、その高さはベクトル(u,v)に等しい isocelesである。大きさと方向の両方で、そして、その点(x.y)でのcentroidで:

 
plv, v, u, y, x

良いベクトル描写を作成する事は非常に技巧的である。貴方の(u,v)ベクトル に程良い長さを見つけなければならないだけでは無い -- 最も長いものは 貴方の(x,y)点の間の隙間の様になるべきである -- 而し、貴方の 絵の領域を通じて寧ろ均一に、(x,y)点それ自体がsprinkleでもなければなない。 それらの技巧的な難問に打ち勝つ為に費やす時間は通常、労力するだけの価値 はない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1.9 plt

最後の描写命令はpltで、これは幾何学的な絵以上に文章を描くものである:

 
plt, text, x, y

オプションのキーワードはフォント、大きさ、色と文字の向き、 そして、座標xとyの正確な意味 -- それらが与えられた座標系が何で、 与えられた点に対応して、その文字がどんな風に調整されるかを決定する。

他の描写プリミテイブと異なり、plt命令でのデフォルトで(x,y)座標は 貴方のデータと同じ(x,y)拡大率を参照しない。その代り、それらは所謂 正規化されたデバイス座標系で、それは紙のシートに対してkeyされたもので、 貴方の絵のハードコピーを印刷すべきものである。

(x,y)を貴方のデータの所謂、全体座標系(貴方のデータは何処に由来するのかな?) を参照させる為、貴方はtosys=1キーワードを用いなければならない。 もし、貴方が文字を貴方の全体座標系に置けば、単にその位置は、それを通して 貴方が拡大・縮小したりする様に、貴方のデータの後に続く; 文字の大きさが、貴方が拡大するにつれて大きくなったり、或いは、 対数目盛軸に変更した時でも、貴方の文字が驚く程壊されたりする事を期待 しない様に。

文章はorient=キーワードで90度の倍数で回される。任意の回転角度は 提供されておらず、回転された文字が貴方の画面に表示される速度は、 回転していない文字と比べて劇的に遅いかもしれない。

貴方は文章に上付き文字、下付き文字、記号文字を、エスケープ シーケンスを 用いて得る事が可能である。Yorickはタイプセッティングプログラムではなく、 それらの機能は可能な限りの最高品質ではないだろう。画面と印刷された ハードコピーが絶対的に同一なものでもない(これは決して真ではない。 実際に、上付き文字と下付き文字は目立って違う)。これらの機能で、 そのエスケープ機能は全く便利である。

記号文字を得る為に(symbolの他のフォントと仮定)、びっくり記号を文字の前に 置く -- 例えば、"!p"はギリシャ文字のpiとなる。4個の例外がある: "!!","!^""!_"は、非記号文字のびっくり記号、カレット、 下線"_"となる。更に、"!]"はsymbolフォントでカレットになり、 これは直交する事のsymbolとなる。びっくり記号、underscore、そして、 右鍵括弧文字はそれ自体symbolフォントにあり、脱出された記号として 重要ではない。もし、文書のその最後の文字がびっくり記号であれば、それは 特別な意味を持たない;貴方はびっくり記号を抜き出す必要はない。

カレット"^"は上付き文字を導入し、underscore"_"は下付き文字を 導入する。重層の上付き文字は無い:文章の各文字は通常、上付き文字か、 下付き文字の何れかである。カレットで、通常、或いは下付き文字から上付き文字、 上付き文字から通常に切り替える。undersocreは通常や上付き文字から下つき文字へ、 又は、下付き文字から通常に切り替える。

その文章が複数行に亘るものであれば(改行文字"\n"で分離されている)、 pltは複数行で描き、各行はjustify=キーワードに対して調整され、 その縦の調整はその全体区画に対して適用されている。貴方は常に、その 適切な文章の調整を用いるべきである。何故なら、その文章の大きさは 出力デバイスの一つから別のものへ出力で変化するからである -- 貴方の画面で見る文章の大きさは単にハードコピーでの大きさに近似である。 複数行の文章で、上付きと下付き文字は通常各行の頭で再設定されている。

ここで、エスケープ列の例題である:

 
text = "The area of a circle is !pr^2\n"+
  "Einstein's field equations are G_!s!n_=8!pT_!s!n";
plt, text, .4,.7,justify="CH";


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 Plot limits and relatives

描写プリミティブの列は単に貴方の絵を部分的に決定するものである。 貴方は屡々、描写の制限 -- 貴方が見たいxとyの値域値を指定したくなる 貴方はlog-logたsemi-log目盛、或いは枠の回りの目盛の代りにグラフを横切る グリッドが通常の線形目盛の代りに使える。 最後に、貴方は任意のplf,pli或いはplfpプリミティブの擬似色付けの為に 用いられた色彩パレットを指定出来なければならない。

限界、logxy,gridxyとパレット函数は貴方が必要とするインターフェイス ルーチンである。もし、貴方が本当に神経質であるのなら、貴方はまた、 貴方の絵の見栄えをより詳細に制御出来る -- 例えば、tick markの厚さ、 ラベルのフォント、表示領域の大きさや形と云ったものである。 グラフィックスの形態に関する節では、どの様にして、貴方のグラフックス の見栄えを完全に制御するかを述べる。この節では、貴方が屡々、そして、 会話的に用いたい函数に就いて少々述べる。

3.2.1 limits  Set plot limits.
3.2.2 logxy  Set log axis scaling.
3.2.3 gridxy  Set grid lines.
3.2.4 palette  Set color palette.
3.2.5 Color model  More about color.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.1 limits

描写の制限を変更する幾つかの方法がある:最初のlimits命令は、 値域命令で、マウスをクリックしたりドラッグする。又、非拡大命令は 全てのマウスによる拡大操作を無効にする。

limits命令のその構文は:

 
limits, xmin, xmax, ymin, ymax

その設定されたlimitsの各々は、数字でも、データのextremeな値に対応する符号 の文字"e"でも、limitを変更せずにそのままにしておくnilでも良い。 例えば、描かれるデータで、0.0から最大x、そして、現在のデータで現在の最小値y から最大値yに亘る表示limitsを設定する為、次を用いる:

 
limits, 0.0, "e", , "e"

もし、xminとxmax(或いはyminとymax)の両方が数値であれば、貴方はxminを xmaxよりも大きく(或いはyminをymaxよりも大きく)して、デフォルトの より便利な左から増加(或いは上昇)する目盛の代りに右に減少(下降)する目盛 にする事が可能である

特別な場合として、引数無しのlimitsはそれらのextremeな値に対する4個のlimits を設定するのと同じものである(寧ろ、全ての4個のlimitsをそのままにする)。 それ故、もし貴方が丁度描いたものが見えなければ、現行の絵で、全てが見える 様に保証する非常に単純な方法は次を入力する事である:

 
limits

もし、貴方がx軸の制限を変更したければ、次を入力する:

 
limits, xmin, xmax

簡便に、もし、貴方がy軸の制限を変更したければ、貴方は値域函数を (limits命令のあと の3個の続くコンマを入力する代りに)使う事が可能である:

 
range, ymin, ymax

3.2.1.1 Zooming with the mouse  How to zoom by mouse clicks.
3.2.1.2 Saving plot limits  Save and restore plot limits.
3.2.1.3 Forcing square limits  Assure that circles are not ellipses.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.1.1 Zooming with the mouse

マウスを使って拡大する為には、貴方がその周囲を拡大したい点にマウスを 置こう。拡大は左マウスホタンをこの点の上でクリックし、縮小は右ボタンで ある。もし、そのマウスボタンを押しながら引き連れて、そのボタンを離すと、 そのマウスが押された時にマウスの下の点が、ボタンを解放した点に移動する。 真中のマウスボタンは拡大を行なわないが、もし、貴方がそれを押しながら 引き連れば、スクロールする。ここで、左ボタンで拡大し、真中のボタンで 全体表示、右側ボタンで縮小する。

もし、貴方が丁度絵の枠の外側、絵の枠の目盛付近でクリックすると、 拡大と縮小操作が貴方がクリックした軸のみで生じる。この方法で、 貴方はy(或いはx)の大きさを変更せずに、x(又はy)の領域上で拡大が行える。 或いは真中のボタンで、その他の方向で、制限を偶然変更する事に戸惑う事 無しに、一方向に沿った縮小が行える。

マウスを用いてスクロースする別の方法は、貴方がその画面を一杯に引き 伸ばしたい領域の一つの隅シフトキーを押しながら、マウスの左ボタンを 押す事である。ボタンを押したままで、マウスを貴方の長方形の反対側の角に ドラッグし、それから、ボタンを離すと拡大を行う。この拡大操作は制御が 難しいが、等しくないxとyの拡大倍率で一度に拡大が行える。 (その逆操作 -- 現在の一杯の画面をマウスで引き回した長方形に写す事 -- は右ボタンとshiftを押す事で可能になる。これで、 right button. This turns out to be unusably non-intuitive.)

任意のマウス拡大函数の後で、四個全ての制限が、例え、それらが拡大される前の extreme値であったとしても固定された値に設定される。以下を入力す事で、貴方は 拡大以前の制限を、任意のextreme値設定も含めて元に戻す事が可能である:

 
unzoom


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.1.2 Saving plot limits

貴方は函数としてlimits函数を呼出す事も可能で、その場合、それは 現在の[xmin,xmax,ymin,ymax,flags]を返す。flagsはビットであり、 それはデータのextreme値として計算されたlimitsと幾つかのオプションの 機能を決定するものである(to be mentioned momentarily).

後のlimits命令への引数として、limitsによって返される値は、 extreme value flagsの設定を含むpriorな条件に対するlimitsを蓄える。 だから、

 
         // mouse zooms here locate an interesting feature
detail1 = limits()
unzoom   // remove effects of mouse zooms
         // mouse zooms here locate second interesting feature
detail2 = limits()
limits, detail1    // look at first feature again
limits, detail2    // look at second feature again
limits   // return to extreme values


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.1.3 Forcing square limits

squareキーワードは任意のextremeな制限を、xとy倍率が同じ単位になる様に 選択する -- だから、円は常に丸く見え、楕円になならない。 勿論、もし貴方が全てのlimitsを明示的に設定すれば、squareキーワードは 効力を持たない。例えば、

 
limits, square=1, 0., "e", 0., "e"

で、xとyの両方の下limitsが零にされ、その上限は最初のquadrantでデータの 全てが見え、xとyの成分が同じままになる様に選ばれている(通常は、 これはxmaxとymaxが等しい事を意味するが、もし、視野が正方形でなければ、 xmaxとymaxはその視野の各辺が同じ比率となる)。 そのsquareキーワードは、例え、その単位が変更されたとしても、効果は そのままである。例えば、

 
limits

で、全てのextreme値のlimitsを再設定するが、ここで、一つの軸は、xとyの単位 が等しいままになるに、その方向で、データの制限を越えても良い。 デフォルトの振舞いに戻る為に、貴方はsquareキーワードを再び共なった limits命令を明示的に呼出さなければならない。 例えば、

 
limits, square=0


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.2 logxy

貴方は対数(log)、半対数(semi-log)或いは通常の線形目盛軸の中から選べる:

 
logxy, 1, 1       // 対数-対数表示
logxy, 1, 0       // 半対数表示。xが対数
logxy, 0, 1       // 半対数表示。yが対数
logxy, 0, 0       // 線形軸目盛

貴方はまた、座標軸の目盛を変更せずに、xやyフラグを省略出来る:

 
logxy, , 1

で、y軸を対数目盛に変更するが、x軸の目盛は変更されない。

もし、貴方がプログラムで必要であれば、limits函数で返されるフラグは、 現在のlogxy設定に含まれている。 貴方のデータでの零又は負の値は、対数軸目盛を使っていても破滅的な効果を 持ってはいない; Yorickは貴方のデータの絶対値を取り、非常に小さな オフセッットを対数函数を作用させる前に取っている。副作用として、 対数表示では、貴方のデータの符号を失なってしまう。もし、貴方が 振動データに対して対数目盛を得る為の方法が必要がある場合、特別に負の点 を扱う為の函数を記述しよう。例えば、

For example, to draw positive-y portions solid and negative-y portions dashed, 貴方はこの様な函数を用いても良い:

 
func logplg(y, x)
{
  s = sum(y>=0.);  /* number of positive-y points */
  n = numberof(y);
  if (s) plg, max(y,0.), x, type="solid";
  if (s<n) plg, min(y,0.), x, type="dash";
}

対数軸を用いる代りに、常に函数の対数を描くオプションがある;

 
logxy,0,1; plg,y,x

は次と同じ曲線を描く:

 
logxy,0,0; plg,log(y),x

対数軸目盛は単に目盛の位置とそれらのラベルを変更するだけである; y軸メモリは最初の場合でルール目盛のずらしの様に見えるが、第二のものでは、 通常のルーラーの様に見える。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.3 gridxy

gridxy命令は、貴方の描写の見栄えを、よりlogxyやlimitsが行なう方法よりも より従属的に変更するものである。通常、Yorickは目盛を貴方の描写の縁の 周りにルーラー目盛に似せて描く。gridxyを使うと、グラフシート上の直線の 様に、貴方の絵の中心を亘る全ての道に大目盛が延される事になる。 logxyの様に、gridxyを使って、貴方は水平と垂直のグリッド線を制御する。 しかし、gridxyで、貴方が一変数のみを与えた場合、両方の軸が影響される (通常、貴方が軸で、両方の軸に対するもグリッド線でも無く、グリッド線 を望んでいたとしても)。例えば、

 
gridxy, 1      // full grid, like graph paper
gridxy, 0, 1   // only y=const grid lines
gridxy, , 0    // turn off y=const lines, x unchanged
gridxy, 1,     // turn on x=const lines, y unchanged
gridxy, 0      // ticks only, no grid lines

もし、フラグ値は1の代りに2であれば、グリッド全体の代りに、 その値域で"最も丸い数値(roundest number)"(もし存在すれば零)で、 一つだけのグリッドが描かれる。もし、貴方がy=0での参照直線を必要 としても、貴方はグリッド線の完全な集合で、貴方のグラフがclutterされる 事を望まないければ、次を試そう:

 
gridxy, 0, 2
目盛とラベルの表示は実際にグラフィックス形態の一部である。貴方の グラフィックス形態の詳細を他に変更する事を望むだろう。 貴方のグラフィックス形態の他の詳細を変更したい、貴方がグリッド線のonとoff を行う程。これは、分離したgridxy函数がグラフィックス形態のこの一面を制御 している事を説明するものである。

gridxy命令はまた、目盛の位置を計算して、30の倍数で目盛が現われる事が出来る 様に、デフォルトのアルゴリズムを変更するキーワード引数を受け付ける。 これは、時には次数を表現する軸の見栄えを良くする。デフォルトでは、目盛は 単に"10進"の位置のみに現われる事が可能で、これらは、 非零の十進数、1,2や5である。gridxyとオプションのより完全な記述に関しては、 オンラインヘルプやを参照されたい。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.4 palette

plf,pliとplfp命令は、値の連続的な値を表現する為に、連続した色の色彩目盛 やパレットを必要とする。実際、パレットは有限個の(red,green,blube)の三原色 から構成され、それらは有限個の値のリストの各々に対して色を表現するものである。 Yorickのパレットは消して256初期以上は無く、char変数(一項目に付き一バイト) はパレットに任意の添字を保つ事が可能である。多くの画面が同時に256のみ表示 可能なので、貴方はパレットで約200色以上を持つべきではない; それが、全ての予め定義されたYorickのパレットの大きさである。

palette命令で貴方のパレットを替えられる。Yorickの配布では、`earth.gp' (デフォルトのパレット),`gray.gp',`yarg.gp],`heat.gp', `stern.gp'と`rainbow.gp'と呼ばれる前もって定義されたパレットが 附属している。灰色パレットを読込む為には、次を入力しよう:

 
palette, "gray.gp"

これらのパレットは、暗い色で開始してから明い色に進行する。例外は `yarg.gp'で、これは`gray.gp'の逆版(貴方の絵は、 `gray.gp'を使って見た方法の写真のネガの様に見える)であり、 `rainbow.gp'、これは殆ど一定の輝度で、特殊な順序の色で 渡るものである。

`gray.gp'(或いは`yard.gp')と`rainbow.gp'を除いて、 それは、人々の考えの順序で並べられた色の列 Besides `gray.gp' (or `yarg.gp') and `rainbow.gp', it's tough to find color sequences that people have been trained to think have an order. `heat.gp'パレットは熱くなるにつれて鉄の棒が赤-橙となるのに似せた目盛 である。デフォルトの`earth.gp'は、濃い青色の大洋から緑の低地、 灰色の高地や白い山々へと云ったmapmakerの色に大体基づくものである。

ファイル名の代りに、貴方は、赤、緑、青の相対的な輝度となる0から255迄の値域 の数値の配列を渡しても良い。例えば、

 
scale = bytscl(indgen(200),top=255);
palette, scale,scale,scale;

で、`gray.gp'と同じパレットを生成するが、RGP値の直接指定では無く、 寧ろ、パレットファイルを読込む事による。

Yorickは、パレットに(0原点)添字にplf,pliやplfp命令で、z値を写す為に、 内部的にbytscl函数を用いる。時には、ここでの様に、貴方はまたbytscl明示的 に呼出す事を望む。

前もって定義されたファイルはY_SITE+"gist"にある; もし、貴方自身のものを生成したければ、貴方は簡単にそれらの書式を描き出す 事が出来る様になる。貴方は`~/Gist'ディレクトリを生成し、 ここに貴方自身の固有のパレットファイルを置くと、Yorickは、その現行の作業 ディレクトリであろうがなかろうが、造作無くそれらを見付ける。

そのライブラリはファイル`color.i'を含み、パレットと、Yorickの標準的 書式でパレットを記述するdump_palette函数を構築する助けとなる函数を含む。

貴方はquery=キーワードを、現在インストールされたパレットのRGB値 値をretrieveする為に使う事が可能である:

 
local r,g,b;
palette,query=1, r,g,b;

パレットに対しては@kbf{private='キーワードもある。これは、貴方が カラーテーブルアニメーションや、貴方の全ての色彩を盗み出す他のプログラム に興味があるのなら、調査すべきものである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2.5 Color model

直線を描くプリミティブplg,pldj,plm,plcとplvはcolor=キーワードを 受け付ける。貴方は現在のパレットへの添字を使え、それらの場合では、 直線の色はパレットに依存する様になる。しかし、貴方は常に定義された 10色の中から一つを選ぶ事が可能であり、その色はパレットを変更した時も 変更されない。例えば、

 
plg, sin(theta),cos(theta), color="red"

は赤い円を描く(thetaは0から2*pi迄とする)。貴方がこの方法で指定可能な色は: "black", "white","red", "green", "blue", "cyan", "magenta","yellow", "fg""bg" である。

黒と白、そして第一と第二の色は説明するまでも無い。しかし、"fg"は 前景で、"bg"は背景である。全ての曲線のデフォルトの色は"fg" である;空の頁や画面の色は"bg"である。これらの色は内部的に 不定である;その他のものと違い、それらは貴方の画面上や印刷では異っている かもしれない。デフォルトで、"fg"は黒、"bg"は白である。 もし、貴方がX windowシステムを用いているのであれば、貴方は、これらの デフォルトをxのリソースを設定する事で変更出来る。例えば、以下の設定では:

 
Gist*foreground: white
Gist*background: black

貴方の画面上で、裏返した極性(polarity)(黒の背景に白い直線)で描く。 (Xユーティリティxrdbは、貴方の画面の為のXのリソースを設定する最も簡単な 方法である。)

Yorick 1.5の場合の様に、その色彩は、最小0で最大が255の輝度の3個の値 (red,green,blue)の配列であっても良い。もし、貴方が単に擬似色彩のみを 提供するディスプレイ上でtrue colorを指定した場合、そのウインドウは 5x9x5色彩の立方体にirreversiblyに切り替え、それは滑かなパレットで、 レンダリングの品質で顕著なdegradatioとなる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 Managing a display list

大半のグラフィックスは、プリミティブ描写函数に対する幾つかの 呼出しによって、生成されたoverlayである。例えば、3個の解析、 つまり、時間の函数としての温度の比較を行う為に、次を入力しよう:

 
plg, temp1, time1
plg, temp2, time2
plg, temp3, time3

三つ全ての曲線は単一の描写で現れる。つまり、貴方がplg命令を各々入力する に従い、貴方はその曲線が現れるのを見る。

Yorickの会話的画像パッケージの基本的範疇は、貴方が、その描写に各曲線を 追加する為に命令を入力する事であり、貴方は、その曲線が現れるのを見る。

貴方は次の曲線を生成する為に、ファイルを開いたり計算を実行しなければ ならないかもしれない。最初の幾つかの曲線を眺めた後で、貴方にとって 興味深い比較が生じる。。

たとえ、貴方がその描写でデータを変更していなくても、貴方は屡々、 描写の制約を変更したり、対数或いは半対数軸でデータがどの様に観察され るかを見たいだろう。貴方はlimits、logxy、或いはgridxyを貴方が望む時 なら何時でも呼出す事が可能である。つまり、貴方が望む変更は直ちに 実行出来る。

Yorickはディスプレイリストを管理する。このディスプレイリストは データを表示する為に発行した原始的描写命令のリストで、 貴方の画像に対してこの種の変更が行える様にするものである。 原始的函数は丁度、そのディスプレイリストに項目を追加する; 貴方は実際のレンダリングを行うルーチンにアクセスする必要は無い。 貴方はplotのlimitsや表示されたデータを変更する対数軸目盛の用な二義的な 機能を変更する事が可能である。実際に絵を生成する為ぬ、貴方は、 ある種のグラフィックス出力機器への適切な命令を送り込みながら、 その表示リストを"周遊"しなければならない。

もし、その絵を変えると、貴方の次の入力行の為の入力待ちの丁度前に、 Yorickは自動的に表示リストを周遊する。そうして、貴方が次に何を行うかを 考えている間に、貴方は常に、表示リストの現在の状況を見ている。

limitsの様な命令は実際に即座に再描写を強いる事は無い; それは、Yorickが表示リストを周遊する必要がある事を伝えるフラグを 上げるだけである。だから、もし、Yorickのプログラムがより明解なその方法 -- その効果が増え、Yorickが貴方の画面を一々再描写する事が待たなくても良い のであれば、limitsやlogxyを幾度と呼出す事に自由を感じよう。 --再描写はYorickが表示リストを周遊するのを止めた時点のみ発生する。

通常、表示リストパラダイムは貴方が望む事を正に実行する。 殊に、貴方が(寧ろ、描写命令を直接打ち出すものでは無く)グラフィックス 出力を行うYorickのプログラムを記述した時、そのindirectionは幾つかの subtleで驚くべき効果を生成する事が可能である。

3.3.1 fma and redraw  Frame advance (begin next picture).
3.3.2 Multiple graphics windows  How to get them.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3.1 fma and redraw

fma命令(枠進行の為のmnemonic)は二つの函数を実行する:最初に、もし現在の 表示リストが変化していれば、Yorickはそれをre-walkし、貴方の画面が更新 されている事を確認する。その後に、fmaは表示リストを消去する。

通常の会話的利用では、貴方は最初の函数の事を考える -- 表示リストが貴方の 画面上を流れるのを確実にする事 -- それは副作用として。 貴方の目的は、絵を更新する事を開始出来る様に、表示リストを消去する事 である。しかしながら、movieを作るYorickのプログラムでは、movieの現行の コマを描く事が重要で、表示リストの消去は、次のmovieのコマの為に準備 する副作用である。

別のfmaの副作用はよりsubtleである;Yorickは最早画面を描く為に要求される 命令の列を覚えていないので、表示のlimits(拡大や全体表示)、軸の目盛の 張替を変更、或いは、fmaの後で、貴方の画面の変化が無い再描写を要求する任意の 他の操作を試みよう。例え、依然貴方の画面上にその絵が表示されたままだとしても。

一度設定すると、limitsは枠進行にわたって継続される。つまり、fmaの後に、 次の描写は以前の描写の制約(limits)を引継ぐ。私はこれがは常に望ましいもの ではないが、以前のlimitsを忘却する事は非常に困惑させる原因となる事を認める する。別の可能性は、新しい描写に対して初期のlimitsを設定する事の意味を 与える。つまり、私はこの混同を判定した。私は通常次の様に入力している:

 
fma; limits

その古い制約が新しいplotでは正確ではない事が判る時。 その軸のスケーリングはlogxyで、グリッドラインはgridxyで設定され、 それらはまた枠進行にわたってpersistentである。

稀に、Yorickは適切に貴方の画面の更新をしないかもしれない。再描写命令 は貴方の画面を消去して、その全体のディスプレイリストを巡回する。 貴方はYorickのプログラムで、fmaを用いてディスプレイリストを消す 副作用無しに、直ちに貴方の画面に現在の絵を表示させる為に、これを使う事 が可能である。(多分、貴方は残りの絵の長ったらしい計算が進行中であったと しても、完成された部分を早急に見る事を望むだろう。)

再描写は表示リスト全体を無条件に歩き、fmaは単の一部を歩く。それは 以前散歩されていなかったり、最近の散歩から生じた(limits変更の様な)操作に よって破壊されていたりしたものである。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3.2 Multiple graphics windows

貴方は同時に8個の画像ウインドウを開く事が出来る。各ウインドウはそれ自身 のディスプレイリストを持っているので、一つのウインドウで絵を構築して、 別の絵を表示する為に、第二のウインドウに切り替え、それから第一のウインドウ に戻る事が出来る。ウインドウは0から7迄の番号が振られている。window命令 でウインドウを切り替える:

 
window, 1       // switch to window number 1
window, 0       // switch back to default window

もし、貴方が以前決して使った事のないウインドウに切り替えたとすれば、 新しい画像ウインドウが貴方の画面上に現れる。(もし、貴方が 最初の画像命令の前に、明示的なウインドウ命令を発行していな ければ、Yorickは自動的に番号0のウインドウを生成する)。

window命令は幾つかのキーワードを取る。wait=1キーワードで、 (もし、window命令が新しいウインドウを生成するのであれば)貴方の画面上 に自動的に新しいウインドウが現れる迄、Yorickを停止する。これは、 生成されたウインドウが実際に現れる迄に何も描く事の出来ないXウインドウ システムの下では重要である。もし、貴方が、(Yorickのデモの様な)、 画像出力を生成し、以前の画像命令があるかどうか確かでないプログラムを記述 するのであれば、貴方は以下の様な文で開始すべきである:

 
window, wait=1;

ウインドウに対するstyle=キーワードはそのウインドウに対して特定の 画像形式を指定する。私は後に画像形式に戻る。

キーワードdpi=100は1吋辺りで100ドットを指定し、デフォルトの1吋 75ドットよりも大きい。貴方の画面で見るウインドウは紙の8.5×11吋の比率 の複製であり、そのdpi(75か100の何れか)は画面画素数を参照し、画面画素数 は、もし貴方がYorickにその絵を印刷する様に命令しようとする場合 (hpcを参照せよ)、紙一枚での1吋に対応するものである。 X11r4で利用可能なフォントにより、Yorickは2倍角のみが許容されている。

最初に、Yorickのウインドウは8.5×11紙面上の六×六吋ウインドウで、 ポートレート方向では上側8.5×8.5吋の正方形の中心に寄せられ、 ランドスケープ方向では、長方形の中心に寄せられている。 (紙送りのPortraitやlandscapeと云った方向は、貴方が選択したグラフィックス 形態の函数である。6吋は75dpiで450画素、又、100dpiでは600画素となるので、 dpi=75とすると小さなウインドウだが、dip=100では 大きなウインドウになる)。貴方は(ウインドウマネージャーで)ウインドウの リサイズが可能であるが、Yorickは常に1吋あたり75か100ドットの何れかを 用い、だから、Yorickのウインドウの大きさ変更は、最初に見られる6×6吋平方 以上を使いたいので無い限り有用なものではない。

キーワードldisplay=は貴方のデフォルトのディスプレイ以外のディスプレイ を指定する。例えば、もし、貴方が二つの画面を持っていれば、 (zaphodが貴方のXサーバーが動作している計算機の名前であれば)、貴方の デフォルトの画面上に番号0のウインドウと貴方の第二の画面に番号1のウインドウ を生成する為に以下の様に使える:

 
window, 0
window, 1, display="zaphod:0.1"

貴方は稀にwindow命令に対する他のキーワードが必要になるかもしれない。 それは、個人のカラーマップ(カラーテーブルアニメーション向け)に対して、 そのlegendsをハードコピー出力でoffにし、一つのウインドウのsole use向け に個人的なハードコピーを生成する事を許容する。後者の機能で、貴方は現行の 絵を、主ハードコピーに影響を与える事無しに印刷するepsの用な命令を記述する 事が出来る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4 Getting hardcopy

現在のハードコピーファイルに貴方の画面上で貴方が見ている絵を追加する 為には次を入力しよう:

 
hcp

Yorickは現在のディスプレイリストを巡回し、ハードコピーファイルを Yorick walks the current display list, rendering to the hardcopy file instead of to your screen. ハードコピーファイルを閉じてプリンタにそれを送る為には、次を用いる:
 
hcp_out

通常、hcp_outは、印刷された後にそのファイルを破壊する。即ち、 貴方は次の方法でファイルを印刷する代りに保存出来る:

 
hcp_out, keep=1

もし、貴方が印刷せずにハードコピーファイルを閉じたければ、hcp_outの代り にhcp_finishを呼出す事が出来る。つまり、貴方がhcp_finishを(引数nilの)函数 として呼出すと、それが閉じたファイル名を返す。

hcp_outやhcp_finishを呼出した後に、hcpを次に呼出すと、新しいハードコピー ファイルを生成する。次のハードコピーファイルの名前の集合に対して、hcp_file を呼出す事が出来る。例えば、

 
hcp_file, "myfile.ps"

は、次回にYorickがハードコピーファイルをを生成する事を意味し、その名前は、 `myfile.ps'である。ファイル名はまたファイル型を陰的に決定する。即ち、 `*.ps'の書式の名前はPostScriptファイルとなり、他の名前はバイナリCGM となる。もし、貴方がファイル名を指定しなければ、Yorickは任意の存在している ファイルをclobberしない。つまり、貴方が名前を指定し、そのファイルが存在 していれば、Yorickは黙って存在しているファイルを上書きする。

3.4.1 Color hardcopy  Dumping palettes into hardcopy files.
3.4.2 Binary CGM caveats  Caveats about binary CGM format.
3.4.3 Encapsulated PostScript  Encapsulated PostScript output.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4.1 Color hardcopy

貴方が画面上でカラー画像を(例えば、plfやpliで)生成する時、貴方は その絵だけを保存するのではなく、その絵を描く為に用いたパレットも 保存する必要がある。何故なら、そのパレットはハードコピーファイルの 各枠毎に変るかもしれず、そのファイルは完全なパレットを各コマに対して preambleなものとして含まなければならない。しかしながら、貴方は通常、 あまり費用を費さずに、より高い品質の白黒主力を得たいのだから、 そのパレット情報は通常不要である。Yorickは、ハードコピーファイルとして 出力する前に、オプションで色彩を標準的なグレースケールの変換する。 出力ファイルとして小さな大きさで済む。

もし、貴方が白黒プリンタを使おうとするのなら、dump=キーワード を使ってパレットダンプを止める事が出来る:

 
hcp_file, dump=0

(貴方は次のハードコピーファイルの為に、その名前を指定しても良い)。 ハードコピーファイル名とは違い、パレットダンプフラグはハードコピーファイル にわたって継続する。ダンプを入れる為には、貴方はdump=1でhcp_fileを 呼出す必要がある。

全てのYorickのPostScriptファイルは任意の白黒やカラーのPostScriptプリンタ で印刷される。しかしながら、もしdump=0を設定していれば、 そのパレットはファイルに吐き出されず、それはカラープリンタでも灰色で印刷 される。もし、dump=1ファイルを白黒プリンタで印刷すれば、その結果は dump=0と同様である。つまり、貴方の色彩は灰色に変換される事になる。 もし、稀にそのパレットの吐き出しが欲しいのであれば、貴方の`custom.i' ファイルにdump=0を設定するhcp_fileへの呼出を入れる事が出来る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4.2 Binary CGM caveats

YorickのバイナリCGMは全てのANSIコンピュータ グラフィックス メタファイル 標準の推薦を満している。不幸にして、この標準は非常に時代がかったもの である。PostScriptと違い、CGM標準は、そのインクがそのページの何処に 行かねばならないかを指定しないので、CGMを解釈する各プログラムで描くと 各々が幾らか異った絵になる。その絵の絶対的な倍率を実行するに従い、 フォントと線分書式は大きく変る。Yorickの配布ではバイナリCGMブラウザgistを 含んでいる(GistはYorickの画像パッケージの名前である)。gistブラウザは Yorickが生成したバイナリCGMをYorickが生成するのと全く同じPostScript ファイルに変換する。他のCGMブラウザは同じ事が出来ない。

Yorickは歴史的な理由からCGMを提供している。貴方がgistブラウザを使うのが 好きでもない限り、直接PostScriptファイルを書くべきである。 もし、貴方が沢山の絵の書庫を作りたければ、同値なCGMよりもPostScript ファイルは遥かに大きくなる事に気付くかもしれない。しかしながら、 (GNUプロジェクトからのgzipの様な)標準的な圧縮ソフトウエアは バイナリのCGMデータに対するよりも、PostScriptファイルのテキストで遥かに 良く動作し、それが大きさのdiscrepancyの大半を打ち消してしまう。

もし、貴方が画像を書庫ファイルにする事に真剣であるのなら、貴方は、 画像ハードコピーファイル以上に、その画像を生成する為に貴方が用いた Yorickのプログラムも加えた生データを書庫にする事を真剣に考えるべきである。 しばしば、これは画像ファイルよりも遥かに小さくなり、その上、貴方が後に 描いた実際のデータを再度覆う事も可能であると云う測り知れない長所がある。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4.3 Encapsulated PostScript

もし、貴方のシステムがGNUプロジェクトのghostscriptプログラムがあれば、 貴方はカプセル化されたPostScript(EPS)ファイルをYorickのPostScript出力 から生成する為に使う事が出来る。Yorickのeps命令はこれを実行する。 而し、それはYorickをghostscriptを起動する為にforkするので、もし、 Yorickが大きなプログラムとなっていれば、良い考えではない。 (Yorickの配布に含まれているgistブラウザは劣ったEPSファイルを作る事が 可能である。つまり、貴方は必要であればgistを使ってepsを変えられる。) 貴方の画面上で望む絵を見たい時、次を入力すると:

 
eps, "yowza"

`yowza.epsi'と呼ぶ、その絵を含むEPSファイルを生成する。 もし、貴方がYorickをforkしたく無ければ、貴方はまたhcps命令も使える。 これは現在の絵を丁度含むPostScriptファイルを生成する; 貴方はそこで、EPSファイルにこれを変換する為に、手動で、ps2epsiを実行する 事が可能である。

FrameMakerやxfigの様なページレイアウトプログラムはYorickで生成した EPSファイルを取り込む事が可能である。貴方はそこで、Yorickのグラフィックス の大きさを変更し、他の文章やグラフィックスを置いたり、その上、 貴方が描いた者を指し示す為の矢印を置く為にレイアウトプログラムを用いる事 が可能である。、これは、Yorick出力から印刷品質のグラフィックスを生成する 最も簡単な方法であるが、ページレイアウトプログラムは常により良い グラフィカルユーザインターフェイスを持っている -- それらは以前、Yorick よりもページレイアウトに関しては良いままであるだろう。

高品質出力の為に私が進める設定はこれである:

 
func hqg(onoff)
/* DOCUMENT hqg
            hqg, 0
     turn on and off high quality graphics output.  You should
     refrain from using plot or axis titles; add them with your
     page layout program.  You will also need to distinguish
     curves by means of line type as hq turns off alphabetic
     curve markers.
   SEE ALSO: eps
 */
{
  if (is_void(onoff) || onoff) {
    window, style="vg.gs", legends=0;
    pldefault, marks=0, width=4;
  } else {
    window, style="work.gs", legends=0;
    pldefault, marks=1, width=0;
  }
}


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.5 Graphics style

Yorickは沢山の数値パラメータによってregulatedなモデルに対して、 グラフ出力の各頁を整形する。これらの変更の大半は殆ど無い -- 貴方が貴方に適したグラフィックス形態を見付け出したければ、 沢山の描写に対して、それで竿刺す事になる。Yorickは低い階数に対して、 スタイルの助変数をdemoteする;それらは内部的に、plot limitsや対数目盛の 様な殆どの緊急の項目よりもアクセスし難い。(gridxy函数は例外である -- それはYorickがトリックをどの様に描くかを決定する形態助変数を変更するが、 比較的単純なインターフェイスを持っている。)

新しい形態を設計する事は、忍耐、重労働、そして複数の繰返しを要求する。 例題としてYorickの配布に附属する(Y_SITE+"gist"の代りの) `*.gs'ファイルを使い、貴方自身の設計の拠点を開始しよう。 次の節は様々な形態助変数の意味を理解する助けとなるだろうが、 私は実際の設計を通じて貴方を導こうとはしない。Yorickの前もって定義 されたグラフィックス形態で通常は十分である。

3.5.1 Style keyword  Accessing predefined graphics styles.
3.5.2 `style.i' functions  Bypassing predefined graphics styles.
3.5.3 Coordinate systems  Multiple coordinate systems.
3.5.4 Ticks and labels  How to change them.

3.5.1 Style keyword

グラフィックス形態は通常ファイルから読み込み、そのファイルを貴方は window命令に対するstyle=キーワードで読込む。Yorickの配布は 幾つかの形態ファイルが付随する:

`work.gs'ファイルはデフォルトの形態で、私自身の設定(preference)である。 多くの人が、他のグラフィックスパッケージ(baaa baaa)の様に見える `boxed.gs'形態を参照する。。@fiile{vg.gsファイルは "viewgraph graphics style"向けのもので、それは私が高品質グラフィックス向け の出発点として薦めたものである。`vgbox.gs'形態も同様にある。 `axes.gs'形態は視野の中心を通る目盛を持った座標軸を持ち、 多くの基礎的な数学の教科書の形態に似たものである。`nobox.gs'形態は 目盛、ラベルや他のdistractionsを持たないものである;幾何学的な像を描いたり、 写真を模擬したりする為に用いる `work2.gs'と`boxed2.gs'形態は変種で、それは、描写の右手側上の 目盛とラベルの第二種類を設定するもので、それらは左側とは独立している。 (これは少しYorickでは退屈であるが、もし、貴方が本当にそれを必要とするので あれば、それが、貴方が得ると考えられている方法である)。 最後に、`l_nobox.gs'はランドスケープ方向でのnobox形態の変種である; 全ての他の形態はポートレート方向を与える。

For example,

 
window, style="nobox.gs"

はnobox形態に切り替える。これは現行の表示リストを消去する: 新しい形態は貴方の次の描写で効力を持つ。もし、貴方が幾つかの異なった ウインドウを持っているのであれば、それらは異なった形態を持っていても良い; 各ウインドウはそれ自身の形態を持ち、丁度、それがそれ自体の表示リストを 持つ様なものである。

形態ファイルはY_SITE+"gist"ディレクトリにある;そのディレクトリに あるファイル`work.gs'は、配布形態ファイルの貴方自身の変奏をどの様に 記述すれば良いかが分かるに十分な註釈が含まれている。貴方は共用ディレクトリ 或いは`~/Gist]と呼ばれる私用ディレクトリの何れか、或いは、 Yorickのカレント作業ディレクトリに、それらを見付ける為に、style=キーワード を有向にして、様々な変奏を置く事が出来る。

3.5.2 `style.i' functions

もし、貴方がグラフィックス形態の詳細をYorickのプログラムから制御する 必要があれば、貴方はライブラリファイル`style.i'を包含する事が可能 である:

 
#include "style.i"

これはYorickのグラフィックス形態モデルの全ての詳細を定義、変更する事が 出来るget_styleとset_style函数を定義する。函数read_styleとwrite_style はstyle=キーワードで使われる書式の文書ファイルを読んだり書き込ん だりする。

3.5.3 Coordinate systems

大半のYorickのグラフィックス形態は単に一つの座標系のみを定義する。 言い換えれば、貴方のデータの全体座標系と、紙や画面のシート上での正規化 されたデバイス座標系(NDC)との間の単変換がある。

全体-NDC変換は貴方のデータのx-yの限界を視界(viewport)と呼ばれるNDC空間の 長方形に写す。通常、Yorickは視界の外側にある貴方のデータの如何なる部分も 表示しない。しかし、貴方がYorickに、plsys命令を用いて如何なる変換も無しに 生のNDC座標を描かせる事が可能である:

 
plsys, 0

で、Yorickに後続の描写プリミティブからのデータを変換しないようにする。 貴方が"system 0"に対して描く時、貴方のデータは視界から切捨てされない だろう。NDC座標では、8.5×11の紙のシートの左下隅は常に(0,0)で、 0.0013NDC単位が丁度フリンターの1ポイント、即ち、1/72.27吋になる。

貴方は描写のデフォルトの"system 1"に次で戻せる:

 
plsys, 1

そのfma命令はまた副作用として"system 1"に戻る切替を行う。 window命令によるウインドウの切替では、貴方がつい最近描いた座標系を 設定する。もし、貴方がplsysを函数として呼出したのであれば、それは古い システム番号を返す事に注意しよう。つまり、current_window函数を用いても、 貴方は新しい、他の何処で何かを実行する様な函数で、貴方が以前居た場所なら 何処でも、そこに戻すものを記述可能である。。

貴方の画面上のウインドウと8.5×11吋の紙面との間には特定の関係がある 事を思い出そう:見えている画面ウインドウの左下隅はNDCでは常に(0,0) ではない。ポートレートモードでNDCポイント(0.3993,0.6342) -- 或いは ランドスケープモードで(0.5167,0.3993) -- はそれの大きさをどの様に 変更しようと、貴方の画面ウインドウの中心のままである。 (ポイントは吋に関してより意味がある:(4.25,6.75) -- 水平側の中心で、 ポートレイト方向の紙上で等しい個所、そして、(5.50,4.25) -- ランドスケープ方向の紙上中心)。更に、画面の大きさは常に75dpiか100dpi、 即ち、各々NDC単位あたり798.29画素かNDC単位あたり1064.38画素である。

(私はヨーロッパ圏の利用者に対して、A4サイズの紙に関してはっきりと 予見しなかった事に謝罪する。もし、Yorickのeps命令を重要で、高品質な 出力に使うのであれば、その頁の位置は問題ではない。荒いドラフトや、 作業表示については、YorickがA4サイズの紙で中心から外れた絵が、 貴方を深く傷つける事が無い事を望んでいる。一吋は偶然、2.54cmである)。

貴方は複数の全体座標系を持ったグラフィックス形態を生成する事も可能である。 例えば、2×2の配列で貴方一つのウインドウ内で、四個の視野を持った形態 が定義出来る。もし、貴方の形態が一つの座標系以上を持っていれば、以下を使う:

 
plsys, i

これで、それらの間の切り替えを行う。ここで、iは0、1、2、貴方の形態にある 座標系の番号である。各座標系はそれ自身のlimits,logxyとgridxyパラメータを 持つ。しかしながら、全てのウインドウの系は単一のパレットを共用しなければ ならない(多くの画面は、貴方が一つの絵に必要とする以上の色を兎に角持って いない)。limits,logxyとgridxy命令は"system 0"では無意味である。と云うのも、 そこには座標変換が無いからである。もし、函数として立ち上げられた場合、 plsysは現在の座標系を返し、それは他の系で何かを実行する事を許容するもの である。それから、元の系の再設定を行う。

会話的利用では、私は複数座標系ではあまりにも混乱する事が判っている。 その代わり、私が同時に幾つかの絵を見る必要があれば、複数のウインドウを 立ち上げる。非会話的利用では、貴方はYorickの絵を分離し、それらをeps命令 で保存し、それから、それらを結合する為のページレイアウトプログラムに バラバラの片として流し込む事を考えるべきである。

3.5.4 Ticks and labels

視点位置、目盛の表示等々をregulateしている形態助変数は、非常に直截的で ある;貴方は、どの視点の四方向が目盛を持ったりするかを指定可能であり、 又、座標軸と目盛が視界の中心を通る"軸"形態を選択出来る。 目盛は視界の内側や外側、或いは両方に延長出来る(視野に射影する目盛は しばしば解釈するのが困難になる様に貴方のデータを隠蔽する事に注意しよう)。 貴方は視界の周囲の枠を描く事、或いは、貴方の絵に目盛付きの枠を残す事が 可能である。貴方は視界の四隅の任意の目盛に数値ラベルや、目盛からラベルへの 距離、ラベルのフォントと大きさ等々が指定可能である。

或る綿密に人工的知能(或いは愚かな)アルゴリズムは An elaborate artificial intelligence (or stupidity) algorithm determines tick and label positions. 四個の助変数がこのアルゴリズムを制御する:nMajor,nMinor,logAdjMajorと logAdjMinorである。目盛は長さの階層を持つ。私が呼出す最も長い目盛; (もし、ラベルをonにしていれば)数値ラベルが付いた目盛がある。 定規上の物指の様に、更に、より短かい目盛の階層がある。その階層での 各水準は二つ或いは五個の部分へ次のより高い水準間の区間を分割する。 もし、その上の区間が少なくとも十進数1或いは2の太さであれば二つ、 もし、その十進数が5であれば五個になる。

唯二つの疑問が残る:私が大目盛として用いるべき区間は何で、どれだけ私は 階層を降りなければんならないのか? nMajorとnMinor助変数がこの問題の答 である。それらは、その階層での最大と最小の目盛の上限を各々次の様に 指定するものである:目盛の区間は最小の区間で、その区間に対する区間全体 の比はnMajor(或いはnMinor)よりも小さい。太さが少なくとも1、2或いは5目盛より 小さな大目盛区間だけが考えられている(その他は、アルゴリズムの残りで失敗する)。

log目盛で二つの捩れを追加する:最初のものは、もし、ある十進数が存在した 場合、私は他のものよりも長く10目盛を入れる。例え、最初の小目盛の水準が 数値ラベルを得るのに十分離れていなかったとしても。 もし、各10以内の目盛があったとすれば、私は、その10を3個の副区間に分割する -- 1から2、2から5、そして5から10に -- それから、指定された密度で、3個の 副区間の各々に収まる様に目盛を選択する線形物指アルゴリズムを用いる。 目盛密度は、各副区間内で殆ど2.5の因子で変るので、線形アルゴリズムは 全く上手く動作する。 貴方は対数物指でより密な目盛を、線形物指上で見るものよりも期待する。 だから、副区間に対してそれらを用いる前に、logAdjMajorとlogAdjMinor によるnMajorとnMinor密度を掛ける。

最後の機能(caveat): 水平方向軸での長い数値ラベルは、もし、その目盛の密度が 非常に高くなると、各々重ねても良い。これは、貴方がそれらのラベルに許容する フォントの大きさと十進数値の大きさに依存し、それらの両方は形態助変数である。 この面倒な事を回避するグラフィックス形態の設計は簡単ではない。

3.6 Queries, edits, and legends

Yorickは、貴方が現行の表示リストを尋ねる事と線の種類、幅等々の助変数を編集 する事を許容する。私は通常、単に正しい値で新しい絵を描く事を選択する; 現状の低水準編集命令は、高水準のメニュー操作編集システムへの基となる 事がより望ましい。

3.6.1 Legends  Setting plot legends.
3.6.2 plq and pledit  The plot query and edit functions.

3.6.1 Legends

全ての描写原始的函数はlegend=キーワードを貴方がその対象を記述している 銘文を設定する事を許容する事を受入れる。 もし、貴方がlegend= キーワードを提供しなければ、Yorickは自動的に 命令行のportionを繰返す事でデフォルトを提供する。例えば、

 
plg, cos(x), x

はデフォルトの銘(legend)"A: plg, cos(x), x"を持ち、この曲線の印が "A"であると仮定している。貴方はより記述的な銘をlegend= キーワードを使って指定可能である:

 
plg, cos(x), x, legend="oscillating driving force"

もし、貴方がprependされた曲線の印を持たせる為にlegendを望むのであれば、 もし、曲線の印が"A"であれば、"A: oscillating driving force" となり、もし、曲線の印が"F"であれば、 "F: oscillating driving force"となり、貴方がlegend文字列を、 特殊文字"\1"で始める事が出来る:

 
plg, cos(x), x, legend="\1: oscillating driving force"

legendsの様に、貴方はmarker=キーワードで、曲線刻印文字を指定する事が出来るが、 もし、そうしなければ、Yorickは描かれた沢山の曲線に基づいて、値を指定する。 デフォルトで、Yorickは曲線の頭に刻印文字を一度描く -- Aの刻印は曲線A、 Bの刻印は曲線B等々となる。これは単にplgとplc命令との類推である。 このデフォルトの形態は醜い;それを作業中の表示に用い、仕上のグラフィックス には用いない。貴方は高品位グラフィックス向けや、線の種類で曲線を分類する 場合はmarks=0キーワードで刻印をoffにすべきである。 例えば、

 
plg, cos(x), x, marks=0, type="dash",
  legend="oscillating driving force (dash)"

スクリーンスペースを保つ為、legendsは決して貴方の画面に現われはしない; それらはハードコピーファイルのみに現われる。更に、グラフィックス形態に 依存して、legendsはハードコピーの両方に現われてはならない。殊に、 `vg.gs'と`nobox.gs'形態はlegendsを持たない。これは、legendが醜い からである。legendlsは描写中に適切な絵の註釈を設置する。高品質出力向けでは、 適切な註釈を追加する事で問題が生じるだろう。貴方は、それらが通常現れる グラフィックス形態からさえも、legendを消す為に、window命令に対する legends=0キーワードが使える。

3.6.2 plq and pledit

貴方のlegendsを見たい時は何時でも、次を入力出来る:

 
plq

貴方が発行した任意のplotting primitiveに関して、貴方はplqリストの中の その添字を指定する事で、そのキーワード全ての値を見付ける事が出来る: (基本的なplq命令はこの添字を表示する)

 
plq, 3

plc命令に関しては、各等高線は折線である;貴方は、plqに第二添字引数を 追加する事で、各々の水準を見付ける事が出来る。

貴方はまた、Yorickプログラムで、現行の表示リスト成分の表現を返す 為の函数としてplqが使える。

丁度、plqで現行の表示リストが調べられる様に、p_editで、それが編集出来る。 貴方はplq命令での添字(或いは、特定の等高線水準に対し、二つの添字)、 それから、貴方が変更したいキーワードを一つかそれ以上を指定する。 これは線の種類や幅を変更するには時折便利である。メニューやダイアログの類 を使って、plqやpledit結合するより簡便なユーザーインターフェイスを構築して も良い。

3.7 Defaults for keywords

pldefault命令で、貴方はwindow命令と原始的な描写命令の沢山のキーワードの デフォルト値が設定出来る。これらのキーワードは、plg,plc,plmとpldj命令での 線の種類、幅、色、新規に生成されたウインドウの形態とdpi、そして、 グラフィッスウインドウと対象の他の属性を制御する。

貴方はpldefaultを、本格的に描いて行く前に、デフォルト値を会話的に、 新に、但し、便宜的に設定する為に使える。或いは、貴方が個人的にYorickの デフォルトと異った初期設定をしたいのであれば、pldefault命令を貴方の `~/Yorick/custom.i'に置いても良い。

貴方は@kbf{dump='やps=キーワード向けの値を設定するhcp=file命令を 用いなければならない(それらのキーワードは、ハードコピーファイルにパレット を吐き出すかどうか、そして、自動的に生成されたハードコピーファイルを PostScriptかバイナリ(CGM)にするかどうかを決定するものである)。 そして、それらの設定は、貴方が明示的にそれらを変更しない限り、効力は そのままである。

例えば、もし、貴方が印無しの太い線分となる`vg.gs]形態を用いる事を 望み、そして、各枠に対して(デフォルトで)パレットを含んでいるPostScript ファイルを望むのであれば、貴方の`custom.i'ファイルに次の二つの行を 追加しても良い:

 
pldefault, style="vg.gs", marks=0, width=4;
hcp_file, dump=1, ps=1;

pldefaultを用いて設定した値はtrueがデフォルト値である -- 貴方は ウインドウや描写プリミティブに対する各々の個別呼出しについては、 それらを書換えても良い。しかし、そのデフォルト値は、貴方が pldefaultを二度呼出さない限り、そのままである。逆に言えば、貴方が hcp_fileを使って設定したdump=ps=値を臨時に上書きする事は 出来ない -- 貴方はそれらを新しい値で設定しなければならない。

3.8 Writing new plotting functions

貴方は描写原始函数の一つで直接提供されていない何かを描きたくなるかもしれない。 通常、その様な作業を実行する為に、貴方自身の描写函数を書く事が可能である。 例題として、点(x,y)の系列を滑かな曲線で結ぶ代りに、貴方が垂直な線分 で繋げられた、yの各値で水平な線分で繋げられた線を描きたかったとする。 (これは、New York市のスカイラインとの類似からManhattanプロットと時々 呼ばれるものである)。

貴方は即座に、ヒストグラムを描く事を実行し、 You quickly realize that to draw a histogram, you really need the x values at the vertical segments. この函数は次の様なものである:

 
func plh(y,x)
{
  yy = xx = array(0.0, 2*numberof(y));
  yy(1:-1:2) = yy(2:0:2) = y;
  xx(2:-2:2) = xx(3:-1:2) = x(2:-1);
  xx(1) = x(1);
  xx(0) = x(0);
  plg, yy, xx;
}

配列xは配列yよりも一つ成分が多くなければならない事に注意しよう; そうで無ければ、xxに対する割当操作は適合性を欠く為に失敗する。

より洗練された版はplg函数によって受け取られたキーワードをplhに引き渡す 為の呼出しに対する可能性を包含している。又、水平な線分の代りに鉛直な線分 で描写を開始、終了する為に、貴方は、yよりも一つ多いxの代りに、xよりもyが 一つ成分が多い様にする事を望んでも良い。 ここで、より複雑なplhの版は:

 
func plh(y,x,marks=,color=,type=,width=)
/* DOCUMENT plh, y, x
     plot a histogram (Manhattan plot) of Y versus X.  That is,
     the result of a plh is a set of horizontal segments at the Y
     values connected by vertical segments at the X values.  If X
     has one more element than Y, the plot will begin and end with
     a horizontal segment; if Y has one more element than X, the
     plot will begin and end with a vertical segment.  The keywords
     are a subset of those for plg.
    (日本語訳
     Xに対するYのヒストグラム(Manhattan plot)を描く。即ち、plhの結果は
     X値での垂直な線分で繋げられたYの値での水平な線分の集合である。
     もし、XがYよりも成分が多ければ、表示は水平な線分で開始し、そして終る;
     もし、YがXよりも成分が多ければ、表示は垂直な線分で開始し、そして終る。
     キーワードはplgのものの部分集合である。
    )
   KEYWORDS: marks, color, type, width
   SEE ALSO: plg
 */
{
  swap = numberof(x)<numberof(y);
  if (swap) { yy = y; y = x; x = yy; }
  yy = xx = array(0.0, 2*min(numberof(y),numberof(x)));
  yy(1:-1:2) = yy(2:0:2) = y;
  xx(2:-2:2) = xx(3:-1:2) = x(2:-1);
  xx(1) = x(1);
  xx(0) = x(0);
  if (swap) { y = yy; yy = xx; xx = y }
  plg, yy, xx, marks=marks, color=color, type=type, width=width;
}

解釈された言語のポイントは、貴方自身の必要性に適合したユーザー インターフェイスに簡単に替えられる事である。多種多用な利用者への インターフェイスの設計は、貴方自身の利用向けのそれの設計よりも遥かに 難しい。(その最初のplhの版は貴方自身の利用には適合しているかもしれない; 公衆に対しては、第二版よりも小さなものをリリースする気は毛頭無い)。 貴方のルーチンを文書註釈を介してYorickのhelp命令に繋げる事は、 たとえ、それらを使う貴方自身以上に他の誰もが期待していなくても、 有用である。公衆インターフェイスルーチンは常に文書註釈を持っているべき である。

3.9 Animation

Yorickの通常の描写命令では貧弱な動画を作る。貴方の画面上に良い動画を 作る為には、貴方はより多くの資源が必要となる -- そのアイデアは その絵をoffscreenメモリに最初に描き、それから、即座に全体のコマを表す為に 速い複製操作を用いる。

animate命令はoffscreen pixmapを生成し、ここでのレンダリングルーチンに リダイレクトし、そして、offscreenからonscreenへの複製を実行する様に fma命令を修正する。第二のanimate命令で通常の操作モードに戻る。

通常の会話的作業向けには動画モードが使えない。何故なら、貴方は fmaを使うまで、貴方の絵を見る事がないからである。典型的に、貴方は 動画モードに入り、映画のコマを生成を繰返し、それから動画モードから 抜けるYorick函数を書く必要がある。次の包含によって、高水準の 動画インターフェイスを使おう

 
#include "movie.i"

この包含の後に、貴方はそのmovie函数が使え、貴方にとって、 低水準アニメーション函数をそれで管理出来る。貴方は(movieへの引数として 引き渡された)函数を書く為に必要なだけである。この函数は貴方の動画でn番目 のコマを描き、もっと多くのコマはあるかどうかを答えるフラグを返すものである。 貴方は通常の非動画モード(non-animation mode)で、一度に一コマ、この函数の 構築と検査が簡単に行える。動画の作り型についてもっと学びたければ、 Yorickの配布に付随している`demo2.i',`demo3.i'と`demo5.i' と云ったデモプログラムを調べよう。

3.10 3D graphics interfaces

貴方は貴方自身のグラフィックスインターフェイスを生成する為に、Yorickの グラフィックスのプリミティブを結合出来る。Yorickの配布には、 この方法で組み立てられた、単純な3Dグラフィックスインターフェイスが含まれ ている。もし、どの様にしてこれを行うのか例題が必要になれば、 `pl3d.i'ライブラリファイルを調べよう。

3D函数にアクセス出来る前に、貴方は`plwf.i'かslice3.iのどちらか を包含しておく必要がある。これらは高水準の3Dインターフェイスを提供する ものである。`plwf.i'インターフェイスで、三変数スカラー値函数の isosurfaceと切断が描ける。Yorickの配布に含まれるデモンストレーション プログラム`demo5.i'は両方の例題を持っている;それらがどの様に動作 しているかの詳細を見る為には、それを調べよう。

3.10.1 Coordinate mapping  Changing your viewpoint.
3.10.2 Lighting  The 3D lighting model.
3.10.3 gnomon  Gnomon indicates axis orientation.
3.10.4 plwf interface  The plot wire frame interface.
3.10.5 slice3 interface  The slice and isosurface interface.

3.10.1 Coordinate mapping

貴方が観ている絵は常に二次元なので、貴方の画面上に三次元物体を投影する 必要がある。貴方がこの射影的写像を、描写命令を再度実行せずに、2Dのlimits 命令を用いたのと同様に変更が出来る様に、この3Dインターフェイスを設計 している。

limitsの代りに、貴方は射影を指定する必要がある。貴方の画面がカメラの image planeだと考えよう。このカメラは貴方の顔面に対して+xが右方向側、 +yが上方向側、+zがその画面から外れる様な座標系を導入している。 貴方のworld座標系 -- 貴方のデータの座標系であるが -- はこれらのカメラ 座標系に関係する向きを持っている。貴方の全体座標系を回す事が出来る -- 更に、貴方が描いた対象を回して観られる -- これはrot3かorient3命令 の何れかを用いる。

rot3の三引数はそのカメラのX,Y,Z軸での回転する為に角度(弧度法)である。 これらの3個の回転は、最初にX軸回り、それからY軸、そしてZ軸回りの順番で 適用される。省略されたり、nil引数であれば、0引数を与えたのと同じである。 3D回転は可換操作で無いので、もし、貴方がZ軸回りの回転を最初にし、それから X軸回りの回転を行いたければ、貴方は二つのrot3命令を実行しなければならない (limitsやlogxyが変更する様に、rot3も蓄積を変えるので、Yorickは貴方の 画面で一度だけ書換える):

 
rot3,,,zangle; rot3,xangle

orient3操作はrot3よりも一般性が無く、それ故に、使い易い。 orient3を使うと、貴方の全体座標系のZ軸はカメラのY軸に並行に射影される。 だから、Zは常に貴方の画面上方に描かれる。orient3の最初の引数は全体座標系 のZ軸回りでの回転角度で、全体座標系のX軸はカメラのX軸に対して回転する事 になる。orient3の予備の第二の引数はカメラのY軸から全体座標系Zへの角度で ある -- つまり、貴方が画面下を眺める際の角度である。 一度設定すると、下方眺望角度は貴方が再設定するまでそのままである。 引数無しなら、orient3は標準の向きと同じものを返す。次の様に入力が出来る:

 
orient3

そうする事で、貴方の画面の標準の視野に戻せる。

rot3と違い、orient3の結果は非可換である。各orient3の呼出しで、貴方は 完全に貴方の対象の向きを指定する。だから、もし、貴方がorient3で対象の 向きを設定したのであれば:

 
orient3, -.75*pi

それから、貴方はそれを少し捻じった位置を望めば、貴方は少し異った orient3命令を実行する事になる;
 
orient3, -.70*pi

もし、rot3命令であれば、

 
rot3,, -.75*pi

これが今一つであれば、貴方は小さな角度を指定して少し捻じってみたくなる:
 
rot3,, .05*pi

不幸な事に、その射影の向きは、単に、任意の回転行列の3個の角度 より複雑であるカメラ(即ち目)から、その対象への距離もまた記録する。 デフォルトで、貴方は無限遠に離れており、無限遠の拡大倍率レンズを通して 眺めている。これは等長射影と呼ばれる。と云うのも、全体座標系で等しい 長さの並行な線分は、そのカメラが近付こうが、離れようが、貴方の画面上で 等しい長さとなるからである。。もし、貴方がperspectiveな絵が欲しければ、 貴方のカメラ(即ち目)が置かれているカメラ座標系でのz値を設定する為に、 setz3命令が使える。

貴方のデータの中にカメラを入ようと思い悩まない事;それは修正してはならない。 非常に高度な魚眼perspevtiveは貴方の科学的なデータをより判り易いものには しない。カメラを貴方の対象の外に保とう。

貴方のカメラは常に-Z方向を向いている。最初に、標的点はカメラ座標系の 原点であるが、貴方はaim3函数でそれを任意の他の点に移せる。もし、貴方が 全体座標系で標的点を指定したければ、move3函数を用いよう。それはrot3と 類似している。

一般的に、貴方はnobox.gsグラフィックス形態を用いる。何故なら、2D座標軸 は有用ではないからだ。等長表示では、2D(x,y)軸は貴方の(x,y,z)全体座標系の 単純な射影である。perspective表示に関しては(setz3を呼出した後)、2D(x,y) 座標は、カメラz軸と貴方の対象上の点との間の光線角のtangentとなる。 2Dのlimits命令は貴方の視界のcroppingや調整に便利だが、square=1 キーワードをoffにすべきではない。

函数save3とrestore3は保存を行い、そして、後で、rot3やorient3,mov3,aim3とsetz3 の効果を含めて、殆どの3D座標系マッピングを復帰する。貴方はundo3函数を用いて、 これらの任意の階数の命令の効果を無効にする事も可能である。

3.10.2 Lighting

Yorickの擬似色モデルは共用されている色対象を記述する事が出来ない (貴方はその為には任意の色指定が可能な事が必要である)。それ故に、 もし、貴方が3D形状を示唆する為に陰影付けを行いたければ、貴方は、 白黒(或いは任意の単色 -- 陰影付けに関し、`heat.gp'パレットは `gray.gp'と同様に動作する)に定住しなければならない。

貴方はまたより多くの変数に考え悩む必要がある -- つまり、その位置と 貴方の対象を輝かせる任意の明りの相対的な輝度である。 貴方は、光源の初期設定でlight3函数を呼出す。

貴方の対象を構成する三次元曲面(`plwf'に対してplfかplfpで描かれている) は多くの多角形面で成り立っている。Yorickは多角形面に対する3Dの法線ベクトル (非平面的に対するもので、その方向はある程度任意)を割当てる。 貴方が呼出したlight3によって設定された照明モデルは曲面の明るさに対して、 法線方向に写す。もし、その面が向き付けられていて、貴方のカメラ側に直接 貴方の光源の明かりを反射する様になっていれば、その面はより明るく見える。

この反射の輝度モデルの関数的な書式は(1+cos(alpha)^nで、 ここで、alphaは、その面の中心を眺めた時の、貴方のカメラと光源との 角である。貴方は羃のnを調整出来る。大きなnで磨かれた金属の外観となる; 小さなnで硫黄の様な外観となる。望むだけの多くの光源を指定する事が出来る。 しかしながら、光源は全て無限遠の彼方にある。また、各々の光源に異なったnを 指定する事が可能であるが、異なった曲面や曲面の部分に対して異なった値のnを 指定出来ない。

これらの光源の輝度に加え、貴方は分散光も指定可能である。このモデルでは、 曲面の輝度は単純に貴方の視界方向に対する角度の余弦に対する単純な割合 である。従って、貴方が眺める曲面が最も明るく、眺められている稜線は、 最も暗い(limb darkeningと呼ばれる効果である)。

これらの効果の全てはlight3函数のキーワードで制御される:specular function: specular (光源の輝度), sdir(光源に対する向き), spower (光源に対するn乗), diffuse (分散光源の輝度)とambient (全ての追加の輝度)。light3函数は値も返す。その値は、以前の照明の設定を 蓄える為に、後の呼出でそれに引き戻す事が可能である。

これらの照明モデル -- これらは実際に、貴方が大半の3Dグラフックスパッケージ で見掛ける標準的なモデルである -- は殆ど、実際の全体の光景の見栄えに 対応しない。これらは陰も無く、曲面にはintristicなテクスチャも無い。 貴方の目的はわくわくする事であって、リアリズムではない。

3.10.3 gnomon

gnomon函数を用いて、gnomonをonやoffに切り替える。gnomonは全体x,y,z座標軸 に対して並行な三次元直交線分の射影である。文字x,yとzは、線分の末端近くに 現われる -- 白地に黒字で、その線分はその画面の外を刺しており、黒地に白は 画面内部を意味する。

関連する函数はcage3で、これは3D座標軸をonやoffにする。篭(cage)は 貴方の対象を囲む長方形の箱で、典型的な2D描写の3Dの類推として、稜線には 目盛がある。(勿論、2D描写とは異なり、貴方の絵で、ある点の座標を描き出す 為に、篭の回りの目盛を実際に使う事の出来る方法は無い)。 篭の面はlimit3函数で設定された平面にある。plwf函数は自動的に 合理的なextremeな値で、limit3を呼出すが、pl3tree函数に関しては、貴方自身 が limit3函数を呼出す必要がある。2Dのlimits函数と異なり、limit3は その篭の縦横比が設定出来る;デフォルトのcage3は貴方のx,yとZ座標を拡大して、 その篭の稜線が同じ長さで現れる様にする。

3.10.4 plwf interface

plwf plotはplfやplc plotと同様の情報を含んでいる。即ち、plwfは、 plfやplcが地図を見る様なものとすれば、山の頂上から風景を眺める風になる。 (貴方がvista pointに立っているとすれば、貴方が見ている"本当の"光景を 同定し、理解する為には、地図を使うかな? 不案内な場所を通じて、貴方は 誘導する為に、貴方はそのvistaの写真か地図を持つのじゃないかな?)

plcの様に、plwfはquadrilateral網目上のz値 Like plc, plwf needs point centered z values on a quadrilateral mesh. xやyの単位に対するzの単位に対応する拡大因子はキーワードを通して指定しても 良い;もし、そうでなければ、xとyの値域の半分の大きさのz値の値域になる様に、 plwfは拡大率を選ぶ。他のキーワードで、貴方は、メッシュの線が描かれるや否か、 そして、曲面自体が光景の照明に対して陰影付けられるかどうか、或いは、単純に 背景色だけを残すのかどうかが得らべる。(後者の選択はplotのワイヤーフレームで の事の結果で、これはplwfのwfである。)

3.10.5 slice3 interface

slice3函数は、対称的に、平面的な断面、つまり、三変数函数の等高面を生成する。 貴方はその平面的切断を擬似的に色付けしたり、或いは、等高面の射影を見せたり、 或いは、切断を等高面に結合したり出来る。plfp函数は実際に画像を生成するが、 より高水準の函数、pl3treeを呼出す。

plwfと異なり、何かを描く為に、貴方は少なくとも二つの函数を呼出さなければ ならない。第一に、slice3dを呼出す。このslice3dは貴方の3Dデータの平面的切断か、 貴方の3Dメッシュ上のあるスカラー函数の等高面の何れかを返す。 次に、貴方の3D表示リストに切断か等高面を追加する為に、pl3treeを呼出す。

再度、Yorickの擬似色彩モデルでは、部分的に透明な曲面を許容しない。 屡々、貴方は内部を見る為に、メロンの様に閉じた等高面を切開く必要がある。 この様に切断を作る為にはslice2とslice2xを用いよう。不幸にして、貴方が 曲面内部を見える様にする為の断面を取り除くと、貴方は単に見る方向の制限 された値域から貴方の切断を通して見る事が出来るだけである。 つまり、切断平面は貴方の見る方向に依存する。この種の絵をどの様に作るか と云った例題として`demo5.i'を研究しよう。

ある技法で、(2D plfやpliの様に)貴方の両方の切断に色付けと貴方のisosurface の陰影付けの両方が、擬似色彩モデルの制限にもかかわらず、行える。 そのアイディアはisosurfaceの陰影付けに用い、擬似色彩切断に対して貴方が 使える色パレットが後に続く、グレースケールに貴方のパレットを分離する 事である。`slice3.i'にて分離したパレットルーチンは、その様な分離した パレットを生成する。再度、`demo5.i'の詳細を読もう。

4. Embedding Compiled Routines Inside Yorick

貴方自身のCやFortranのコンパイルされたプログラムを含むYorickのカスタム 版を生成する事が出来る。もし、貴方が注意深ければ、貴方のカスタム版は Yorickがインストールされている任意の場所へ容易に移築可能なものとなる。 可搬性の低いFortranではなく、可搬性のある言語のANSI Cで記述する事で、 貴方は可搬性の問題("貴方自身への将来不便さ"を読もう)を比較的容易 なものとする。

C++を使った私の経験では、その格律はANSIとFortranとの間の中間である。 貴方は、インタプリタが呼出すインターフェイスルーチン向けには extern "C"文を用いる事で、Yorick向けのC++のパッケージが記述出来る。

私はこれを勧めたりはしない。と云うのも、インタプリタ言語は第一に、C++での プログラム向けの数多くのモチーフを削除するからである。私はYorick向けの C++パッケージに関してこれ以上述べるつもりはない;そのアイデアは、 C++パッケージを含むYorick版を組み立てる為には`Make-cxx'テンプレートを 標準の`Maketmp'の代りに用いる事である。

もし、貴方がFortranを選択するなら、厳密なANSI Fortran77のサブセットに 竿刺そう。又、貴方のインターフェイスルーチンへ、入力を引き渡したり、 そこから出力を受け取ったりする事を試みてはならない。(これは可能である; もし、貴方がFortranのプログラムを楽しむのであれば、恐らく、そうする為の 可搬的な方法を考える事を楽しむだろう)。

FortranかCで記述するかどうかは、貴方のコンパイルされたプログラムで 如何なる種類のI/Oを実行しようとはしない。Yorick内部にルーチンを 埋込む事の全体的なアイデアは、Yorickに全てのI/O -- 文書とグラフィックス を扱わさせる事である。

次の議論では、私は3個のディレクトリを参照する:`Y_SITE'は Yorickの計算機環境に独立した部分があるディレクトリである; 実行時にYorickが必要とする全てのものはここにある。`Y_HOME'は カスタム番を構築するのに必要なライブラリと実行ファイルが蓄えられている ディレクトリである。`Y_LAUNCH'は貴方向けのYorickの実行ファイルを含む ディレクトリである。Yorickを動かす時、全ての3個のディレクトリ名は 変数として与えられる;例えば、yorickを起動し、そのディレクトリ名を 表示する為にY_HOMEと力しよう。又、私は単にUNIXプログラム環境 のみを議論するつもりである;現時点で、Yorickは任意の他のプラットホーム上 に拡張する事は易しい事ではない。

最初の段階は、Yorickの貴方固有版を構築する為のディレクトリを生成し、 CやFortranのソースとヘッダファイルを其処に置く事である。

次に、貴方はYorickの包含ファイル`my_start.i'を記述する必要がある。 これは、貴方固有のYorickを起動する時は何時でも読込まれるものである。 このファイルはYorickだけでは無く、貴方固有のものを作る時に、自動的 プログラム生成器Codgerによっても自動的に読込まれる。 Codgerはコンパイルされた対象(函数、大域変数、或いはFortranの common block)の一覧を生成し、それはインタプリタからも参照する事が可能である。 これそれはまた貴方のコンパイルされた函数を呼出す為のwrapper codeを、 貴方がこれを自分自身で行わないのであれば生成する。

この包含ファイル内部では:

 
extern my_func;
/* DOCUMENT my_func(input)
     returns the frobnostication of the array INPUT.
 */

my_funcをコンパイルされた函数で、書込に貴方が責任を持つ、 型がBuiltInのY_my_funcと繋げる。BuiltIn函数型の定義に関しては `Y_HOME/ydata.h'を参照されたい。 この函数は、`Y_HOME/ydata.h'で定義されたルーチンを用いている Yorickのインタプリタ スタックの引数をpopしなければならない。そして、 その結果をスタック上にpushする。函数YGet*はそのスタックを捕む; spがスタックポインタである。Globalize函数で、インタプリタに 対して名前で見える函数にアクセス出来る様にする;それらはglobTab にある。貴方はスタック上の値をpushする為に、Push*函数が使える; そうするに十分なスタックの余地が確実にあれば、CheckStackを使おう。

通常、貴方は全てのこれらの詳細を避けたい;codgerは自動的に`Y_my_func' を生成する事が可能である。これを実行する為には、PROTOTYPE註釈を貴方の 起動包含ファイルに入れておく:

 
func my_func(input)
/* DOCUMENT my_func(input)
     returns the frobnostication of the array INPUT.
 */
{
  return my_func_raw(input, numberof(input));
}
extern my_func_raw;
/* PROTOTYPE
   double my_func_C_name(double array input, long length)
 */

これは入力として単配列を取り、スカラー値の結果を返すC函数向けのwrapperを 生成する。もし、この函数がFortranであれば、この様になるだろう (Fortranは全ての引数を参照によって、即ち、それらが配列であるかの様に、 引き渡す。):

 
func my_func(input)
/* DOCUMENT my_func(input)
     returns the frobnostication of the array INPUT.
 */
{
  return my_func_raw(input, numberof(input));
}
extern my_func_raw;
/* PROTOTYPE FORTRAN
   double my_func_Fortran_name(double array input, long array length)
 */

PROTOTYPE註釈で、結果を返す函数に対し合法的なデータ型は: void (i.e. - サブルーチン), char, short, int, long, float,或いはdouble である。

RPOTOTYPE註釈での函数の助変数に対応する合法的なデータ側は: void(他に助変数が無い場合のみ),char, short, int, long, float, double, string (char *, guaranteed 0-terminated), 或いはpointer (void *)である。

これらはその型の配列を指し示す為に"array"と云う言葉に続いても良く、 それはCのソースでの"*"になる。その助変数の名前はオプションである。

DOCUMENT註釈は/* DOCUMENTで開始すべきである。 それらは解釈された命令help, my_funcで返され、Yorickの"mkdoc"命令 (`Y_HOME/include/mkdoc.i'を参照)によって生成された貧素な文書に 含まれる。

 
extern my_global;
reshape, my_global, datatype;

で、翻訳された変数my_globalをCのコンパイルされた同じ名前の 大域変数に繋げ、それは、データ型がdatatypeである(これは、 以前の構造体、或いは、原始的型の一つで宣言されていなければならない)。 もし、貴方がmy_globalが異なった名前の大域変数と繋げられる事を望む のであれば、次を使おう:

 
extern my_global;
/* EXTERNAL my_global_C_name */
reshape, my_global, datatype;

Fortranのcommon blockに繋げる為に、

 
	double var1, var2, var3
	common /my_common/ var1, var2, var3
	save /my_common/

(common blockが、それを使おうとする函数のスコープの外側に保存されない限り、 これは意味が無い事に注意しよう) 使い方は:

 
struct my_common_type { double var1, var2, var3; }
extern my_common;
/* EXTERNAL FORTRAN my_common */
reshape, my_common, my_common_type;

もし貴方が、倍精度、整数、そして、実数データを単一の共通区画に混ぜた場合、 貴方が全ての倍精度を最初に、続いて整数と実数を置くと云う任意のalignmentな 困難を持たない事が保証出来る。 もし、貴方それを実行しなければ、Fortranコンパイラ スイッチの存在に依存する。 それは、本当のdata alignmentを強いるものである -- ある計算機が何時の日にか、 これを持とうとしないだろう。

貴方の起動包含ファイル(或いは複数のファイル -- 貴方が望むのであれば幾つも 持てる)の頭付近で、貴方はMAKE-INSTRUCTIONS註釈を置かなければならない:

 
/* MAKE-INSTRUCTIONS
SRCS = src1.c src2.c src3.c \
       src4.c src5.f src6.c src7.f
LIB = frob
#DEPLIBS =
#NO-WRAPPERS
*/

この註釈では、四個のキーワードSRCS,kbd{LIB',DEPLIBSNO-WRAPPERSが認められる。貴方は\を行の末端に使って、 その次の行に続ける事が可能である。SRCSキーワードのみが、 mandatoryである。つまり、貴方はそれらを省略するか、それらをコメントアウト する為に#を前に置くかの何れかが、例題のNO-WRAPPERSと 同様に行える。

SRCSはコンパイルされた函数(そして、それらが呼出す任意の函数)を 構築する為に要求されるソースファイルの空行(space)で区切られたリストである。 このリストは二つの方法で用いられる:第一は、対応するオブジェクトファイル の名前を決定するもので、第二は、任意の.f.F修飾子が Fortranで必要な任意の特殊なライブラリを読込む為にYorickに警告する。

LIBは貴方のパッケージ向けに構築されたライブラリの名前である。 例題では、そのライブラリはlibfrob.aとなる。もし、貴方が ライブラリ名を与えないのであれば、ライブラリが構築されない。 これは貴方のYorickに影響を与えないが、もし、貴方が後でコンパイルされた 函数を追加したくなっても、このパッケージ内部の函数を捕み上げる様に、 Yorickに命じる簡単な方法を持たない事になる。

DEPLIBSは空行(space)で区切られた、貴方のパッケージが必要とする システムライブラリのリストである。m(libm、数学ライブラリ、X11、 或いはYorickが日常的に貴方のプラットホーム上で読込む様なその他の任意の ライブラリを列記してはならない。貴方のライブラリが何等のライブラリに依存 していない事を希望する。と云うのも、依存するライブラリがあればある程、 移植性がより低下するからである。それらのライブラリが、ある環境では使えない だけではなく、それらは確実に異った場所にあるからでもある。今後、貴方は コンパイラがそれらのライブラリを見付ける様に、適切な-Lオプションを 挿入する為に、Makefileを手で記述しなければならず、そして、貴方のパッケージ を構築する各種環境上で独立してそれを実行しなければならない。

私はある拡張に対して、これを自動的にしたい -- その明かなものは各サイトの主が 管理出来る様に、Y_HOME/libでのライブラリ配置リストに置く事である -- しかし、現在は、貴方自身に任せる。

NO-WRAPPERSキーワードは、この起動包含ファイルが如何なるPROTOTYPE註釈 が含んでいなければ、存在していなければならない(勿論、私はこれを自動的に 検証する事が可能だろうが、そうすると、無用な程に物事を遅くしてしまう)。

要約すると、DOCUMENT註釈に加えて、貴方の立ち上げ包含ファイルはPROTOTYPE 註釈を、各コンパイルされた函数に対して含んでいなければならない。 その函数は、codgerが自動的にwrapperと一つのMAKE-INSTRUCTIONS註釈を生成す る事を貴方が望むものである。

Yorickは自動的にMakefileを組み立てる事が可能である。もし、貴方が、 Makefileが何であるか知らなければ、UNIXのmakeのmanpageで読む事が出来る。 而し、貴方が知る必要が無いものを知る良い機会である -- 続けよう。 これを行うと、任意の古いMakefileが貴方のディレクトリから削除される。 それから、(シェルに対して)以下を入力しよう:

 
yorick -batch make.i my_prog my_start.i

もし、貴方のパッケージが幾つかの立ち上げ包含ファイルを要求するのであれば、 `my_start.i'の後にその他の一覧を載せよう。my_progと云う名前は これから呼出されるYorickの貴方向けに調整したものである。

貴方が以前、生成したパッケージをそれらの名前をこの命令行上で+の 後に与える事で新しいYorickに読込む事が出来る:

 
yorick -batch make.i my_prog my_start.i + old_pkg1.i old_pkg2.i

これらの追加のstartup includeファイルは`Y_SITE/startup'か `Y_SITE/contrib'の何れかに置かれていなければならない。 (或いは、カレントディレクトリからそれらへのソフトリンクをしても良い)。 @kbd`LIB}ライブラリは、`Y_HOME/lib'や`Y_HOME/lib/contrib'に 置かれていなければならないstartup包含ファイルの中で述べられたものである (或いは、貴方のカレントディレクトリからソフトリンクを持っていても良い)。 デフォルトで、パッケージ`matrix.i'と`fft.i'が含まれている。 それらを省略する為には、@fi;e{-matrix}や`-fft'と置こう。

`make.i'スクリプトは貴方のカスタムYorickを構築する為に用いる事の 出来るMakefileを生成する。貴方は自動的に生成されたファイルを初期の 裁断として認めるべきである。それが正しくなる様に手動でそれを編集する 事に自由を感じなければならない。そうする為には、貴方はYorickのMakefile templte `Y_HOME/Maketmpl'を読んで理解する必要がある。 (もし、必要であれば、貴方は他の別のMakefile templateに切り替えても良い; `Make-cxx'と`Make-mpy'テンプレートはYorickの配布の他の部分に 隠してある。)

後で、貴方が望む方法で、Makefileを得る様に、次を入力する:

 
make

こうするのも貴方の新しい版のYorickのコンパイルと読込を行う為である。 その構築の後に、貴方のstartup includeファイルを`Y_SITE/contrib' や`Y_SITE/startup'に、そして、それらが他のパッケージ作成者にも "見える様に"する為に、ライブラリを`Y_HOME/lib'、或いは @file`Y_HOME/lib/contrib}に移せる。

貴方のstartup includeファイルを移すべきではないが、もし貴方がしなれば、 貴方は同じディレクトリに貴方の新しい実行ファイルを置いたままにしなければ ならない -- Yorickは`Y_LAUNCH'でそれらを標準的な場所にあるのと同様に 探すからである。

貴方のパッケージを異ったプラットホームに移した時、その一部として、 貴方が生成したMakefileも移そう。新しいプラットホーム上の貴方の ソースディレクトリで、次を入力する:

 
yorick -batch make.i
make

これで新しいプラットホーム上に適切な位置に対するMakefile templateへの 経路を変更する。すると、makeは新しいプラットホーム上で、貴方の カスタム版を構築する。(1.3よりも古いYorickではMakefile templateの 異なった体系が用いられている。つまり、この命令は、貴方の古いMakefile を新しい形式に変換する。その原形は`Makefile.old'に変名される。

この系の目標は可搬性である。基本的なアイディアは、計算機環境特有の問題 全ては一旦、Makefile template(或いは幾つかのtemplateファイル)で解決する事が 可能な事である。そうして、貴方は簡単に貴方のパッケージをある計算機環境から 別のものに移す事が出来る。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Concept Index


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

[Top] [Contents] [Index] [ ? ]

Table of Contents

1. Basic Ideas
1.1 Simple Statements
1.1.1 Defining a variable
1.1.2 Invoking a procedure
1.1.3 Printing an expression
1.2 Flow Control Statements
1.2.1 Defining a function
1.2.2 Defining Procedures
1.2.3 Conditional Execution
1.2.3.1 General if and else constructs
1.2.3.2 Combining conditions with && and ||
1.2.4 Loops
1.2.4.1 The while and do while statements
1.2.4.2 The for statement
1.2.4.3 Using break, continue, and goto
1.2.5 Variable scope
1.2.5.1 extern statements
1.2.5.2 local statements
1.3 The Interpreted Environment
1.3.1 Starting, stopping, and interrupting Yorick
1.3.2 Include files
1.3.2.1 A sample include file
1.3.2.2 Comments
1.3.2.3 DOCUMENT comments
1.3.2.4 Where Yorick looks for include files
1.3.2.5 The `custom.i' file
1.3.3 The help function
1.3.4 The info function
1.3.5 Prompts
1.3.6 Shell commands, removing and renaming files
1.3.7 Error Messages
1.3.7.1 Runtime errors
1.3.7.2 How to respond to a runtime error
2. Using Array Syntax
2.1 Creating Arrays
2.2 Interpolating
2.3 Indexing
2.3.1 Scalar indices and array order
2.3.2 Selecting a range of indices
2.3.3 Nil index refers to an entire dimension
2.3.4 Selecting an arbitrary list of indices
2.3.5 Creating a pseudo-index
2.3.6 Numbering a dimension from its last element
2.3.7 Using a rubber index
2.3.8 Marking an index for matrix multiplication
2.3.9 Rank reducing (statistical) range functions
2.3.10 Rank preserving (finite difference) range functions
2.4 Sorting
2.5 Transposing
2.6 Broadcasting and conformability
2.7 Dimension Lists
3. Graphics
3.1 Primitive plotting functions
3.1.1 plg
3.1.2 pldj
3.1.3 plm
3.1.4 plc
3.1.5 plf
3.1.6 pli
3.1.7 plfp
3.1.8 plv
3.1.9 plt
3.2 Plot limits and relatives
3.2.1 limits
3.2.1.1 Zooming with the mouse
3.2.1.2 Saving plot limits
3.2.1.3 Forcing square limits
3.2.2 logxy
3.2.3 gridxy
3.2.4 palette
3.2.5 Color model
3.3 Managing a display list
3.3.1 fma and redraw
3.3.2 Multiple graphics windows
3.4 Getting hardcopy
3.4.1 Color hardcopy
3.4.2 Binary CGM caveats
3.4.3 Encapsulated PostScript
3.5 Graphics style
3.5.1 Style keyword
3.5.2 `style.i' functions
3.5.3 Coordinate systems
3.5.4 Ticks and labels
3.6 Queries, edits, and legends
3.6.1 Legends
3.6.2 plq and pledit
3.7 Defaults for keywords
3.8 Writing new plotting functions
3.9 Animation
3.10 3D graphics interfaces
3.10.1 Coordinate mapping
3.10.2 Lighting
3.10.3 gnomon
3.10.4 plwf interface
3.10.5 slice3 interface
4. Embedding Compiled Routines Inside Yorick
Concept Index

[Top] [Contents] [Index] [ ? ]

Short Table of Contents

1. Basic Ideas
2. Using Array Syntax
3. Graphics
4. Embedding Compiled Routines Inside Yorick
Concept Index

[Top] [Contents] [Index] [ ? ]

About this document

This document was generated using texi2html

The buttons in the navigation panels have the following meaning:

Button Name Go to From 1.2.3 go to
[ < ] Back previous section in reading order 1.2.2
[ > ] Forward next section in reading order 1.2.4
[ << ] FastBack previous or up-and-previous section 1.1
[ Up ] Up up section 1.2
[ >> ] FastForward next or up-and-next section 1.3
[Top] Top cover (top) of document  
[Contents] Contents table of contents  
[Index] Index concept index  
[ ? ] About this page  

where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:

This document was generated by Hiroshi Yokota on January, 25 2005 using texi2html