Constによる定数・関数宣言の扱いを,Cの#defineと同様(すなわち,コードが当該部分に埋め込まれた状態になる)にできないでしょうか?
RGB関数とかで変数を引数に取れないのは辛いです。
それにそうしておけばConstの幅が広がりますし,また高速化にも役立てることができそうですし。
Constに対する要望:Cの#defineと同様にできませんか?
Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。
http://www.discoversoft.net/help_center ... /Const.htm
「マクロ関数の呼び出しは通常の関数呼び出しと同様に行うことができます。arglistで指定する引数がすべてリテラル値または定数値の場合に限り、そのマクロ関数を定数の代入値expressionとして利用することができます。」
言語仕様はこのようになっています。
#N88BASIC
Dim a As Long
Dim b As Long
Dim c As Long
b=&H12
c=&H34
a=RGB(&H56,c,b)
Print Hex$(a)
#includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。
http://www.discoversoft.net/help_center ... /Const.htm
「マクロ関数の呼び出しは通常の関数呼び出しと同様に行うことができます。arglistで指定する引数がすべてリテラル値または定数値の場合に限り、そのマクロ関数を定数の代入値expressionとして利用することができます。」
言語仕様はこのようになっています。
#N88BASIC
Dim a As Long
Dim b As Long
Dim c As Long
b=&H12
c=&H34
a=RGB(&H56,c,b)
Print Hex$(a)
#includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。
> Const定義の右辺値やDim定義の配列要素指定を除けば、RGBなどのマクロ関数(Const定義されたもの)であっても、パラメータに変数を渡すことはできます。
Const RGB(r As Byte, g As Byte, b As Byte)
型を指定できるとありがたいです。
> #includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
> 個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。
#defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
#ifdefとかがほしいですね。
API定義ファイルを作っていて「定義済みです。」というエラーを見るのは結構辛いです。
Const RGB(r As Byte, g As Byte, b As Byte)
型を指定できるとありがたいです。
> #includeと同様、#defineの導入も考えたことがあるんですが、万が一、#defineを多重したプログラムが作成されたとすると、エラーの突き止めが難しくなるという意見がありました。そこで、演算にのみ特化したステートメントとしてConstを取り入れたというワケです。
> 個人的には#defineを多用してエラー個所がわからなくなってしまったことはあまりないので、必要であれば、、、という感じです…。
#defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
#ifdefとかがほしいですね。
API定義ファイルを作っていて「定義済みです。」というエラーを見るのは結構辛いです。
> 型を指定できるとありがたいです。
マクロ関数とは、コンパイル時に、関数が定義した式に置き換えられるアレですよね。
ということは、関数とは名ばかりで、どちらかというと式に近い物だと思います。
ABでは式に型を持たせる、C言語でいうところの型キャストのような機構がないので、無理だと思います。
> #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> #ifdefとかがほしいですね。
そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。
マクロ関数とは、コンパイル時に、関数が定義した式に置き換えられるアレですよね。
ということは、関数とは名ばかりで、どちらかというと式に近い物だと思います。
ABでは式に型を持たせる、C言語でいうところの型キャストのような機構がないので、無理だと思います。
> #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> #ifdefとかがほしいですね。
そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。
> > #defineの導入よりも既に登録済みキーワードでコンパイラを制御できる
> > #ifdefとかがほしいですね。
>
> そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
> 僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。
私はその場合も#defineは#ifdef/#ifndef専用にしてマクロ置き換えには使えないようにする方が良いと思います。
それに現在、C++やそれよりもさらに後に作られた言語では#~の類は廃止しようとする方向へ進んでいるようです。
(const定数やinline/template関数などへ)
高速化なんてのもABのコンパイラがConst関数を機械語レベルでインライン展開するように改良すれば済むのではないでしょうか。
(もちろんそう簡単に出来ることではないのはわかっていますが)
> > #ifdefとかがほしいですね。
>
> そうですね。条件付きコンパイルが可能になれば開発工程での柔軟性も増しますし。
> 僕の場合、デバッグ時専用コードを条件付きコンパイルで埋め込んだりするので、#ifdefがあるのなら#defineは必須となります。
私はその場合も#defineは#ifdef/#ifndef専用にしてマクロ置き換えには使えないようにする方が良いと思います。
それに現在、C++やそれよりもさらに後に作られた言語では#~の類は廃止しようとする方向へ進んでいるようです。
(const定数やinline/template関数などへ)
高速化なんてのもABのコンパイラがConst関数を機械語レベルでインライン展開するように改良すれば済むのではないでしょうか。
(もちろんそう簡単に出来ることではないのはわかっていますが)
バグかもしれません
どうやら,ただのConstのバグのような気が・・・。
最初実験した時は,こんなコードを使っていました。
これだと「"RGB(0,0,u)" 無効な識別子です」となるので今回の質問をしたわけです。ところが
とすると,正常に動作しました。
また,実際に描画のプログラムを作ってみたときも正常に動作しました。
最初実験した時は,こんなコードを使っていました。
コード: 全て選択
#N88BASIC
Dim u As Long
u=255
Print RGB(0, 0, u)
コード: 全て選択
#N88BASIC
Dim u As Long
u=255
Print (RGB(0, 0, u))
また,実際に描画のプログラムを作ってみたときも正常に動作しました。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================