投稿
MIKI ifconfig
そか! var 関数は左辺値にもなるから 例えばテキストファイルの内容が a$="foo" p=6.28 とかだったとして、一行ごとに "=" で分離して、前を lvalue$, 後ろを rvalue$ として var(lvalue$)=rvalue$ とかできるのか。 むしろ保存のがめんどくさい。
7そうだね
プレイ済み
返信[1]
親投稿
say sayer.exe
varって関数でした?
0そうだね
プレイ済み
返信[2]
親投稿
れい rei-nntnd
定義済み変数列挙とかできたらいいんだけどね
1そうだね
プレイ済み
返信[3]
親投稿
MIKI ifconfig
var 関数 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHjAwGHZHA ↓こういうふうにかけるから var a$,p,x[1] var("a$")="foo" var("p")=6.28 var("x")[0]=1 配列考えなければ if instr(lvalue$,"$") then var(lvalue$)=rvalue$ else var(lvalue$)=val(rvalue$) と書けるって事。 変数の読み込みがものすごく簡単になる。
0そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
以上☆ムーン★さんが変数の保存・読み込みで苦労してるふうなのでちょっと考えてみた。
0そうだね
プレイ済み
返信[5]
親投稿
れい rei-nntnd
もう10分くらいしたらみき氏がわかりやすく日本語で書いてくれると思うけど 左辺値ってのは「代入の対象」って意味で、「変更される」。 右辺値は「計算の対象」で「変更されない」。 var(~)が左辺値になれるってのは var("a$")="aiueo" でa$に「aiueo」が入るってことになる。 なので、例えばプログラムの変数を保存・読込したいときに、 「変数名=値」ってのを何個も書いておけば それを読み込んでうまく解析して var(変数名)=値 ってやれば、任意の名前の変数に任意の値を設定できることになる。 ってこと
1そうだね
プレイ済み
返信[6]
親投稿
れい rei-nntnd
入れ違いか
1そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
れいさんによる和訳でした。Merci beaucoup.
0そうだね
プレイ済み
返信[8]
親投稿
MIKI ifconfig
右辺は右辺値でいいのよ(トートロジー) いや、右辺には(型さえ合えば)任意の式が書けます。
0そうだね
プレイ済み
返信[9]
親投稿
var()を左辺に使うメリットとしては、代入側の変数を文字列で表せるから動的に変数を変更出来るって事ですね。 普通は、 A$="HOGE" みたいにして変数A$に値を入れますが、このHOGE側の内容を動的に変えたいときはHOGEを変数にして、 S$="HOGE" A$=S$ みたいにすると思います。そうすればS$の内容を変えればA$に入れる文字を変えることが出来るからです。 ここで逆にA$って変数じゃなくて変数名を動的に変えたい!って思ったとき。そんなときにVARが使えます。 例えば、 HENSU$="A$" VAR(HENSU$)="HOGE" とやるとあら不思議。HENSU$ではなくてHENSU$の内容であるA$の方にHOGEが入るわけです。 って、そういう意味だと思うんだけど実は僕はまだ使ったことがないので間違っていたらすいません(^^;
1そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
var a$ のとき a$="foo" と var("a$")="foo" は同じ結果になるってことです。 ? a$ ? var("a$") も一緒。 不思議な関数ですね。ダイレクトモードのために、文字列を変数への参照に変換する機能が絶対必要なんだけど、その機能を外に出してるという、内臓チックな関数。call("名前")とかいうのもあるよ。
0そうだね
プレイ済み
返信[11]
親投稿
say sayer.exe
先にvarされてる変数のみ有効みたいね 変数で変数名指定とかはできないっぽい?
0そうだね
プレイ済み
返信[12]
親投稿
MIKI ifconfig
でんぺんさんによる解説でした! ありがとうございます。
0そうだね
プレイ済み
返信[13]
親投稿
ナツキ natukin1978
すげぇ! 汎用的なシリアライザが作れる
0そうだね
プレイ済み
返信[14]
親投稿
say sayer.exe
できたキモい!
0そうだね
プレイ済み
返信[15]
親投稿
ナツキ natukin1978
いや逆か。復元だからデシリアライザか
0そうだね
プレイ済み
返信[16]
親投稿
MIKI ifconfig
保存する方も考えてみました。 vlist$="a$ p" sv$="" while vlist$ != "" id$=最初のトークン(vlist$) vlist$=最初のトークンの後ろ(vlist$) if instr(id$, "$") then sv$=format$("%s=%s",id$,var(id$)) else sv$=format$("%s=%.15f",id$,var(id$)) endif wend save "txt:filename",sv$
0そうだね
プレイ済み
返信[17]
親投稿
say sayer.exe
あー、なるほど option strictの意味がわかった気がします
0そうだね
プレイ済み
返信[18]
親投稿
MIKI ifconfig
あ、instr 使い方間違っている。 全部 instr() >= 0 にしてちょ。
0そうだね
プレイ済み
返信[19]
親投稿
MIKI ifconfig
そもそも token 処理する必要なかった var vlist[2], a$, p vlist[0] = "a$" vlist[1] = "p" var i,sv$ for i = 0 to len(vlist) - 1 if instr(id$, "$")>=0 then sv$=format$("%s=%s",id$,var(id$)) else sv$=format$("%s=%.15f",id$,var(id$)) endif next save "txt:filename", sv$
0そうだね
プレイ済み
返信[20]
親投稿
Godot orz_127
頭が悪すぎて授業について行けてませんが、要するに、shで配列が使いたい時の擬似配列の手法がプチコンでもできると言うこと??
0そうだね
プレイ済み
返信[21]
親投稿
MIKI ifconfig
format$ に %e がないのが地味にきつい。 str$だと精度落ちるし・・・ おちゃめさんが何か素晴らしい変換ルーチン作ってたっけ?? ※開発作業実演中
0そうだね
プレイ済み
返信[22]
親投稿
MIKI ifconfig
Godot さん、むしろ eval が近いです。 $ eval "a=foo" $ echo $a foo と似た感じで var a$="xxx" var("a$")="foo" ? a$ foo となります。
1そうだね
プレイ済み
返信[23]
親投稿
MIKI ifconfig
見つけた! https://miiverse.nintendo.net/posts/AYIHAAAEAAA5VHwqR3fRCA これでセーブロードできるはず。 あとさっきの擬似コードは sv$ に chr$(10)付けるの忘れてた。
0そうだね
プレイ済み
返信[24]
親投稿
MIKI ifconfig
あ、これでおしまいです。さーせん。 (1) a=1 の擬似コード: varpush a; constpush 1; assign (2) x[0]=1 の擬似コード: varpush x; constpush 0; array_index; constpush 1; assign (1) 3step, (2) 5step まあエラーチェックあるからこんな単純ではないと思うけど。 やっぱり配列遅いのは仕方ないかな??
0そうだね
プレイ済み
返信[25]
親投稿
れい rei-nntnd
みき氏はたまにそうやってスタック積み木してるけど、 配列、inc、演算の速度、forやwhileなどループの振る舞い、今までのバグの内容とか考えると、 プチコンの中間コードってスタック詰んでなさそうじゃない?
0そうだね
プレイ済み
返信[26]
親投稿
MIKI ifconfig
むー、そうですねえ・・ mkII では while すらなかったこと考えたら、コンパイラコンパイラ使ってないのかもですね。 技巧的な手書きのパーサ。ん~~~~~~~~ そそ、別トピ立てますけど、 x[0]=x[0]+1 よりも inc x[0] の方がかなり速いことが判明しました。 (既知だったらサーセン)
0そうだね
プレイ済み
返信[27]
親投稿
Godot orz_127
疑似配列やってみた 結局最初に事前のVAR定義が必要になるのか orz
1そうだね
プレイ済み
返信[28]
親投稿
MIKI ifconfig
検証お疲れ様です。 >結局最初に事前のVAR定義が必要になるのか orz say さんは逆にそこから option strict の気持ちが理解できたそうです。
0そうだね
プレイ済み
返信[29]
親投稿
マギー M191246
暗黙定義でもできるみたいです。 しかも、プログラムの後方 (実際には実行されない場所)に あってもできる雰囲気。 結局、どこかにないといけないというのは、 同じなんですけど。
0そうだね
プレイ済み
返信[30]
親投稿
マギー M191246
紛らわしい表現でした。 例えば VAR("A")=5 PRINT VAR("A") END A=0 としても、エラーにならないようです。
0そうだね
プレイ済み
返信[31]
親投稿
MIKI ifconfig
ええ?? https://miiverse.nintendo.net/replies/AYMHAAACAAADVHkNroE4Lg によると実行に至るまでには 1. 中間コードへの「変換」 2. 「実行」 のステップがあって、「変換」ステップではOPTION命令もVAR命令も「実行」されないってことなんだけどなあ・・・ マギーさんの例だと、a=0 を変換する時点でシンボルテーブルには登録されるってことだよね。 もしかして var 命令も「実行」されなくても「変換」段階でシンボルテーブルには登録されるってことかな??
0そうだね
プレイ済み
返信[32]
親投稿
MIKI ifconfig
ゆうべはさらっと流しちゃったけど れいさん スタック使わずに式評価ってどうするの??? Godotさん 擬似配列ってそういうことでしたか。勉強になりました。
0そうだね
プレイ済み
返信[33]
親投稿
MIKI ifconfig
どんなセンセーショナルなタイトルにしようかと思って。 【衝撃】inc の方が速い!?【新事実】 とか? これから出かけるので後ほど。 うえこうさんは臨界ゲームよろ。
0そうだね
プレイ済み
返信[34]
親投稿
INCは駄目な子じゃなかった! ベンチマークが語る衝撃の真実!? とか? (^^; しかしバージョンアップで内部実装が変わる可能性もあり、どこまで信用してつかっていいのか迷いますよね〜。
0そうだね
プレイ済み
返信[35]
親投稿
Godot orz_127
大喜利ネタを振りつつ、お出かけとは…。 「INC最速説浮上!……ヵ?」
0そうだね
プレイ済み
返信[36]
親投稿
MIKI ifconfig
スタックじゃないならレジスタか。 でんぺんさん Godot さんアイデアありがとうございます。
0そうだね
プレイ済み
返信[37]
親投稿
MIKI ifconfig
ハンカチ3枚分泣いた。
0そうだね
プレイ済み
返信[38]
親投稿
MIKI ifconfig
ok これプチコンにコピペすればいいのね???
0そうだね
プレイ済み
返信[39]
親投稿
れい rei-nntnd
スタックもレジスタも使ってないでしょ。きっと。 中間コードとはいってるが、疑似マシン語とは言ってないので、スクリプトのようなものに変換して、それをインタプリタ実行してるんだと思われる。 スタックやレジスタ使ってるなら積まれた値を使えば早くなるはずだし、ループのバグでもジャンプ先が間違ってるとかいってるし。 C++で作った事前文法チェックするBASICライクなスクリプトってところじゃないかと。
0そうだね
プレイ済み
返信[40]
親投稿
Godot orz_127
昔から伝統のBASICの中間コードと一緒では? パソコンもそうでしたが、ポケコンでも中間コードがありました。 構文チェック後、内部処理用に数値化している程度ではないかと。
0そうだね
プレイ済み
返信[41]
親投稿
ちーたけ hello.world256
[* スタックを使わずに式を評価する方法 *] 1、式を与えるよ(ここでは"33-4 +765*0") 2、字区切り([33,-,4,+,765,*,0]) 3、一番優先度が高い演算子のとこからevaってくよ([33,-,4,+,0]) 4、続けてくよ([21,+,0] => [21]) 5、21 <- これ
0そうだね
プレイ済み
返信[42]
親投稿
MIKI ifconfig
れいさん Godot さん な、なるほど・・・どちらも納得の回答ですね。 ちーたけさん 面白いですね。人間の処理方法そのまんまって感じ。 21は29ですよね
0そうだね
プレイ済み
返信[43]
親投稿
ちーたけ hello.world256
数値計算苦手なんですー(><;)。 式の計算方は主に3つ、 1つは"1 2 +"などのスタックスタイル 続いて"((1) (+) ((2) (*) (3)))"などのrecursiveスタイル 最後にrecursiveの平面化スタイル 、だと思っーてーます。ー
0そうだね
プレイ済み
返信[44]
親投稿
MIKI ifconfig
こないだのが平面化スタイルですね? 勉強になります。 確か初期のfortran のコンパイラが、 + を )))))+((((( に、* を))*(( に文字列的に変換するといった手法だったとか?!?!? あれ、この変換でいいのかな???
0そうだね
プレイ済み
返信[45]
親投稿
ちーたけ hello.world256
1+2*3が((((1))))+((((2))*((3))))になるんですね多分。 あと(+ (* 2 8) (- 99 7))がprefixだったりしますよね。 オイラのrecursiveのアレは再帰下降構文解析の流れを()で優先度順に深くしていって視覚的に表しているだけなので、実際はそのまま解析されまーす。 うわああああああ
0そうだね
プレイ済み
返信[46]
親投稿
MIKI ifconfig
というわけで、変数の保存・読み込みができる汎用の関数作りました。 VFILER KEY=1KEXNK4V おちゃめさんの PSTR 関数 ver.2.0 を使っています。 ●使い方 メインプログラムの最後にコピペして使う。別スロットでは動作しない。 ・保存: vfsave ファイル名, 変数名リスト ・読み込み: vfload ファイル名 ・注意: "vf"で始まり"___"で終わる変数は保存できない 配列の一部だけを保存することはできない 例 var a$, b, c%, d#[32], e$[32] vfsave "save.ini", "a$ b c% d#[32] e$[32]" vfload "save.ini"
2そうだね
プレイ済み
返信[47]
親投稿
ちーたけ hello.world256
あっ凄い
0そうだね
プレイ済み