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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0606
takazin=begriff安全なrepeat〜loopを作ってみた。13解決


takazin=begriff

リンク

2010/6/6(Sun) 15:18:26|NO.33071

HSPの機能や仕様のままで、repeat loop を再定義しました。
gotoでループを実装しているので途中で脱出しても安全です。

http://begriff.zxq.net/repeat.html



この記事に返信する


木村

リンク

2010/6/6(Sun) 16:35:22|NO.33078

 なまじっかrepeat〜loop構造が破綻していても普通に流れてしまうので、余り使いたくは
ない方法ですね。普通にgoto型でも成立しますし。
 後、バグありました。

#define DEF #ifdef DEF #undef repeat #undef foreach #undef loop #undef continue #undef break #undef cnt #define global repeat(%1=-1,%2=0) %tlpmod%i0%tlpcontinue%i0%tlpbreak%i0%tlpcnt%i=%2:%tlpcontinue*%p:if(%tlpcnt%p-%2 > ((%1)-1)&&(%1)>=0){goto %tlpbreak*%p} #define global foreach(%1) %tlpmod%i0%tlpmodvar%i=vartype(%1):%tlpvar%i=length(%1):%tlpcontinue%i0%tlpbreak%i0%tlpcnt%i=0:%tlpcontinue*%p:if(%tlpcnt%p > ((%tlpvar%o)-1)){goto %tlpbreak*%p}if(%tlpmodvar%o=5){if(varuse(%1.%tlpcnt%p)=0){goto %tlpmod*%p}} #define global foreach2(%1) %tlpmod%i0%tlpvar%i=length2(%1):%tlpcontinue%i0%tlpbreak%i0%tlpcnt%i=0:%tlpcontinue*%p:if(%tlpcnt%p > ((%tlpvar%o)-1)){goto %tlpbreak*%p} #define global foreach3(%1) %tlpmod%i0%tlpvar%i=length3(%1):%tlpcontinue%i0%tlpbreak%i0%tlpcnt%i=0:%tlpcontinue*%p:if(%tlpcnt%p > ((%tlpvar%o)-1)){goto %tlpbreak*%p} #define global foreach4(%1) %tlpmod%i0%tlpvar%i=length4(%1):%tlpcontinue%i0%tlpbreak%i0%tlpcnt%i=0:%tlpcontinue*%p:if(%tlpcnt%p > ((%tlpvar%o)-1)){goto %tlpbreak*%p} #define global loop %tlpmod*%o:%tlpcnt%o++%tlpcontinue:goto *%o:%tlpbreak*%o #define global continue %tlpcontinue:goto *%p #define global break %tlpbreak:goto *%p #define global cnt %tlpcnt%p #endif repeat 20 await 20 mes "A"+cnt if cnt=10 : goto *a continue *a mes "B" continue loop
 初行の#define DEFをコメントにするとHSP本来のrepeat〜loop形式に戻ります。
 新型continue命令がcntを増やしてくれないみたいです。



レノス

リンク

2010/6/6(Sun) 18:27:52|NO.33087

失礼は承知で、ちょっと指摘を……。

・repeat 回数を (%1) のまま比較に使うと危険。

#define global repeat(%1=-1,%2=0) \ %tlpmod%i0%tlpcontinue%i0%tlpbreak%i0%tlptimes%i=(%1):%tlpcnt%i=(%2):%tlpcontinue*%p:\ if(%tlpcnt%p-(%2) > ((%tlptimes %p)-1)&&(%o)>=0){goto %tlpbreak*%p} n = 3 repeat n mes "cnt = " + cnt n ++ wait 1 loop

・continue で cnt の値を変更する機能。

#define global continue(%1 = cnt_next_) \ %tlpcnt %p = (%1) : goto %tlpcontinue *%p #define global cnt (%tlpcnt%p) #define global cnt_next_ (%tlpcnt%p + 1) repeat 5 await 1 if ( cnt == 0 ) { mes "top" continue } mes "#" + cnt loop



KA

リンク

2010/6/6(Sun) 18:49:44|NO.33094

>>途中で脱出しても安全です。

 目的は否定しませんが、”危険”が分かっているのなら、それを回避させた方が
 動作的には速そうな気がします。



takazin=begriff

リンク

2010/6/6(Sun) 19:22:10|NO.33096

なるほど、みなさん参考になります。

>木村さん
バグには気づきませんでした。ご指摘ありがとうございます。

>レノスさん
>>repeat 回数を (%1) のまま比較に使うと危険。
そのとおりですね、ご指摘ありがとうございます。

>KAさん
>>”危険”が分かっているのなら、それを回避させた方が...
その通りだと思います、ご指摘ありがとうございます。

ただ本来ならば危険な行為を安全にすることで、めんどくささが少なくなると思うのです。
たとえば repeat loopの中で脱出して分岐したいとき、
本来ならばループ中でフラグを立てて breakしその後フラグ内容で分岐する
方法が考えられると思うのですが、
ループ内からgotoで直接脱出が可能であれば、コードや考え方がシンプルになると思うのです。

目的としてはコードを組んでいる最中に本筋と関係ないところで悩むということ減らせるかな
と思い作りました。



takazin=begriff

リンク

2010/6/6(Sun) 20:06:22|NO.33098

指摘にあったところを修正しました。
http://begriff.zxq.net/repeat2.html



KA

リンク

2010/6/6(Sun) 20:14:35|NO.33099

ふと思いましたが、おにたま氏に
break+goto
形式の、書式やら命令を”実装しろ”と、お願いするのも良いかと。

>>ループ内からgotoで直接脱出が可能であれば、コードや考え方がシンプルになると・・。
 確かに面倒くさいですね。



takazin=begriff

リンク

2010/6/6(Sun) 20:35:22|NO.33101

レノスさんのcontinue で cnt の値を変更する機能が
スマートですね。そのまま使わせていただきます...



kweb(xor)

リンク

2010/6/6(Sun) 21:38:42|NO.33103

repeat 〜 loop で loop 部分を削除してコンパイル実行するとエディタが落ちました(^^;
そんなわけのわからないことはしないと思いますが^^;

Windows 7 64bit



takazin=begriff

リンク

2010/6/6(Sun) 21:54:42|NO.33104

そんな事例が前にもいわれていましたよね、、、
書き忘れただけでエディタが落ちられたら
安全も何もないですね。

エラーが出るならまだしも 今まで書いていたコードが消えてしまったら・・・



takazin=begriff

リンク

2010/6/6(Sun) 22:12:59|NO.33106

落ちないようにしました。
http://begriff.zxq.net/repeat2.html



retret

リンク

2010/6/7(Mon) 11:54:33|NO.33120

ルールから逸脱しようというスレ。
repeat-loop中にgotoでループ外へ抜けることは「違反」です。
ネストレベルが増えて「危険」というレベルではないのです。
「抜けないように書かなければいけない」という「制約」です。
それによってコーディングの構造化が保たれるというのに
そのルールを取り払って構造化をなし崩しにしていけば、
それはメンテナンスのしにくい「悪いプログラムコード」となり、
「HSPプログラム診断室」として藤原氏に取り上げられることでしょう。



レノス

リンク

2010/6/7(Mon) 18:47:43|NO.33125

> 「抜けないように書かなければいけない」という「制約」
これは単に repeat-loop の仕様で決められただけです。

反復の文から return や外に goto (多重ループ脱出)するのは、
よくある書き方だと思います。

> (それ以外)
goto の問題であって、repeat-loop とは関係ないのでは。

----
> break+goto 形式の、書式やら命令
なにそれ欲しい。

----
1レスにいろいろ詰め込んで申し訳ないですが:
> loop 部分を削除してコンパイル実行するとエディタが落ちました
> 別スレ「#defineでエラーが出るべきところでエラーが出ない」
少し前に bug-track に報告したバグと、原因が同じのようなので、
次回のリリースで直ると思います。



info

リンク

2010/6/7(Mon) 21:53:04|NO.33128

>>break+goto 形式の、書式やら命令
欲しい
break+returnも欲しい

問題は多そうですが。



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