動作環境: | DOS32 |
書式: | include graphics.e x = palette(i, s) |
解説: | 色番号iを{赤, 緑, 青}からなるシーケンスsで指定された色に変更します。sの各値は0から63までです。成功した場合は、iの以前の色が3要素からなるシーケンスで返され、値iに依存するスクリーン上の全てのピクセルは新しい色に変更されます。失敗した場合は、アトムとして-1を返します。 |
用例: | |
x = palette(0, {15, 40, 10}) -- 色番号0(通常は黒)の陰影は -- 主に緑色に変更されます。 | |
関連事項: | all_palette |
書式: | i = peek(a) または... s = peek({a, i}) |
解説: | マシンアドレス a より 0 から 255 の範囲の単体バイト値またはメモリーアドレスの始点である連続バイト値 i を含むシーケンスを返します。 |
注釈: | アドレスが32bitの数値であるため、整数型(31bit)より非常に大きい値となります。したがってアドレスを保持する変数は、アトムとして宣言する必要があります。
ループ内で1バイトずつ読み取るよりpeek()の第2形式を使用して一度に数バイト読み取ったほうが高速です。 実際はpeek()の第2形式として2要素のシーケンスを1つの引数として扱うということを覚えておいてください。 |
用例: | どちらの記法も等価です: |
-- 記法1 s = {peek(100), peek(101), peek(102), peek(103)} -- 記法2 s = peek({100, 4}) | |
関連事項: | poke, peek4s, peek4u, allocate, free, allocate_low, free_low, call |
書式: | a2 = peek4s(a1) または... s = peek4s({a1, i}) |
解説: | マシンアドレス a1 より -2147483648 から 2147483647 の範囲の符号付き4バイト(32-Bit)値またはメモリーアドレスの始点である符号付きの連続する4バイト値 i を含むシーケンスを返します。 |
注釈: | peek4s()によって32bitの値が返されるため、Euphoriaの整数型(31bit)より非常に大きい値となるため、使用する変数はアトムとして宣言する必要があります。
マシンアドレスが32bitの数値であるため、Euphoriaの整数型(31bit)より非常に大きい値となります。したがってアドレスを保持する変数は、アトムとして宣言する必要があります。 ループ内で4バイトずつ値を読み取るよりpeek4s()の第2形式を使用して一度に4バイトの値を読み取ったほうが高速です。 実際はpeek4s()の第2形式として2要素のシーケンスを1つの引数として扱うということを覚えておいてください。 |
用例: | どちらの記法も等価です: |
-- 記法1 s = {peek4s(100), peek4s(104), peek4s(108), peek4s(112)} -- 記法2 s = peek4s({100, 4}) | |
関連事項: | peek4u, peek, poke4, allocate, free, allocate_low, free_low, call |
書式: | a2 = peek4u(a1) または... s = peek4u({a1, i}) |
解説: | マシンアドレス a1 より 0 から 4294967295 の範囲の符号なし4バイト(32-Bit)値またはメモリーアドレスの始点である符号なしの連続する4バイト値 i を含むシーケンスを返します。 |
注釈: | peek4u()によって32bitの値が返されるため、Euphoriaの整数型(31bit)より非常に大きい値となるため、使用する変数はアトムとして宣言する必要があります。
マシンアドレスは32bitの数値であるため、Euphoriaの整数型(31bit)より非常に大きい値となります。したがってアドレスを保持する変数は、アトムとして宣言する必要があります。 ループ内で4バイトずつ値を読み取るよりpeek4u()の第2形式を使用して一度に4バイトの値を読み取ったほうが高速です。 実際はpeek4u()の第2形式として2要素のシーケンスを1つの引数として扱うということを覚えておいてください。 |
用例: | どちらの記法も等価です: |
-- 記法1 s = {peek4u(100), peek4u(104), peek4u(108), peek4u(112)} -- 記法2 s = peek4u({100, 4}) | |
関連事項: | peek4s, peek, poke4, allocate, free, allocate_low, free_low, call |
書式: | include misc.e PI |
解説: | PI (3.14159...)はグローバル定数として定義されています。 |
注釈: | 十分な桁数がEuphoriaのアトムのために最大限実現可能な精度を確保するために使用されています。 |
用例: | |
x = PI -- x は 3.14159... | |
関連事項: | sin, cos, tan |
動作環境: | DOS32 |
書式: | pixel(x1, s) |
解説: | 一つ以上のピクセルをsをスクリーン座標{x, y}としてピクセルグラフィックススクリーンの始点sに設置します。x1がアトムならば、単一ピクセルはx1によって指定される色が適用されます。x1がシーケンスならば、sを始点として右方向へ複数のシーケンスが設置されます(xの値をyの値と同様に加算するということです)。 |
注釈: | x1がシーケンスのとき、ピクセルをスクリーンに配置するために非常に高速なアルゴリズムが使用されます。ピクセルと色からなるシーケンスをpixel()を一つずつ呼んでピクセルと色を描画するより一括で呼び出したほうが高速です。
pixel() はグラフィックスモード19用に高度な最適化がされています。 どのような場合であってもスクリーン外のピクセルは安全にクリップされます。 |
用例1: | |
pixel(BLUE, {50, 60}) -- 点 {50,60} の色はBLUE(青)に設定されます。 | |
用例2: | |
pixel({BLUE, GREEN, WHITE, RED}, {50,60}) -- {50,60} は BLUE(青)に設定されます。 -- {51,60} は GREEN(緑)に設定されます。 -- {52,60} は WHITE(白)に設定されます。 -- {53,60} は RED(赤)に設定されます。 | |
関連事項: | get_pixel, graphics_mode |
書式: | i = platform() |
解説: | platform()はインタプリタ組み込み関数です。それはプログラムがどのプラットホームで実行を開始されたかを表しています: DOS32, WIN32, Linux または FreeBSD |
注釈: | ex.exeが実行された場合のプラットホームはDOS32です。exw.exe, exwc.exeが実行された場合のプラットホームはWIN32です。exuが実行された場合のプラットホームはLinux(またはFreeBSD)です。
インクルードファイルmisc.eには次の定数が掲載されています: |
global constant DOS32 = 1, WIN32 = 2, LINUX = 3, FREEBSD = 3 | |
platform()をプラットホーム依存コードをプログラム実行時に区別したいときに使用します。
Euphoriaを新しいマシンおよびオペレーティングシステム環境に移植したときにプラットホームが追加されます。 platform()の呼び出しコストはありません。それはコンパイル時に適切な整数値で最適化されます: 1, 2または3 | |
用例1: | |
if platform() = WIN32 then -- システムからBeepルーチンを呼び出す。 err = c_func(Beep, {0,0}) elsif platform() = DOS32 then -- beepを鳴らす。 sound(500) t = time() while time() < t + 0.5 do end while sound(0) else -- 何もしない。 (Linux/FreeBSD) end if | |
関連事項: | platform.doc |
書式: | poke(a, x) |
解説: | xがアトムのとき、単一バイト値をメモリーアドレスaに書き込みます。
xがシーケンスのとき、位置aを始点とした連続的なメモリー位置にシーケンスからなる単一バイト値を書き込みます。 |
注釈: | すなわちremainder(x, 256)といったように、実際は8-bitごとにメモリーに値が格納されます。
ループ内で1バイトごとに値を書き込むより一度に複数の1バイトの値をシーケンスとしてまとめて書き込んだほうが高速です。 poke()でスクリーンメモリーに書き込むとputs()またはprintf()より高速に動作しますが、しかしプログラミングが困難になります。多くの場合は速度は必要とされません。例えば、Euphoria標準エディタedではpoke()を使用していません。 |
用例: | |
a = allocate(100) -- 100byteをメモリーに確保する。 -- このときに1バイトを書き込む: poke(a, 97) poke(a+1, 98) poke(a+2, 99) -- このときに一度に3バイトを書き込む: poke(a, {97, 98, 99}) | |
プログラム例: | demo\callmach.ex |
関連事項: | peek, poke4, allocate, free, allocate_low, free_low, call, safe.e |
書式: | poke4(a, x) |
解説: | xがアトムのとき、4バイト値をメモリーアドレスaに書き込みます。 xがシーケンスのとき、位置aを始点とした連続的なメモリー位置にシーケンスからなる4バイト値を書き込みます。 |
注釈: | 値を格納するときは32bitを超えてはいけません。
ループ内で4バイトごとに値を書き込むより一度に複数の4バイトの値をシーケンスとしてまとめて書き込んだほうが高速です。 4バイトの値として正数または負数どちらでも格納できます。値はpeek4s()またはpeek4u()のどちらでも後で読みだせます。 |
用例: | |
a = allocate(100) -- 100バイトのメモリーを確保する。 -- 4バイト値をひとつ書き込む: poke4(a, 9712345) poke4(a+4, #FF00FF00) poke4(a+8, -12345) -- 一度に4バイト値を3つ書き込む: poke4(a, {9712345, #FF00FF00, -12345}) | |
関連事項: | peek4u, peek4s, poke, allocate, allocate_low, call |
動作環境: | DOS32 |
書式: | include graphics.e polygon(i1, i2, s) |
解説: | ピクセルグラフィックススクリーンで色 i1を用いてsに3つ以上の頂点を与え、多角形を描きます。i2がiのとき領域を塗りつぶします。i2が0のとき領域を塗りつぶしません。 |
用例: | |
polygon(GREEN, 1, {{100, 100}, {200, 200}, {900, 700}}) -- 立体的な緑色の四角形を作成します。 | |
関連事項: | draw_line, ellipse |
書式: | position(i1, i2) |
解説: | スクリーン左上端を行1、桁1とし、カーソルを行をi1、桁をi2へ設定します。次のスクリーンの文字表示からこの位置に出力されます。position()はスクリーン外の位置に対してエラーを報告します。 |
注釈: | position()はテキストおよびピクセルグラフィックスモードのどちらでも動作します。
テキスト表示はピクセル表示と座標システムに違いがあります。ピクセルは左上(x=0,y=0)から表示が行われ座標の始点は左から右へと水平に制御されます。ピクセルグラフィックスモードはテキストとピクセルの両方を表示できます。position()はテキストの行と桁のみ設定でき、ピクセルを描画することはできません。このルーチンで次のピクセルの位置の指定をするのは不適切です。 |
用例: | |
position(2,1) -- カーソルは上から2行目の行頭へ移動します。 | |
関連事項: | get_position, puts, print, printf |
書式: | x3 = power(x1, x2) |
解説: | Rx1の数をx2乗します(累乗、べき乗)。 |
注釈: | この関数の引数はアトムまたはシーケンスです。シーケンスの演算規約が適用されます。
2つの累乗は非常に効率的な計算が行われます。 |
用例1: | |
? power(5, 2) -- 25 が表示されます。 | |
用例2: | |
? power({5, 4, 3.5}, {2, 1, -0.5}) -- {25, 4, 0.534522} が表示されます。 | |
用例3: | |
? power(2, {1, 2, 3, 4}) -- {2, 4, 8, 16} | |
用例4: | |
? power({1, 2, 3, 4}, 2) -- {1, 4, 9, 16} | |
関連事項: | log, sqrt |
書式: | s2 = prepend(s1, x) |
解説: | シーケンスs1の先頭にxを追加します。なお、s2の長さは length(s1) + 1となります。 |
注釈: | xがアトムのときは s2 = x & s1と等価です。しかしxがシーケンスのときは等価ではありません。
s1とs2が同一の変数である場合は非常に効率的な方法で処理が行われます。 |
用例1: | |
prepend({1,2,3}, {0,0}) -- {{0,0}, 1, 2, 3} -- 連結演算子との比較: {0,0} & {1,2,3} -- {0, 0, 1, 2, 3} | |
用例2: | |
s = {} for i = 1 to 10 do s = prepend(s, i) end for -- s は {10,9,8,7,6,5,4,3,2,1} | |
関連事項: | append, 連結演算子 &, シーケンス構造演算子 |
書式: | include misc.e pretty_print(fn, x, s) |
解説: | ファイルまたはデバイスfnにオブジェクトxをブレースブラケット{,,,}とインデント、複数行分割を用いて構造を表したものを出力します。
いくつかのオプションは表記を制御するためにsを指定する場合があります。{}を渡して規定値にするか、次のオプションを選択して指定できます。
sの長さが8以下のとき、識別できないオプションは規定値になります。すなわち、{0, 5}を指定してインデントを5文字加え、その他全てを規定値に設定し"常にASCIIを表示する"ことができます。 |
注釈: | 現在のカーソル位置から表示が開始されます。通常、カーソルが桁1の位置にあるときにpretty_print()を呼び出したい時があります(\n文字を出力後に)。違う桁から開始したいときは、position()を呼び出してpretty_print()のオプション[3]を指定する必要があります。これはシーケンスの最初と最後のブレースブラケットが垂直に一列で並ぶことを保証します。 整数および浮動小数点数のために書式を指定するとき、例えば"(%d)" または "$ %.2f"といったいくつかの装飾を加えることができます。 |
用例1: | |
pretty_print(1, "ABC", {}) {65'A',66'B',67'C'} | |
用例2: | |
pretty_print(1, {{1,2,3}, {4,5,6}}, {}) { {1,2,3}, {4,5,6} | |
用例3: | |
pretty_print(1, {"Euphoria", "Programming", "Language"}, {2}) { "Euphoria", "Programming", "Language" } | |
用例4: | |
puts(1, "word_list = ") -- カーソルは13桁目に移動します。 pretty_print(1, {{"Euphoria", 8, 5.3}, {"Programming", 11, -2.9}, {"Language", 8, 9.8}}, {2, 4, 13, 78, "%03d", "%.3f"}) -- 最初の 6 から 8はオプションです。 word_list = { { "Euphoria", 008, 5.300 }, { "Programming", 011, -2.900 }, { "Language", 008, 9.800 } } | |
関連事項: | ?, print, puts, printf |
書式: | print(fn, x) |
解説: | ブレースブラケットとカンマ { , , , }で表現したオブジェクト x の構造をファイルまたデバイス fn へ出力します。 |
用例1: | |
print(1, "ABC") -- 出力は: {65, 66, 67} puts(1, "ABC") -- 出力は: ABC | |
用例2: | |
print(1, repeat({10,20}, 3)) -- 出力は: {{10,20},{10,20},{10,20}} | |
関連事項: | ?, pretty_print, puts, printf, get |
書式: | printf(fn, st, x) |
解説: | xを書式指定文字列stに従ってファイルまたはデバイスfnへ出力します。xがシーケンスならば書式指定子はxの対応する要素と一致します。xがアトムならば通常stは単体の書式指定子を含みxに適用されますが、しかしstが複数の書式指定子を含むときは、それぞれ同様の値がxに適用されます。常にprintf()は正確な3つの引数を必要とします。最後の引数の長さのみ出力される値を含んでいるため異なります。基本的な書式指定子は次のとおりです:
基本的な書式にフィールド幅を付け加えることができます。例として%5d, %8.2f, %10.4sなどがあります。小数点の前の数は使用される最小限のフィールド幅です。小数点の後の数は使用される精度です。 例えば%-5dのようにフィールド幅が負数ならばフィールド内の値を左揃えにします。通常は右揃えです。例えば、%08dのようにフィールド幅の先頭が0から開始されるならば、フィールドの先頭は0で埋めることができます。例えば、%+7dのようにフィールド幅が'+'から開始されるならば、プラス記号を整数のために出力されます。 |
注釈: | 次のような一般的な間違いに気をつけてください: |
name="John Smith" printf(1, "%s", name) -- エラー! | |
nameの最初の文字であるJのみ出力されますが、これはnameの各要素が個別の値であるとみなされて書式設定が行われるのが原因です。これを回避するには次のように記述します: | |
name="John Smith" printf(1, "%s", {name}) -- 正しい | |
これで、printf()の第三引数は単一要素で構成されるシーケンスとして書式設定が行われます。 | |
用例1: | |
rate = 7.875 printf(myfile, "The interest rate is: %8.2f\n", rate) The interest rate is: 7.88 | |
用例2: | |
name="John Smith" score=97 printf(1, "%15s, %5d\n", {name, score}) John Smith, 97 | |
用例3: | |
printf(1, "%-10.4s $ %s", {"ABCDEFGHIJKLMNOP", "XXX"}) ABCD $ XXX | |
用例4: | |
printf(1, "%d %e %f %g", 7.75) -- 同一値を違う形式で出力する。 7 7.750000e+000 7.750000 7.75 | |
関連事項: | sprintf, puts, open |
書式: | profile(i) |
解説: | ランタイムプロファイル機能を有効または無効にします。これは実行回数および実行時間の計測の両方の動作を行います。iが1のときプロファイリングは有効になり、時間サンプリング/実行回数の記録が開始されます。iが0のときプロファイリングは無効になり、時間サンプリング/実行回数の記録が停止されます。 |
注釈: | "with profile" または "with profile_time"命令文の後に、プロファイルは自動で有効になります。それはprofile(0)で無効にできます。プロファイルを実行したいコードに到達したときに、もう一度プロファイルを有効にするにはprofile(1)を使用してください。 |
用例1: | |
with profile_time profile(0) ... procedure slow_routine() profile(1) ... profile(0) end procedure | |
関連事項: | trace, profiling, 特殊上位構文 |
書式: | include get.e a = prompt_number(st, s) |
解説: | プロンプトを表示してユーザから数値の入力を待ちます。stはテキスト文字列でスクリーンに表示されます。 sは{下位,上位}の2つの値を持つシーケンスでユーザが入力できる値の範囲を決定します。もし、ユーザが数値を入力したときに下位より少ないか上位より多ければ指定範囲外になり、もう一度プロンプトを表示します。sを空指定 {} にすることができ、その場合は範囲制限はありません。 |
注釈: | このルーチンが単純すぎて目的に合わないのでしたら、どうぞご自由にコピーして好きなように改造版を作成してください。 |
用例1: | |
age = prompt_number("What is your age? ", {0, 150}) | |
用例2: | |
t = prompt_number("Enter a temperature in Celcius:\n", {}) | |
関連事項: | get, prompt_string |
書式: | include get.e s = prompt_string(st) |
解説: | ユーザがテキスト文字列を入力するためのプロンプトを表示します。stは文字列でスクリーン上に表示されます。ユーザが文字列を入力後に改行文字を除いたシーケンスが返されます。 |
注釈: | ユーザがCtrl+Z(EOF : ファイル終端文字)を入力してしまったときは、""が返されます。 |
用例: | |
name = prompt_string("What is your name? ") | |
関連事項: | gets, prompt_number |
書式: | include image.e put_screen_char(i1, i2, s) |
解説: | スクリーンに属性とともに文字を0文字以上出力します。i1は行をi2には最初の文字を出力しなければならない列を指定します。シーケンスsは{アスキーコード1, 属性1, アスキーコード2, 属性2, ...}といった構造です。sの各要素のペアには1文字を記述します。アスキーコードからなるアトムには文字のASCIIコードが含まれています。文字からなるアトムには前景色、背景色、文字をスクリーンに表示するための他のプラットホームに依存する制御情報が含まれています。 |
注釈: | sの長さは2の倍数である必要があります。sの長さが0のときはスクリーンは何も表示されます。
なお、put_screen_char()で一括で複数の文字を出力することは、一つずつ文字を出力するより高速です。 |
用例: | |
-- AZをスクリーンの左上に出力します。 -- (表示属性は動作環境に依存します) put_screen_char(1, 1, {'A', 152, 'Z', 131}) | |
関連事項: | get_screen_char, display_text_image |
書式: | puts(fn, x) |
解説: | ファイルまたはデバイス fn に対して単一バイト(アトム)またはシーケンスバイトを出力します。各8bitの値は低い順列から送られて出力されます。fnがスクリーンに対する出力であればテキスト文字が表示されます。 |
注釈: | シーケンスバイトを出力するさいは、その中に(サブ)シーケンスを保持することはできません。それはアトムのシーケンスのみである必要があります(一般的に文字列はアスキーコードで構成されています)。
スクリーンまたは標準出力にアスキーコード0を出力するのは避けてください。出力が丸め込まれてしまう恐れがあります。 出力ファイルがテキストモードで開けるであれば、DOSとWindowsでは\n(10)は\r\n(13 10)へ変換されることを思い返してください。これが望ましくないのであればバイナリモードでファイルを開いてください。 |
用例1: | |
puts(SCREEN, "Enter your first name: ") | |
用例2: | |
puts(output, 'A') -- 単一バイト65が送られて出力されます。 | |
関連事項: | printf, gets, open |
書式: | x2 = rand(x1) |
解説: | 1からx1までの整数値の乱数をx2に返します。x1に指定できるのは1から1073741823までの整数型の正数値のみです。 |
注釈: | この関数はアトムまたはシーケンスの全ての要素に適用されることがあります。 |
用例: | |
s = rand({10, 20, 30}) -- s はこうなるかもしれません: {5, 17, 23} or {9, 3, 12} など | |
関連事項: | set_rand |
書式: | include image.e x = read_bitmap(st) |
解説: | stは"ビットマップ(.bmp)"ファイル名です。ファイルはビットマップフォーマットである必要があります。一般的なフォーマットの種類は対応しています。ファイルが正常に読み込まれたときは結果として2要素からなるシーケンスとなります。最初の要素はパレットであり、0から255までの範囲の値を明度として含みます。次の要素は、ピクセルグラフィックスイメージを含む入れ子になった2次元シーケンスです。なお、all_palette()にパレットを渡すことができます(4で値を除算した後に)。また、イメージをdisplay_image()に渡すこともできます。 ビットマップとして2, 4, 16 or 256色をサポートしています。ファイルが不正な形式であれば、次のようなエラーコード(アトム)が返されます: |
global constant BMP_OPEN_FAILED = 1, BMP_UNEXPECTED_EOF = 2, BMP_UNSUPPORTED_FORMAT = 3 | |
注釈: | Windowsのペイントまたは多くのグラフィックスプログラムを使用して画像をピットマップファイルとして作成することができます。さらに、ピットマップファイルをEuphoriaのプログラムに取り込むことができます。 |
用例: | |
x = read_bitmap("c:\\windows\\arcade.bmp") -- 注意: 文字列から単一のバックスラッシュを得るには2重バックスラッシュが必要です。 | |
プログラム例: | demo\dos32\bitmap.ex |
関連事項: | palette, all_palette, display_image, save_bitmap |
書式: | include machine.e (または safe.e) register_block(a, i) |
解説: | メモリーブロックをsafe.e(はmachine.eのデバッグバージョンです)によって保守される安全なブロックのリストに追加します。ブロックの開始アドレスはaです。ブロックの長さはiバイトです。 |
注釈: | このルーチンはデバッグを行う目的のみ使用されます。safe.eはプログラムでpeek(), poke(), mem_copy(), その他の利用が許可されたメモリーブロックを追跡します。通常これらのブロックはEuphoriaのallocate()またはallocate_low()ルーチンを使用して割り当てを行い、まだ開放していないときはEuphoriaのfree()またはfree_low()を使用します。いくつかの場合において、C言語ルーチンを呼び出した結果として追加の外部メモリーブロックが返されることがあります。safe.eを使用してプログラムでデバックするときは、safe.eを使用して不正な外部アクセスを防ぐために外部メモリーブロックを登録する必要があります。外部ブロックの使用を終えたときunregister_block()を使用して登録を削除できます。
machine.eをインクルードするとき、register_block()とunregister_block()が無効化された異なるバージョンを使用することになります。これはデバッグと非デバッグバージョンの切り替えをプログラム実行時に行うことを容易にします。 |
用例1: | |
atom addr addr = c_func(x, {}) register_block(addr, 5) poke(addr, "ABCDE") unregister_block(addr) | |
関連事項: | unregister_block, safe.e |
書式: | x3 = remainder(x1, x2) |
解説: | x2をx1で割って剰余を求めます。結果としてx1はサインと同じであり、さらに結果として大きさはx2以下の大きさになります。 |
注釈: | この関数の引数はアトムまたはシーケンスです。シーケンスの演算規約が適用されます。 |
用例1: | |
a = remainder(9, 4) -- a は 1 | |
用例2: | |
s = remainder({81, -3.5, -9, 5.5}, {8, -1.7, 2, -4}) -- s は {1, -0.1, -1, 1.5} | |
用例3: | |
s = remainder({17, 12, 34}, 16) -- s は {1, 12, 2} | |
用例4: | |
s = remainder(16, {2, 3, 5}) -- s は {0, 1, 1} | |
関連事項: | floor |
書式: | s = repeat(x, a) |
解説: | オブジェクトxをa回複製した長さaのシーケンスを返します。 |
注釈: | シーケンスまたは浮動小数点数を複製するとき、インタプリタはメモリー内に複数のコピーを作成しません。単体のコピーを毎回"指す"だけです。 |
用例1: | |
repeat(0, 10) -- {0,0,0,0,0,0,0,0,0,0} | |
用例2: | |
repeat("JOHN", 4) -- {"JOHN", "JOHN", "JOHN", "JOHN"} -- インタプリタは "JOHN"のコピーを一つだけ -- メモリー内に作成します。 | |
関連事項: | append, prepend, シーケンス構造演算子 |
書式: | include misc.e s2 = reverse(s1) |
解説: | シーケンス内の要素の順列を反転します。 |
注釈: | 元のシーケンスs1とのs2を比較すると、s1の先頭からの要素を逆順(末尾から複製して)にしてから新しいシーケンスs2の生成されます。 |
用例1: | |
reverse({1,3,5,7}) -- {7,5,3,1} | |
用例2: | |
reverse({{1,2,3}, {4,5,6}}) -- {{4,5,6}, {1,2,3}} | |
用例3: | |
reverse({99}) -- {99} | |
用例4: | |
reverse({}) -- {} | |
関連事項: | append, prepend, repeat |
書式: | i = routine_id(st) |
解説: | ユーザが定義したEuphoriaの手続きまたは関数のルーチンIDとして知られている整数値によるID番号を返します。stには手続きまたは関数の名称を文字列シーケンスとして与えます。もしルーチン名が見つからない場合は-1を返します。 |
注釈: | call_proc()またはcall_func()にID番号を渡して間接的にルーチン名 st を呼び出すことができます。
stによってルーチン名は明示化される必要があります。すなわちroutine_id()によってルーチンの参照や呼び出しが可能であればID番号を取得することができます。ルーチンの間接呼び出しはルーチンの定義より以前にプログラムに出現することができますが、ID番号のみルーチンの定義の後に現れるコードで得ることができます - 後述の用例2を参照してください。 一度取得した有効なルーチンIDはプログラムの任意の場所でcall_proc() / call_func()を経由して間接的にルーチンを呼び出して使用してすることができます。 いくつかの典型的なroutine_id()の使用方法は次のとおりです:
留意点としてC言語ルーチンは、ルーチンIDを与えることによってEuphoricaから呼び出すことができます。詳しくはdefine_c_proc() および define_c_func()を参照してください。 |
用例1: | |
procedure foo() puts(1, "Hello World\n") end procedure integer foo_num foo_num = routine_id("foo") call_proc(foo_num, {}) -- 同様にfoo()を呼び出します。 | |
用例2: | |
function apply_to_all(sequence s, integer f) -- 全てのシーケンスの要素に関数の処理を適用します。 sequence result result = {} for i = 1 to length(s) do -- ここでプログラムの後に位置するadd1()を呼び出すことができます。 result = append(result, call_func(f, {s[i]})) end for return result end function function add1(atom x) return x + 1 end function -- ここにadd1()が現れて、add1()のルーチンIDを問い合わせることができます。 ? apply_to_all({1, 2, 3}, routine_id("add1")) -- {2,3,4}が表示されます。 | |
関連事項: | call_proc, call_func, call_back, define_c_func, define_c_proc, platform.doc |