HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1025
domoHSPでwith-endwith構文♪1解決


domo

リンク

2009/10/25(Sun) 23:44:21|NO.28547

VBなのではお馴染みのwith文を作りました。
これを応用してRECT構造体などの各メンバへのアクセスもマクロ化できるのでは?と予想を立てています。
とりあえずwith文で遊んでみてください。
そして気に入ればuserdef.asに書き込んでデフォルトで使用できるようにしましょう。


// With - EndWith // %twith %s1 ... 引数パラメータ(変数名)をスタックに積む #define global with(%1) %twith %s1 // %twith %p ... スタックに詰まれた一番上(身近なwith文)の変数名に置き換えられる #define global this %twith %p // %twith %o0 ... スタックから変数名を下ろす #define global endwith %twith %o0
本家with文とは多少異なりますが、用途はこれで十分かと。
マクロの色分けがされないので通常の変数と混同しないように注意したいです。
以下サンプル(with文を定義してください)

#include "user32.as" // もっとも単純なサンプル with varname this = 5 mes this endwith // ネストも可能なサンプル with nest1 this = "ネスト1です" with nest2 this = "ネスト2です" endwith endwith mes nest1 mes nest2 // 配列も指定できるサンプル dim array, 5 with array foreach this this.cnt = cnt loop endwith foreach array mes array.cnt loop // 最も感謝されるサンプル screen 1: objsize 200 button gosub "別ウィンドウで再生", *copy button gosub "クリア", *clear with MouseCursorPoint_by_ClientCoordinates ; 分かりやすいけどタイプするのが大変…@@; dim this, 2 ; x,y repeat wait 1 this.0.cnt = mousex: this.1.cnt = mousey line this.0.cnt, this.1.cnt loop *clear dim this, 2 ; 初期化 color 255,255,255: boxf: color 0 pos 0, 0 return *copy screen 2 repeat length2(this) wait 1 line this.0.cnt, this.1.cnt loop gsel 1 return endwith



この記事に返信する


domo

リンク

2009/10/26(Mon) 00:17:35|NO.28548

使用上の注意

長い変数名に対して#defineで置き換えても構いませんが、
#defineによるエイリアスの置き換えは、変数ごとに定義する必要があります。
with-endwith文の意義は、

局所的な範囲において同一の変数へ連続的にアクセスする際にエイリアスthisを提供する
ことにあります。
また、thisキーワードひとつで複数の変数名のエイリアスにもなりえます。
with文のネストは好まれません。
画面内にwith-endwithが収まる範囲を目安として使用するようにしましょう。

また、thisキーワードは変数名以外にも置き換えることができます。

with "hello.world" mes this endwith



ONION software Copyright 1997-2023(c) All rights reserved.