フォト
無料ブログはココログ

« 諦める力 〈勝てないのは努力が足りないからじゃない〉 | トップページ | IchigoJam BASICのFOR/NEXT (2) »

2015年4月 5日 (日)

IchigoJam BASICのFOR/NEXT

IchigoJamを試してみた。

このボードは電源ONでBASICが走るのだが、このBASICにはFOR/NEXTがない。この件について、作者の福野泰助氏がブログで「FOR NEXTが無い理由」を説明している。

かつてBASICでプログラミングした人はやはり多く、FOR/NEXTがない理由は気になるポイントのようです。代替が効くのでメモリを節約したいこともありますが、そもそも文法がわかりづらく、好みじゃないからです。

10 FOR I=0 TO 25
20  K=INKEY()
30  IF K<>ASC("A")+I GOTO 60
40 NEXT
50 PRINT "CLEAR!":GOTO 10
60 PRINT "GAVEOVER":GOTO 10

こちらFOR文を使った、AからZまでの間違えずに押すゲームプログラムですが、実は落とし穴があります。キーを打ち間違えるたびに、NEXTを通ってループが終了しないまま、再度FOR文に入るのでスタックが溢れてしまいます(同じ変数ならスタックを消費しない手もありはしますが、さらに文法がややこしくなる・・・)。また、FOR文の後に書かれた代入文で使う変数が、TO文で暗黙に使われるところも気持ち悪く、増減分を変更刷るにはSTEP文というまた別の用語を使わないといけません。

らしい。まとめると

  • メモリを節約したい
  • BASICのFOR/NEXTがきらい
  • FOR/NEXTループの中からGOTOでNEXTを飛び越えるとスタックがあふれる
  • FOR文の後に書かれた代入文で使う変数が、TO文で暗黙に使われる
  • 増減分を変更するにはSTEP文が必要

ということか。
いろいろFOR/NEXTのデメリットを挙げているのが、いずれも、作った側の事情だなあ。

 好き嫌いを別にすると、GOTOでNEXTを飛び越えるとスタックがあふれるという問題は昔からあるようだ。

○ 8052AH-BASIC(BASIC-52)のFOR/NEXTもNEXTをGOTOで飛び越えるとエラーが出る。Intelの考え方はエラーが出てもFOR/NEXTはあった方が良いということか。

○ 豊四季TinyBASICの 電脳伝説 Vintagechips さんも「FOR~NEXTの課題」で検討されている。

○ ず@沖縄さんとメカAGさんがそれぞれのブログで昔のBASICの実装について書いておられる。

 プログラムに始めて触れる子供を対象とするなら、ループ構造のないプログラミング言語を与えるデメリットの方がはるかに大きいと思う。

 8Queen問題を解いてみた。

 読み易く書いたらOut of memory になったので、最適化(^^;してみた。
ループは交差しているし(110~140、130~160)、そこらじゅうでRETURNしているし、いかにもBASICだ。初めてマイコンを買ったとき、こんなコードを書いてたよなあ...

IchigoJam 0.9.7 by @taisukef
OK

LIST
10 VIDEO 0
20 CLV
100 Y=1
110 X=1
120 IF Y=9 THEN GOSUB 300 : END
130 GOSUB 200
135 REM PRINT "Y=";Y;",X=";X
140 IF R=0 THEN [Y]=X : GOSUB 300 : Y=Y+1 : GOTO 110
150 X=X+1
160 IF X<9 THEN GOTO 130
170 Y=Y-1 : X=[Y]+1
180 GOTO 160
200 I=1 : R=1
210 IF I=Y THEN R=0 : RETURN
220 IF [I]=X THEN RETURN
230 IF [I]=X-(Y-I) THEN RETURN
240 IF [I]=X+(Y-I) THEN RETURN
250 I=I+1 : GOTO 210
300 PRINT
310 I=1
320 J=1
330 IF Y>=I AND [I]=J THEN PRINT "|Q";
340 IF Y<I OR [I]<>J THEN PRINT "| ";
350 IF J<8 THEN J=J+1 : GOTO 330
360 PRINT "|"
370 IF I<8 THEN I=I+1 : GOTO 320
380 RETURN
OK
RUN

|Q| | | | | | | |
| | | | |Q| | | |
| | | | | | | |Q|
| | | | | |Q| | |
| | |Q| | | | | |
| | | | | | |Q| |
| |Q| | | | | | |
| | | |Q| | | | |
OK

↑と同じプログラムをFOR/NEXTを使って書くと↓だ。ずいぶんスッキリした。

10 VIDEO 0
20 CLV

90  [1]=1 : S=1 100 FOR Y=1 TO 8 110   FOR X=S TO 8 130     GOSUB 200 135     REM PRINT "Y=";Y;",X=";X 140     IF R=0 THEN [Y]=X : GOSUB 300 : S=1 : X=8 150   NEXT 160   IF R=0 THEN GOTO 180
170     IF [Y-1]=8 THEN S=[Y-2]+1 : Y=Y-3 ELSE S=[Y-1]+1 : Y=Y-2 180 NEXT 190 GOSUB 300 : END 200 R=0 : E=Y-1 210 FOR I=1 TO E 220   IF [I]=X THEN R=1 : I=E 230   IF [I]=X-(Y-I) THEN R=1 : I=E 240   IF [I]=X+(Y-I) THEN R=1 : I=E 250 NEXT 260 RETURN 300 PRINT 310 FOR I=1 TO 8 320   FOR J=1 TO 8 330     IF Y>=I AND [I]=J THEN PRINT "|Q"; ELSE PRINT "| "; 340   NEXT 350   PRINT "|" 360 NEXT 370 RETURN

ループが最後まで廻らない場合は、GOTOやGOSUBでNEXTを飛び越えないような工夫が必要だ。

と、作者のブログを見たら、「容量の壁と戦う IchigoJam FOR/NEXT 対応!(2015/03/29)」というエントリがある。var 0.9.8でFOR/NEXTに対応しているぢゃないか。

 公式サイトの、下の方に IchigoJam ver 0.9.8-beta(開発途上版) のリンクがある。


« 諦める力 〈勝てないのは努力が足りないからじゃない〉 | トップページ | IchigoJam BASICのFOR/NEXT (2) »

CPUボード」カテゴリの記事

IchigoJam」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/577514/61353613

この記事へのトラックバック一覧です: IchigoJam BASICのFOR/NEXT:

« 諦める力 〈勝てないのは努力が足りないからじゃない〉 | トップページ | IchigoJam BASICのFOR/NEXT (2) »