今の言語仕様やライブラリはココが足りないんじゃ…、エディタや周辺ツールにこんな機能が必要なのでは…!?このような要望、具体的な提案などがありましたら、こちらのフォーラムをご活用ください。
konisi
記事: 893 登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:
#1
投稿記事
by konisi » 2007年12月27日(木) 00:49
ふと、次のように書けたら便利かなと思いました。
(宣言は省略しています。)
before:
コード: 全て選択
For i=0 To min(a,b)
...
Next
Function min(v1 As Long,v2 As Long) As Long
If v1<=v2 then
return v1
Else
return v2
End If
End Function
after:
コード: 全て選択
For i=0 To (a,b)'もちろん、Stepに負数が指定されている場合はmax(a,b)として認識。
'そして引数の個数も3つ4つ指定可。
...
Next
ところで、次のように書いてもコンパイルが通るのはバグですか?(in ab423)
コード: 全て選択
For i=0,25,1'ToやStepをカンマにしても通ってしまう!
...
Next
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#2
投稿記事
by イグトランス » 2007年12月27日(木) 11:14
Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。
結局Min, Maxを明示するのがよいと思います。入力の手間はエディタの補完機能に期待しましょう(前にも書いたばかりの気がしますけど)。
konisi
記事: 893 登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:
#3
投稿記事
by konisi » 2007年12月27日(木) 18:15
Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。
結局Min, Maxを明示するのがよいと思います。
確かに言われてみれば明示したほうが可読性の面でもよさそうに思えます。
#引数の数が不特定なmin関数やmax関数は組み込んで欲しいところですが・・・。
tak
記事: 162 登録日時: 2005年5月31日(火) 07:49
#4
投稿記事
by tak » 2008年1月15日(火) 09:08
コード: 全て選択
For i=0 To min(a,b)
...
Next
これだとループして先頭に戻るたびに min(a,b) が評価されて非効率的なので(ループの中で a や b が変化するなら話は別)、For の前で c = min(a, b) して For i = 0 To c したいと思ってしまう自分は相当古い頭なのかもしれません...orz
> #引数の数が不特定なmin関数やmax関数は組み込んで欲しいところですが・・・。
そこで cdecl ですよ。たしか cdecl 規約の関数の定義はできるようになってたはず・・・。
あるいは VB6 の ParamArray のような機構があれば、そちらが正統派になるかも。
konisi
記事: 893 登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:
#5
投稿記事
by konisi » 2008年1月15日(火) 22:07
cdeclに関して、今確認してきました。
何故かリポジトリの300位からXMLのエラーがどうとかでコンパイルできないため、
とりあえずcp3で試してみました。
コード: 全て選択
Function cdecl Add(A As Long, ...) As Long
End Function
Add(2,1,1)
BasicCompiler さんが書きました: 最適化中...
コンパイル中...
1.abp(1) - [警告] "..." 型が指定されていません。Double型として扱います。
1.abp(4) - "Add" のパラメータ指定が間違っています
1.abp(4) - "1" 無効な識別子です
-----------------------------------------------------
コンパイルは中断されました(エラー:2、警告:1)。
文法ミスしていますか?
tak
記事: 162 登録日時: 2005年5月31日(火) 07:49
#6
投稿記事
by tak » 2008年1月16日(水) 06:31
あれー?
とりあうず cdecl による引数渡しが実装されただけで、可変引数はサポートされていないんですかね?
まあどのみち、最初に引数の数を与えてやらないといけないので、問題大ありなんですが。
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:
#7
投稿記事
by イグトランス » 2008年1月16日(水) 12:42
可変個引数は,DLL関数へ渡すときにしか使えないですね。
SPrintfでは,追加の引数0個から10個までを多重定義するという力技で乗り切りました。
max, minの場合さらに引数型をジェネリックにしたいのですが,ただの関数にジェネリックってできましたっけ?
konisi
記事: 893 登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:
#8
投稿記事
by konisi » 2008年1月16日(水) 21:00
C++等では、ただの関数にジェネリックを適用する事は許可されているようです。
Wikipedia
ABの場合、引数のどれか一つでもByVal参照で受け取っておけばVarPtrを使って別の引数を容易に取得できるので、
記述「...」を許可すれば最低限の事は出来そうです。
コード: 全て選択
#console
Sub Test(A As Long,B As Long)
Dim arg As VoidPtr
arg=VarPtr(A)
Print GetDWord(arg-4)'eipも取得できる。
Print GetDWord(arg) As Long'第一引数
Print GetDWord(arg+4) As Long'第二引数
'32bitなら、第n引数へのポインタ=arg+4*(n-1)
End Sub
Test(1,342)
Sleep(-1)
#あとは置換型のマクロでもあればと思ってしまいました。
#minやmaxでは整数型と実数型以外に扱うものがないと思うので、標準libに入れるだけならオーバーロードすればいいだけかもしれません。応急手当みたいで嫌ですが。