動作環境: | WIN32 |
書式: | include misc.e i = instance() |
解説: | 現在のプログラムのハンドルを返します。 |
注釈: | このハンドルの値は現実行中のプログラム(例としてあなたが開発したプログラム)に関する情報を得るために様々なWindowsルーチンで利用できます。ハンドルの値はプログラムごとに違い、同一のプログラムであっても起動するごとに値は変化します。
C言語では、これはWinMain()の最初のパラメータとなります。 DOS32およびLinux/FreeBSDでは、常に返値は0となります。 |
関連事項: | platform.doc |
書式: | include machine.e s = int_to_bits(a, i) |
解説: | 0と1のシーケンスからなる下位iビットを返します。最下位ビットが先頭になります。負数のときは2の補数のビットパターンが返されます。 |
注釈: | 添字付け、分割および全部のシーケンスのand/or/xor/notなどをビットからなるシーケンスに対して使用することができます。ビットシフトおよびビットローテートの表現は簡単にできます。 |
用例: | |
s = int_to_bits(177, 8) -- s は {1,0,0,0,1,1,0,1} -- "逆順" | |
関連事項: | bits_to_int, and_bits, or_bits, xor_bits, not_bits, シーケンスの演算 |
書式: | include machine.e s = int_to_bytes(a) |
解説: | 整数を4バイトのシーケンスに変換します。これらのバイトはi386以降で使用される最下位バイトが最初に来る順列です。 |
注釈: | このルーチンを使用する前にマシン語プログラムのためにメモリー内に4バイトを代入するかもしれません。
整数は負数の場合があります。負数バイトが返されとき、これらをメモリーに代入した後にi386以降の正しい表記(2の補数)になります。 この関数は32bitまでの整数値を正常に変換できます。大きな値のときは下位32bitのみ変換されます。Euphoriaの整数型は31bitまで値のみ扱うことができませんので、より大きな範囲を必要とするならば変数をアトムとして宣言してください。 |
用例1: | |
s = int_to_bytes(999) -- s は {231, 3, 0, 0} | |
用例2: | |
s = int_to_bytes(-999) -- s は {-231, -4, -1, -1} | |
関連事項: | bytes_to_int, int_to_bits, bits_to_int, peek, poke, poke4 |
書式: | i = integer(x) |
解説: | xが-1073741824 から +1073741823までの整数であれば1を、それ以外であれば0を返します。 |
注釈: | これはinteger型の雛形となる定義です。また、オブジェクトが整数であるかどうか調べるための関数としても使用できます。 |
用例1: | |
integer z z = -1 | |
用例2: | |
if integer(y/x) then puts(SCREEN, "y is an exact multiple of x") end if | |
関連事項: | atom, sequence, floor |
書式: | i = length(s) |
解説: | sの長さを返します。sはシーケンスのみ指定できます。アトムを指定した場合はエラーとなります。 |
注釈: | 各シーケンスの長さはインタプリタ内部に格納されており迅速なアクセスが可能です(他の言語では'\0'や.nilなどのエンドマーカーをメモリーから検索する必要があります)。 |
用例1: | |
length({{1,2}, {3,4}, {5,6}}) -- 3 | |
用例2: | |
length("") -- 0 | |
用例3: | |
length({}) -- 0 | |
関連事項: | sequence |
書式: | include file.e i1 = lock_file(fn, i2, s) |
解説: | 複数のプロセスが同時にファイルにアクセス可能であるとき、ファイル内容の破損を避けたり不正なデータを読み込まないためにも何らかのロック機構が必要です。
lock_file()は開いているファイルfnに対してロックを行うと、あなたのプログラムがファイルを読み書きしているあいだ他のプロセスでそのファイルの使用を禁止します。Linux/FreeBSD()では、i2パラメータを使用して要求できる2種類のロック方法があります(DOSとWIN32ではi2パラメータは無視するか、整数である必要があります)。ファイルを読み取るときは共有ロック(shared lock)を依頼して、一時的に他のプロセスから書き込みを阻止したほうが良いです。ファイルに書き込むときは排他的ロック(exclusive lock)を依頼して、一時的に他のプロセスから読み書きを阻止したほうが良いです。多数のプロセスが同じファイルに対して共有ロックを所有することはokですが、単一のプロセスのみ独占的なロックを所有することができ他のどのようなプロセスであってもファイルのロックを所有していないときだけ、それを行うことができます。file.eには次の宣言が含まれています: |
global constant LOCK_SHARED = 1, LOCK_EXCLUSIVE = 2 | |
DOS32とWIN32では、シーケンスsのパラメータとして書式 {最初のバイト, 最後のバイト} を指定するとファイル内の指定部分をロックすることができます。それはロックを適用するファイル内の最初のバイトと最後のバイトを意味します。なお、ファイル全体をロックしたいときは空のシーケンス{}を指定してください。Linux/FreeBSD向けの現在のリリースでは、ロックは常にファイル全体に適用されるため、パラメータとして{}を指定する必要があります。
目的とするロックを得ることに成功したときlock()は1を返します。もし失敗した場合は0を返します。lock_file()は他のプロセスがロックを手放すのを待ちません。ロック要求が与えられる前に、それを繰り返し呼び出す必要があるかもしれません。 | |
注釈: | Linux/FreeBSDでは、これらのロックはアドバイザリロック(助言ロック)と呼ばれており、オペレーティングシステムが強制的にロックをしないことを意味します。並行するプロセスが互いに協力し合って特定のファイルを使用します。プロセスは最初にロック権を得ずにファイルアクセスが可能です。WIN32とDOSでは、オペレーティングシステムによって強制的にロックが行われます。 |
DOS32では、lock_file()はファイル共有が有効なときにとても有益です。一般的に生DOSのときはWindowsの管理外で動作するため0(失敗)を返します。 | |
用例: | |
include misc.e include file.e integer v atom t v = open("visitor_log", "a") -- 追記モードで開く t = time() while not lock_file(v, LOCK_EXCLUSIVE, {}) do if time() > t + 60 then puts(1, "One minute already ... I can't wait forever!\n") abort(1) end if sleep(5) -- 他のプロセスを実行する。 end while puts(v, "Yet another visitor\n") unlock_file(v, {}) close(v) | |
関連事項: | unlock_file, flush, sleep |
動作環境: | DOS32 |
書式: | include machine.e lock_memory(a, i) |
解説: | 仮想メモリーブロックの開始アドレスaから長さiまでをディスクスワップアウトされないようにします。 |
注釈: | lock_memory()はマシン語で記述されたコードを使用するときにDOSハードウェア割り込みハンドラを自身で設定するような非常に特殊な状況でのみ使用されるだけです。ハードウェア割り込み発生時に、オペレーティングシステムはスワップアウト済みのコードまたはデータを一切取り出すができないため割り込みで使用する必要なマシン語コードまたはデータを保護する必要があります。 |
プログラム例: | demo\dos32\hardint.ex |
関連事項: | get_vector, set_vector |
書式: | x2 = log(x1) |
解説: | x1の自然対数を返します。 |
注釈: | この関数はアトムまたはシーケンスの全ての要素に適用されることがあります。自然対数が正数専用に定義されていることに注意してください。負数または0の自然対数を取得しようとするとプログラムはエラーメッセージを表示して停止します。 |
用例: | |
a = log(100) -- a は 4.60517 | |
関連事項: | sin, cos, tan, sqrt |
書式: | include wildcard.e x2 = lower(x1) |
解説: | アトムまたはシーケンスを半角英数小文字へ変換します。 |
用例: | |
s = lower("Euphoria") -- s は "euphoria" a = lower('B') -- a は 'b' s = lower({"Euphoria", "Programming"}) -- s は {"euphoria", "programming"} | |
関連事項: | upper |
書式: | x1 = machine_func(a, x) |
解説: | machine_proc()を参照してください。 |
書式: | machine_proc(a, x) |
解説: | グラフィック制御や効果音の再生といったOSやハードウェア依存機能を使用・制御するさいに使用されます。通常、このルーチンはEuphoriaが提供しているライブラリファイルから間接的に呼ばれなければなりません。誤って直接呼び出した場合はOS・ハードウェア例外を引き起こす恐れがあります。 |
関連事項: | machine_func |
書式: | i = match(s1, s2) |
解説: | s1がs2のスライスと一致するか比較します。成功した場合は、s2のスライスの始点と一致した(最初の)要素番号を返し、それ以外は0を返します。 |
用例: | |
location = match("pho", "Euphoria") -- location は3に設定されます。 | |
関連事項: | find, find_from, compare, match_from, wildcard_match |
書式: | i1 = match_from(s1, s2, i2) |
解説: | インデックス i2 から検索を開始してs1がs2のスライスと一致するか比較します。成功した場合は、s2のスライスの始点と一致した(最初の)要素番号を返し、それ以外は0を返します。i2は、1からs + 1の任意の長さの値であるかもしれません(sのスライスの最初インデックスと同様です)。 |
用例: | |
location = match_from("pho", "phoEuphoria", 4) -- locationは6に設定されます。 | |
関連事項: | find, find_from, match, compare, wildcard_match |
書式: | mem_copy(a1, a2, i) |
解説: | アドレスa2のメモリーブロックをアドレスa1へiバイトのコピーします。 |
注釈: | たとえa1とa2のメモリーブロックの指定が重なったとしてもメモリーのバイトは正常にコピーされます。
mem_copy(a1, a2, i) は次と等価です: poke(a1, peek({a2, i})) しかしこれより早いです。 |
用例: | |
dest = allocate(50) src = allocate(100) poke(src, {1,2,3,4,5,6,7,8,9}) mem_copy(dest, src, 9) | |
関連事項: | mem_set, peek, poke, allocate, allocate_low |
書式: | mem_set(a1, i1, i2) |
解説: | アドレスa1からi2バイトまでi1の値を設定します。 |
注釈: | 実際のところ下位8bitのi1はバイトごとに格納されます。
mem_set(a1, i1, i2) は等価です: poke(a1, repeat(i1, i2)) しかしこれより早いです。 |
用例: | |
destination = allocate(1000) mem_set(destination, ' ', 1000) -- メモリーには32の値が1000バイト設定されます。 -- (アスキーコード(10進数半角空白): ' ') | |
関連事項: | mem_copy, peek, poke, allocate, allocate_low |
動作環境: | WIN32 |
書式: | include msgbox.e i = message_box(s1, s2, x) |
解説: | s2には表示するウィンドウのタイトルが、s1にはガイドメッセージ文字列がs1に入ります。xにはいくつか他の機能の特徴を付加したユーザが押すことができるボタンの組み合わせを決定します。xはアトムまたはシーケンスです。なお、返値が0の場合はウィンドウの設定に失敗したことを意味します。 |
注釈: | msgbox.eにはxおよびiで利用可能な値の完全なリストが掲載されています。 |
用例: | |
response = message_box("Do you wish to proceed?", "My Application", MB_YESNOCANCEL) if response = IDCANCEL or response = IDNO then abort(1) end if | |
プログラム例: | demo\win32\email.exw |
動作環境: | DOS32, Linux |
書式: | include mouse.e mouse_events(i) |
解説: | この手続きはget_mouse()で検出して欲しいマウスイベントを指定します。規定値ではget_mouse()は全てのイベントを検出します。mouse_events()はプログラム実行中など様々な段階で呼び出して、検出するイベントを変更することができます。Linuxでは、現在のところmouse_events()は無効なります。 |
注釈: | I重要なイベントを取りこぼす恐れを減らすために、特に非常に頻繁な頻度で発生するカーソル移動(MOVE)イベントといった不要なイベントを無効にすることはよい習慣です。
最初に mouse_events()が呼ばれたとき、マウスポインタを表示するか文字を強調表示します。 |
用例: | |
mouse_events(LEFT_DOWN + LEFT_UP + RIGHT_DOWN) -- 左ボタンの押上・押下と、 右ボタンの -- 押下の報告を禁止します。 -- なお、他のイベントは全て無視されます。 | |
関連事項: | get_mouse, mouse_pointer |
動作環境: | DOS32, Linux |
書式: | include mouse.e mouse_pointer(i) |
解説: | iが0ならばマウスポインタを非表示にして、それ以外の値は表示をします。ポインタ非表示の多重呼び出しは、再表示時に表示の多重呼び出しが要求されます。最初にget_mouse()またはmouse_events()が呼ばれたときポインタを表示します(一度だけ)Linuxでは、現在のところmouse_pointer()は無効になります。 |
注釈: | スクリーンを更新するとき一時的にマウスポインタを非表示にする必要があるかもしれません。
text_rows()を呼出し後に再びマウスポインタを表示するためにmouse_pointer(1)を呼ばなければいけないかもしれません。 |
関連事項: | get_mouse, mouse_events |
書式: | x2 = not_bits(x1) |
解説: | x1の各ビットごとに論理NOT演算を行います。x1の対応するビットが0であるときx2は1になり、x1の対応するビットが1であるときx2は0になります。 |
注釈: | この関数の引数はアトムまたはシーケンスである必要があります。演算規約はシーケンスに対して適用されます。
整数・負数のいずれであっても、引数は32bit整数で表現可能な範囲である必要があります。 もし32bitの値をすべて操作するのであれば、変数を整数ではなくアトムとして宣言する必要があります。なおEuphoriaの整数型は31bitまでの制限があります。 結果は負数として処理されます。そして最上位ビットが1のときは負数になります。 |
用例: | |
a = not_bits(#000000F7) -- a は -248 (すなわち、FFFFFF08は負数として解釈されます) | |
関連事項: | and_bits, or_bits, xor_bits, int_to_bits |
書式: | i = object(x) |
解説: | xがobject型であるかどうか調べます。常に真であり、object()は常に1を返します。 |
注釈: | 全ての定義済み・ユーザ定義型の値が型に属しているか調べるための関数としても使用できます。またobject()の完全性のためだけに含まれています。なお常に1を返します。 |
用例: | |
? object({1,2,3}) -- 常に1を表示する。 | |
関連事項: | integer, atom, sequence |
書式: | fn = open(st1, st2) |
解説: | ファイルまたはデバイスを開いて、ファイル番号を取得します。-1が返されたときは処理が失敗しています。st1はファイルまたはデバイスのパス名です。 st2はどのモードでファイルを開くか指定します。使用可能なモードは次のとおりです:
"r" - 読み込みモードでテキストファイルを開きます。 "rb" - 読み込みモードでバイナリファイルを開きます。 "w" - 書き込みモードでテキストファイルを作成します。 "wb" - 書き込みモードでバイナリファイルを作成します。 "u" - 更新モードでテキストファイルを開きます(読み込みと書き込み)。 "ub" - 更新モードでバイナリファイルを開きます。 "a" - 追記モードでテキストファイルを開きます。 "ab" - 追記モードでバイナリファイルを開きます。 読み込みまたは更新のために開くファイルは既に存在している必要があります。書き込みは追記のために開くファイルは必要に応じて作成されます。書き込みモードでファイルを開く場合0バイトに設定されます。追記モードでファイルを開く場合はファイルの終端から出力が行われます。 DOSまたはWindowsでは、テキストファイル出力時に自動的にキャリッジリターン文字(CR)をラインフィード文字(LF)の前に付加します。入力時にキャリッジリターン文字(CR)は除去されます。Ctrl+Z文字(ASCIIコード26)はファイルの終端(EOF)を意味します。注意事項:いくつかのDOSバージョンにおいて、Ctrl+Zを標準入力に対してユーザが打鍵するとDOSウィンドウを閉じるまでCtrl+Zの記号^Zが表示されたままになる原因になるかもしれません。 バイナリファイルのI/Oはどのような方法であっても変更がされません。0から255までの任意のバイト値を読み書きすることができます。LinuxおよびFreeBSDでは、すべてのファイルがバイナリファイルとして扱われ、"r"は"rb"と、"w"は"wb"と、""u""は"ub"と、"a"は"ab"とモードが等価になります。 DOSまたはWindowsでは、開くことのできる標準デバイスは次のとおりです:
"CON" - コンソール(スクリーン) "AUX" - シリアル補助ポート "COM1" - シリアルポート1 "COM2" - シリアルポート2 "PRN" - パラレルポート(プリンタ出力) "NUL" - 存在しないナルデバイス(出力の破棄) 現在のところ、2GBまでのファイルを扱うことができます。それ以上を超えたときは、いくつかのファイル操作は正常に動作しないかもしれません。将来この制限は改善または廃止される予定です。 |
注釈: | DOS32:
Windows95以降で動作させるとき、既に存在する任意のファイルを長いファイルまたはディレクトリ名を含むパス(すなわち、DOS標準8.3形式より長い形式)で開いて任意のモードで読み書きなどを行うことができます。しかし、新規ファイルを作成("w"またはa"で開いてファイルが存在しない)するときはファイル名は8.3形式に丸め込む必要があります。将来のリリースでは新機能として長いファイル名の作成をサポートすることを希望します。
WIN32, Linux および FreeBSD: 長いファイル名の読み書きや作成を完全にサポートしています。 DOS32: 標準デバイス名をファイル名に使用したり、拡張子として使用しないように注意してください。例えば、CON.TXT, CON.DAT, CON.JPGなど。これらは全てCONデバイスを参照しており、ファイルではありません。 |
用例: | |
integer file_num, file_num95 sequence first_line constant ERROR = 2 file_num = open("myfile", "r") if file_num = -1 then puts(ERROR, "couldn't open myfile\n") else first_line = gets(file_num) end if file_num = open("PRN", "w") -- プリンター出力を開く。 -- on Windows 95: file_num95 = open("bigdirectoryname\\verylongfilename.abcdefg", "r") if file_num95 != -1 then puts(1, "it worked!\n") end if | |
関連事項: | close, lock_file |
動作環境: | WIN32, Linux, FreeBSD |
書式: | include dll.e a = open_dll(st) |
解説: | Windows ダイナミックリンクライブラリ(.dllファイル)またはLinux共有ライブラリ(.soファイル)を開きます。成功した場合は32bitアドレス値が返値として返されますが、返値が0の場合は失敗でありファイルが見つからないことを意味します。stには絶対含んだは相対パスを含んだファイル名を指定します。なお、Windowsの場合は通常.dllファイルをパスから検索して使用します。 |
注釈: | open_dll()によって得られた返値は、そのままdefine_c_proc(), define_c_func(), または define_c_var()にて使用できます。
なお、同じパスの.dllまたは.soファイルを何度でも開くことができます。そのときは別途メモリーを使用されませんし、各々の返値は同一のものとなります。 また、プログラムが終了した場合Euphoriaは自動的に.dllを開放します。 |
用例: | |
atom user32 user32 = open_dll("user32.dll") if user32 = 0 then puts(1, "Couldn't open user32.dll!\n") end if | |
関連事項: | define_c_func, define_c_proc, define_c_var, c_func, c_proc, platform.doc |
書式: | x3 = or_bits(x1, x2) |
解説: | x1とx2に対応するビット間に対して論理OR演算を行います。x1とx2の対応するビットがどちらか1のときx3が1となります。 |
注釈: | この関数の引数はアトムまたはシーケンスである必要があります。演算規約はシーケンスに対して適用されます。
整数・負数のいずれであっても、引数は32bit整数で表現可能な範囲である必要があります。 もし32bitの値をすべて操作するのであれば、変数を整数ではなくアトムとして宣言する必要があります。なおEuphoriaの整数型は31bitまでの制限があります。 結果は負数として処理されます。そして最上位ビットが1のときは負数になります。 |
用例1: | |
a = or_bits(#0F0F0000, #12345678) -- a は #1F3F5678 | |
用例2: | |
a = or_bits(#FF, {#123456, #876543, #2211}) -- a は {#1234FF, #8765FF, #22FF} | |
関連事項: | and_bits, xor_bits, not_bits, int_to_bits |