トピック
MIKI ifconfig

option strict と var/dim 命令の正確な効果とは?

前提として - use 命令ではコンパイルだけ行われる - exec 命令は use + run と同じような動きをする というのがあります。ソースはネットで見た。ウソウソ↓これです。 https://miiverse.nintendo.net/replies/AYMHAAACAAADVHkNroE4Lg slot 0 には use 1 だけ書いときます。以下は全て slot 1 のプログラム。 その状態で run した結果を各行のコメントに書きます。
10そうだね
プレイ済み
返信[1]
親投稿
MIKI ifconfig
(1) option strict: ? n ' undefined variable エラー (2) option strict: goto @l: var n: @l: ? n ' エラー無し、出力無し: var による宣言はコンパイル時に処理される。(コンパイルのみなので ? 命令は実行されない) (3) option strict: goto @l: var x[8]: @l: ? x[0] 'エラー無し、出力無し ここで slot 0 を exec 1 に変更して実行すると・・・ (3') ' ? x[0] 命令で Type mismatch エラー発生。 use (コンパイルのみ) では発生しなかったエラーが、exec で発生しました。
0そうだね
プレイ済み
返信[2]
親投稿
MIKI ifconfig
(a) コンパイル時に起きること option strict '以下未定義変数を参照したらエラー goto @l var x[8] ' x というシンボルを定義する。ただし配列であるという属性は登録されない。 @l ? x[0] ' x は定義済みなのでエラーにならない。xが配列であるかスカラーであるかはチェックしない
0そうだね
プレイ済み
返信[3]
親投稿
MIKI ifconfig
(b) 実行時に起きること 1 option strict 2 goto @l - var x[8] ' この "var 命令" は実行されない。 3 @l 4 ? x[0] ' type mismatch エラー発生。プチコンは x が配列であると思っていない。 var x[8] という行は、コンパイル時には x というシンボルを登録するが、その段階で x はスカラでも配列でもない。 exec 時に var x[8] という行が「実行」されることにより、「x は 8 要素の配列である」ことが確定する。
0そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
もう一つ slot 0: exec 1 slot 1: option strict: goto @l: var n = 8: @l ? n ' 0 を出力 (b) 実行時に起きること 1 option strict 2 goto @l - var n = 8 'この行は実行されない。 3 @l 4 ? n ' 0 を出力
0そうだね
プレイ済み
返信[5]
親投稿
MIKI ifconfig
var n = 8 という記述は var n 'という宣言と n = 8 'という実行文をあわせたシンタクスシュガーであることがわかる。 var n によりコンパイル時には n というシンボルを登録するが、その段階で n はスカラでも配列でもないし、もちろん 8 という値が代入されることもない。 exec 時に n = 8 という命令が実行されることにより、n = 8 という代入が行われる。
0そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
var n = 8 でコンパイル時に n = 8 が代入されないのは残念です。 例えば const n = 8 でコンパイル時に型(スカラ/ベクタ)を決定できて、値の初期化もできたら嬉しいですね。
0そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
あ、も一つ実行例 slot0: exec 1 slot1: option strict goto @l var x[8] @l x=1.9 ' エラーにならない ? x ' エラーにならない。1.9 と出力 なんか気持ち悪い、メモリリークでもしそうなコードですね!!
1そうだね
プレイ済み
返信[8]
親投稿
say sayer.exe
ぼくちんまともなきょういくうけてないからわかんないのー パス1:コンパイラ指定を探すのー パス2:変数を探すのー(設定されてない変数が見つかったら、コンパイラ指定に応じて「暗黙の了解」にするか「エラー」とするかは分けられる) パス3以降:コードを読(略 ってのをイメージするのー 無学のイメージなんでツッコミどころはなんぼでもあります
0そうだね
プレイ済み
返信[9]
親投稿
MIKI ifconfig
プチコンはワンパスコンパイラです。 1. コンパイル (a) コンパイラ指定(option)を探しながら (b) 変数があれは変数表に登録して(ただしこの段階ではスカラか配列かは決めない) (c) 命令などは対応するマシンコード(java みたいな中間コード)を生成する。 2. 実行 コンパイルされたマシンコードをインタープリタが実行します。
0そうだね
プレイ済み
返信[10]
親投稿
Weiss S. WeissKrispie
WOW! YOUR MIKI!!! my sister SpidaMario said that your super cool!!! btw i looove your art!!!!
0そうだね
未プレイ
返信[11]
親投稿
みむ*mim hidemimtp
USEは、SLOT0をRUNした時の事前チェックと同じ動きではないでしょうか。 DIM/VARの働きは 1.シンボル登録 2.型の決定 3.代入 の3つだと思いますが、事前チェック(=USE)では1のみを行い、他は実行時、という仕様だと認識しています。 変数の登録だけをして型や内容を決めないのは、DEFでも起こりますね。 DEF A OUT B END これは実行時にエラーが出ます。中に「B=0」などと記述しなければなりません。かといって「DIM B」などと書くと、今度は重複エラー。シンボルだけ登録されている状態です。 これは以前にハカセから、「DEFは出力先の変数の型が確定するのが最初に代入した時だったはずなので、型が定まらない状態という事でエラーになっている可能性があります」との回答を頂きました。 ていうかそもそも皆さん、そんなにコードの途中でDIM/VARを書かれるんですか??
0そうだね
プレイ済み
返信[12]
親投稿
GOSUB @SENGEN ?ARY[0] END @SENGEN DIM ARY[1] ARY[0]=RND(10)+1 RETURN こんな感じの書き方したらエラーはかれるし3号特有の部分で嫌いになってくる (頭で宣言しないのは@SENGENを差し替えることで、いろいろ遊べるようにという工夫、ちなみに電車ゲームの「車両モジュール」)
0そうだね
プレイ済み
返信[13]
親投稿
型と言えば、$ついてない関数で文字列返せるからもうどうでもよくなってくる(余談)
1そうだね
プレイ済み
返信[14]
親投稿
MIKI ifconfig
Hi Weiss S.! Nice to meet you!! I know you because SpidaMario often spoke of you :)
0そうだね
プレイ済み
返信[15]
親投稿
MIKI ifconfig
みむさん その「事前チェック」のことを社長は「内部的な実行コードへ変換」と言ってるのだと思います。 >変数の登録だけをして型や内容を決めないのは、DEFでも起こりますね。 out の B もそうか!! def で異なる型を受け取るために、ここで A の型を決めるわけにいかないのでしょう。それに引きずられてというか、同じ処理するために、グローバル変数でも決まらない仕様になってるのかなあと想像します。 >コードの途中でDIM/VARを書かれるんですか?? モジュールちっくに書くときは、モジュールごとの先頭で変数宣言します。ただ goto は使わないので、必ず先頭から順に「実行」されるので、 var n = 8, x[n] というコードが常に期待通りに動きます。
1そうだね
プレイ済み
返信[16]
親投稿
MIKI ifconfig
あまさとさん 同様のコード書いて、動かないので頭抱えて調べてみたってのが今回の顛末です。 ? f(0) end var n = 8, x[n] def f(i) return x[i] ' Type mismatch!! end みたいな。
1そうだね
プレイ済み
返信[17]
親投稿
MIKI ifconfig
>ただ goto は使わないので、必ず先頭から順に「実行」されるので、 あ、間違った!!「メインのコードは必ず最後に書くので、以下同文」でした。例えば var ... 'global 'module (1) var ... def ... 'module (2) var ... def ... 'main var ... main 原体験が Pascal なので、ワンパスコンパイラに優しいコードを書く習慣が見に染み付いてる(苦笑
0そうだね
プレイ済み