投稿
まげ MAGE_LOVEMARINE
CLS:GOSUB @A @A:PRINT"TEST":RETURN 実行すると、TESTと2回表示されてから、RETURN witout GOSUBエラーと出ます。でも、 CLS:SAMPLE DEF SAMPLE:GOSUB @A @A:PRINT"TEST":RETURN END なら、TESTと1回だけ表示して終わります。 わかってるんですよ? わかってるんですけど…なんか不安(^^;)。
1そうだね
プレイ済み
返信[1]
親投稿
otta777 otta777a
サブルーチン群の手前にENDを入れる癖を付けるとかどうでしょう?
0そうだね
プレイ済み
返信[2]
親投稿
確かに、思わぬところでユーザ定義命令やユーザ定義関数から戻ってしまうことを考えると心配ですね。でも、私は、ユーザ定義命令の中でGOSUBを使わなければならないほど、処理能力を要求されるプログラムを書いたりしないので、気になりません。
0そうだね
プレイ済み
返信[3]
親投稿
訂正します。「書いたりしない」は、正確には「書けない」なのですが、少し見栄を張りました。
0そうだね
プレイ済み
返信[4]
親投稿
ユーザー定義命令内でのGOSUBは命令表によると一応NGって事になってるんで、公式のOKが出るまではちょっと使うのは怖いですね…。
0そうだね
プレイ済み
返信[5]
親投稿
暫定仕様となりましたが、このような、問題を認識されておられるため、どこかの時点で、変更したいと考えて、将来変更されるとの回答をされたのだと思います。
0そうだね
プレイ済み
返信[6]
親投稿
まげ MAGE_LOVEMARINE
>otta777さん 問題はその「癖」で、実は最初、DEF SAMPLE:GOSUB @A:END:@A...で実行し、「Undefined label」って怒られて(^^;)、それでオヤッ!?と思った次第です。 >でんぺんさん その命令表のその件の前に、「DEF境界をまたがるGOTO/GOSUBはできない」って記述もありますよね。「またがなければできる」的なな。それに矛盾めいたことを感じ、試したらこんな結果でした。 >コータさん なるほどスロット指定ならDEFから外に飛べるんだ…って、結果は2!? A=1シカト!?(^^;) いや〜…言語つくるのって大変ですね。
0そうだね
プレイ済み
返信[7]
親投稿
確かに矛盾がありますよね〜。その後には「関数およびユーザー定義ステートメント内部では、GOSUBやON GOSUBは使用できない。」ともありますし…。 とりあえず総合した僕の認識では、DEF境界をまたがないGOTOなら使用できる(GOSUBはNG)、という事になってます(^^;
0そうだね
プレイ済み
返信[8]
親投稿
まげ MAGE_LOVEMARINE
>でんぺんさん ですね(^^)。そもそもは、「TEST "A"なら円を描き、TEST"B"なら四角を描く」的な動作をするDEFで、なるべくIFを使わない方向で考えて、行き着いてしまった現象でした。
0そうだね
プレイ済み
返信[9]
親投稿
なるほど〜。 そういう場合に、ちょっとSWITCH CASEっぽい書き方で以下のようなパターンもありますよ。 DEF TEST C$ REPEAT GOTO "@CASE_"+C$ @CASE_A 円を描く BREAK @CASE_B 四角を描く BREAK UNTIL 0 END
1そうだね
プレイ済み
返信[10]
親投稿
まげ MAGE_LOVEMARINE
>でんぺんさん BREAKって、地味に重宝しますよね(^^)。ありがとうございます♪
0そうだね
プレイ済み
返信[11]
親投稿
GOTOで飛んでもいいんですがBREAKにはループを抜け出すという意味があるんで、わかりやすいんですよね。 上記で言えばGOTOで終わりに飛ぶことも出来ますが、その場合は終わりに飛ぶとわかっていればいいですが、もしかしたら変なところに飛ぶかもしれないし、そういう意味ではBREAKはループを抜けるわけなので、その前のREPEATの範囲(UNTILまで)から抜けるというのが明確で良いというか。 てかまげさんはわかってるかもしれませんが、一応なんでGOTOじゃなくてBREAKなの?って人もいるかもしれないので、一応補足しておきました〜。
1そうだね
プレイ済み