====== 基本文法・演算・文字列 ====== [[erabasicリファレンス|リファレンストップ]] · [[erabasicリファレンス_総索引|名前の総索引]] コメント、行の連結、数値・文字列の表記、演算子、FORM構文を調べます。 ===== 行末コメント ===== A = B ;AにBを代入 このように行の末尾にコメントを挿入できます\\ ただし、一部例外があり、「PRINT」命令のように引数が単純文字列の命令の場合にはコメント化されず文字列の一部と評価されます\\ PRINT foobar;ほげほげ この場合、「foobar;ほげほげ」がPRINTされます\\ ===== 行の連結 ===== { DIM CONST HOGE = 1,2,3,4 と書くと「#DIM CONST HOGE = 1,2,3,4」と解釈されます\\ '{'、'}'の行にはホワイトスペース以外の他の文字が存在してはなりません\\ 改行記号のある位置には半角スペースが補われます\\ つまり関数名・変数名の途中で行を分割することはできないほか、\\ PRINTなどを分割すると表示文字列の中に改行だった半角スペースが含まれます\\ Emueraの文法解釈において行連結処理はコメントの解釈より先に行われます\\ つまり\\ { #DIM CONST HOGE = 1,2,3,4 ;コメント ,5,6,7,8 は「#DIM CONST HOGE = 1,2,3,4 ;コメント ,5,6,7,8」となり、\\ 「,5,6,7,8」は行末コメントの一部とみなされ無視されます\\ ===== 特別なコメント行 ===== ==== ;!; ==== Emuera、eramakerのいずれでも、;で始まる行はコメント行とみなされますが、Emueraは;!;で始まる行はコメントではなく有効な行とみなします。\\ eramakerでは実行してほしくない文を記述する際に使ってください。\\ 例えば@SHOWSHOPに以下のスクリプトを加えるとEmueraでの動作を禁止できます。\\ ;!;PRINTW このスクリプトはEmueraでは実行できません ;!;QUIT また、[SKIPSTART]や[SKIPEND]と併用することで、以下のスクリプトのようにEmuera以外での動作を禁止できます。\\ Emuera以外では実行してほしくない文を記述する際に使ってください。\\ ;!;[SKIPSTART] PRINTW このスクリプトはEmuera以外では実行できません QUIT ;!;[SKIPEND] ==== ;#; ==== ;#;で始まる行はデバッグモード時のみ実行されます。\\ 非デバッグモード時ではコメント行と見なされ実行されません。\\ ただし、DEBUG系命令は元々非デバッグモード時には無視されるので、;#;を行頭に付ける必要はありません。\\ 同様にデバッグ変数も非デバッグモード時には空文字列又は0のため、エラーの心配はありません。\\ デバッグモードについてはこちらを参照してください。\\ ===== 整数型の値の範囲 ===== eramakerで扱える整数は32ビット符号付整数、すなわち-2147483648〜2147483647の範囲です。\\ Emueraでは吉里吉里と同じく64ビット符号付整数、-9223372036854775808〜9223372036854775807の範囲の値を扱います。\\ ===== FORM構文を用いた文字列変数への代入 ===== 文字列変数への代入の際、PRINTFORMと同じ形式で代入する文字列を指定できます。\\ SAVESTR:0 = %RESULTS% この文でSAVESTR:0にRESULTSの中身を代入することができます。\\ 同じ文はeramakerではSAVESTR:0に%RESULTS%という文字列そのものを代入したことになります。\\ Emueraで%RESULTS%という文字列そのものを代入したい場合、以下のように書いてください。\\ SAVESTR:0 = \%RESULT\% \記号の直後の文字はシステム記号として扱われません。\\ \記号自体を文字列に含めたい場合は\\としてください。\\ あまりないケースですが、eramakerとEmueraで同じ動作をさせたい場合は以下のように書く必要があります。\\ ;!;SAVESTR:0 = \%RESULT\% ;!;[SKIPSTART] SAVESTR:0 = %RESULTS% ;!;[SKIPEND] ===== 文字列式を用いた文字列変数への代入 ===== ver1813以降のEmueraでは新たに、代入演算子'=と文字列式を用いて文字列変数への代入を行うことができます。\\ ;「STR = あいう」と同様 STR '= "あいう" ;「STR = %TSTR:0%いろは」と同様 STR '= TSTR:0 + "いろは" ===== 書式付文字列(FORM構文) ===== PRINTFORMなどでつかわれる書式付文字列のうち、{}、%%に表示桁数(文字数)を指定できます。\\ {変数・数式等, 表示桁数, 揃え(LEFT or RIGHT)}、%変数、文字列式等, 表示桁数, 揃え(LEFT or RIGHT)%という形式で指定します。\\ 文字数は全角文字を2文字と数えます。\\ 表示桁数(文字数)に足りない部分は半角スペースが追加されます。\\ 通常は右揃えですが、キーワードLEFTを指定すると左揃えになります。\\ 指定された表示桁数よりもとの桁数の方が大きい場合、そのまま表示します。\\ A = 123456 STR:0 = あいう PRINTFORML [{A}] PRINTFORML [{A,10}] PRINTFORML [{A,10,LEFT}] PRINTFORML [%STR:0%] PRINTFORML [%STR:0,10%] PRINTFORML [%STR:0,10,LEFT%] PRINTFORML [{A,2}] PRINTFORML [%STR:0,2%] ;結果 [123456] [ 123456] [123456 ] [あいう] [ あいう] [あいう ] [123456] [あいう] ===== 文字列式中での書式付文字列(FORM構文)の使用 ===== PRINTSやユーザー定義の式中関数の引数といった文字列式中でFORM構文を使用するとエラーになります。\\ そのため文字列式中で書式付文字列を使用する場合、文字列式中で定文字列を使うときに"〜"を使用するのと同じように\\ @"〜"を使用します。 また、@"〜"の中の文字列が\@〜\@を用いた三項演算子による記載のみである場合、@"〜"を省略して直接\@〜\@と書くことができます\\ 正しい例 ;代入はFORM構文 STR:0 = あいう ;加算は文字列式 RESULTS += STR:0 ;文字列式に定文字列を使用する例 RESULTS += "えお" ;文字列式にFORM構文を使用する例 PRINTS @"%RESULTS%かきくけこ" ;以下の4行はすべて同じである PRINTS STR:0 + "!" PRINTFORM %STR:0%! PRINTS @"%STR:0%!" PRINTFORM %STR:0 + "!"% 間違った例 ;中身が「RESULTS」になる STR:0 = RESULTS ;エラーが出る RESULTS += えお ;エラーが出る RESULTS += %STR:0% ;「@"」と「"」も表示される PRINTFORM @"%RESULTS%かきくけこ" ===== INPUTS系でのマクロ構文の使用 ===== INPUTSやそれに類する入力受付命令で、マクロ式を用いることができます。\\ マクロの書式については利用方法のマクロの項目を確認してください。\\ マクロ構文を使わず、単なる文字列として()を使用する場合、\を用いてエスケープしてください。\\ ===== 演算子 ===== ==== 単項演算子 ==== * ~ ビットごとの否定(ビットごとのNOT) 単項演算子(優先度最大) * ! 論理否定(NOT) 単項演算子(優先度最大) ==== 二項演算子 ==== * << 左ビットシフト。比較やビット演算より優先度が高く、四則演算より低い。 * >> 右ビットシフト。比較やビット演算より優先度が高く、四則演算より低い。 * ^ ビットごとの排他論理和(ビットごとのXOR) 優先度は&、|と同じ * ^^ ビットによらない排他論理和(ビットによらないXOR) 優先度は&&、||と同じ * !& ビットによらない否定論理積(ビットによらないNAND) 優先度は&&、||と同じ * !| ビットによらない否定論理和(ビットによらないNOR) 優先度は&&、||と同じ ==== 三項演算子 ==== * ?〜# 普通の三項演算子 優先度は=の上で他の演算子より下(判定および結果を先にまとめてから処理される) * 書式(数値) :<代入先変数> = <条件式> ? <真の場合の代入値> # <偽の場合の代入値> * 書式(文字列):<代入先変数> = \@<条件式> ? <真の場合の代入値> # <偽の場合の代入値>\@ 処理的には\\    IF <条件式>      <代入先変数> = <真の場合の代入値>    ELSE      <代入先変数> = <偽の場合の代入値>    ENDIF と同じになります。\\ なお、数値の三項演算子については、()の中に入れることにより、通常の計算の中で使うこともできますし、文字列の三項演算子については、そのままPRINTFORM系命令に使うことができます。\\ ただし、\@〜\@形式の三項演算子では#を省略することはできません。\\ ==== 代入演算子 ==== '= 文字列式を用いた文字列型変数への代入を行う演算子 詳しくはこちら\\ ==== インクリメント・デクリメント ==== - インクリメント\\ * デクリメント 代入文の代わりに使います。他の演算子と組み合わせることはできません。\\ ===== 演算子の優先度表 ===== 分類 優先度 代入複合演算 記号 否定演算子 高 × ~, ! 算術演算子 ↑ ○ *, /, % ○ +, - ビットシフト演算子 ○ <<, >> 比較演算子 × <, >, <=, >= × ==, != 論理演算子 ○ &, |, ^ ↓ × &&, !&, |?|, !|, ^^ 三項演算子 低 × 〜?…#_ ===== 数値と文字列の演算 ===== * == 文字列同士の比較。数値と文字列を比較することはできません。 * != 文字列同士の比較。 * < 文字列同士の比較。比較は先頭から行われ、異なる文字が見つかった時点で決定されます。 * > 文字列同士の比較。 * <= 文字列同士の比較。 * >= 文字列同士の比較。 * + 文字列同士の連結。数値と文字列を加算・連結することはできません。 * * 文字列と整数の乗算。文字列と文字列を乗算することはできません。 STR:0 = % "あ" * 10 % PRINTFORML STR:0 = "%STR:0%" WAIT  ;結果  STR:0 = "ああああああああああ" ===== 論理演算子の短絡評価 ===== 短絡評価とはたとえば(X && Y)という式でXが0である時、Yの値によらず演算結果が0になることが明らかなのでYを評価しない、という評価法です。\\ 吉里吉里を含む多くの言語では論理演算子を短絡評価します。\\ この評価法により以下のような書き方ができます。\\ IF (ASSI >= 0) && (NO:ASSI == 1) 〜〜〜 ELSE 〜〜〜 ENDIF ASSIが0以下の場合、(NO:ASSI == 1)の結果によらず全体の結果は0なのでNO:ASSIは参照されません。 したがってエラーも発生しません。\\ 評価順は左項が先、右項が後です。\\   IF (NO:ASSI == 1) && (ASSI >= 0) このように書くと先に(NO:ASSI == 1)を計算しようとするのでASSI < 0のときエラーになります。\\ ---- ===== 数値・文字列の表記 ===== ==== 定数の表記 ==== Emueraでは8進数表記を除き、吉里吉里で使える定数の表記がそのまま使えます。\\ 例えば以下の行は全て同じ意味になります。\\ X = 32 X = 0b100000 X = 0x20 X = 1p5 上から順に、普通の10進表記、2進数、16進数、1×2の5乗、になります。\\ 1p5のような表記はビット演算子と組み合わせ、各ビットを取得・設定したい時に便利です。\\ 例えば下の条件文はAの下0ビット目または3ビット目が立っているときに真になります。\\ IF (A & 1p0)||(A & 1p3) また、pの代わりにeを使うことでn×10のm乗を表せます。\\ 例えば13e3は13000に等しくなります。\\ 以上はあくまでも定数の表記ですので式を使うことはできません。\\ 以下のような表記はエラーになります。\\ X = 13e(A + 1) 8進数表記についてはeramakerとの互換性の問題から採用していません。\\ "012"は10ではなく12と解釈されます。\\