For~Next構文について

今の言語仕様やライブラリはココが足りないんじゃ…、エディタや周辺ツールにこんな機能が必要なのでは…!?このような要望、具体的な提案などがありましたら、こちらのフォーラムをご活用ください。
返信する
メッセージ
作成者
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

For~Next構文について

#1 投稿記事 by konisi »

ふと、次のように書けたら便利かなと思いました。

(宣言は省略しています。)
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
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。

結局Min, Maxを明示するのがよいと思います。入力の手間はエディタの補完機能に期待しましょう(前にも書いたばかりの気がしますけど)。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#3 投稿記事 by konisi »

Stepが正の値だけどmaxがいい,負の値だけどminがいいなどという需要も考えられます。また,Stepの正負でmin/maxが変化するのでは,どっちがどっちだか混乱しそうです。
結局Min, Maxを明示するのがよいと思います。
確かに言われてみれば明示したほうが可読性の面でもよさそうに思えます。

#引数の数が不特定なmin関数やmax関数は組み込んで欲しいところですが・・・。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#4 投稿記事 by tak »

コード: 全て選択

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 »

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)。
文法ミスしていますか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#6 投稿記事 by tak »

あれー?

とりあうず cdecl による引数渡しが実装されただけで、可変引数はサポートされていないんですかね?
まあどのみち、最初に引数の数を与えてやらないといけないので、問題大ありなんですが。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#7 投稿記事 by イグトランス »

可変個引数は,DLL関数へ渡すときにしか使えないですね。
SPrintfでは,追加の引数0個から10個までを多重定義するという力技で乗り切りました。

max, minの場合さらに引数型をジェネリックにしたいのですが,ただの関数にジェネリックってできましたっけ?
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#8 投稿記事 by konisi »

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に入れるだけならオーバーロードすればいいだけかもしれません。応急手当みたいで嫌ですが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
返信する