ようやく構文定義シリーズの続きです。最近は、前の構文定義シリーズが続いたときと似たような状況が続いています。つまり、またしばらく構文定義シリーズが続く見込みです。

さて、見返してみれば、次はLetステートメントの番です。代入を行う重要なステートメントですが、省略可能なのでほとんど忘れられているかわいそうな子です。例えば、公式のヘルプセンターですら堂々と代入が演算子であると書かれてしまっています。ここはCではありません。

今日のコードは全てAB 4.24です

Dim i As Long
Let i = 100

以前、試してみたところ、ABのLetステートメントは、単純代入以外にもいろいろ扱っている模様ということが分かりました。まずは複合代入です。

Dim i = 5 As Long
Let i += 10

ほかにもインクリメント・デクリメントがBASICの式の雰囲気がないように思いました。

Let i++

やっぱり。コンパイルできました。ところで、機能しているでしょうか?出力させてみます。

#prompt

Dim i As Long
i = &hffff
Let i And= &hff

Print Hex$(i)

FFと出力されました。問題なさそうです。


おもしろいことに、この単純代入、複合代入、インクリメント・デクリメントは、ちょうど私がABで演算子ではない、少なくとも他の演算子と同列に扱えないと思っているものと一致します。

これらが+や*そしてAndなど一般の演算子と最も異なる点は、部分式として使えないということです。逆に、これらもただの演算子であるCでは、*p++ = *q++(p = malloc(256)) != NULLのように代入やインクリメントも、式を構成する部分式になり得ます。逆に、部分式になれないABの代入やインクリメントなどは、演算子とは別の存在なのです。便宜上、演算子を名乗るにしても、ほかと区別する言葉が欲しいところです。


そろそろ、まとめにかかります。

Letステートメント
‘Let’? 左辺値 代入指定子 式
‘Let’? 左辺値 増減指定子
代入指定子
‘=’ | ‘*=’ | ‘/=’ | ‘\=’ | ‘Mod’ ‘=’ | ‘+=’ | ‘-=’ | ‘<<= ‘ | ‘>>=’ | ‘&=’ | ‘And’ ‘=’ | ‘Or’ ‘=’ | ‘Xor’ ‘=’
増減指定子
‘++’ | ‘–‘

上で散々と演算子と違うと言っておきながら、ここで演算子という言葉を出すなんてことをやりたくなかったので、代入指定子という妙な言葉を作る羽目になりました。増減指定子はついでです。

さて、Mod/And/Or/Xorだけは、アルファベットということで、2つ字句を並べる形にしました。しかし、今のコンパイラでは、i - = 10(間に空白がある)がコンパイルできることから、-と=を独立した字句として扱っているようです。それどころかi < < = 1i + +もできますね。Cなどでは、< <=や++は1つの字句なので、間に空白は挟めません。そのため、上の構文ではこれを無視しました。将来には字句解析を見直してコンパイルエラーにしたいです。

&=はヘルプに載っていませんし、コンパイルエラーにもなりましたが、統一性を取るために入れました。


ところで、このプログラムの5行目は、iとjに10を代入するという意味ではありません。答えはまた明日です。

#prompt

Dim i As Long, j As Long
Input j
i = j = 10
Print i, j

2008年2月8日19時00分修正


スポンサード リンク

この記事のカテゴリ