Scratch
昼休みにちょっとScratchやってみよう。派生したものとか昔のとかは触ったことがあったけどよく考えたら本家の最新のは知らないことに気づいた。
リストを作る
スプライト単位のスコープと、その外側のグローバルスコープがあるということがわかった。
https://gyazo.com/91640da3d32314448ea3a93b30daece5
スタックマシンができた
https://gyazo.com/ad3f12799bbb97c41bd08ab177eb0241
ネット上の記事で「関数を定義できる」と認識してたけど、値を返さないプロシージャが定義できるだけかな…
abee2: ユーザーが定義したブロックに引数はありますが、返り値はありません(それなので、関数ではなくプロシージャ)。組込関数(両端の丸いレポーターブロック、尖ったブーリアンブロック)は返り値を持ちます。ずっとみんな指摘しているのに導入されないのはScratch七不思議のひとつと言われています。Twitter メッセージ送受信はできるがメッセージは引数を持てなさそう
パラメータを共有スペースに置いて通知だけメッセージでやるタイプなら可能か
スタックのpush/popをくくり出そうかと思ったけど、この方式だと特に嬉しいところがないな
リテラルで空白文字入れられない?
そんなことなかった、逆に変数を間違えて変数名のリテラルにしてた
https://gyazo.com/f9b0f4cfa373a896572dc4d83a8c710e
変数を入れるべきところに変数名をリテラルとして入れてつねにfalseな式になってしまう
length of xにリストを入れてしまったが、リストの長さを取得するのは同じ名前だけど赤いブロック
https://gyazo.com/b4d5fafffcdedff2640532a1e1735762
文字列の長さを返す関数にリストを渡してしまうと「文字列化したものの長さ」が返ってしまう
文字列をパースして足し算引き算ができるようになりました。FORTHのサブセット。
https://gyazo.com/9ce2efabcbfb529cb64e3d33d048d7a3
値を返す関数は、値を入れておく変数を用意すれば実現できる
https://gyazo.com/75c6b2394566896c89bac4dc6ee1d2ca
たらい回しをすることもできます笑
https://gyazo.com/005e0b80cc9db1bde4e11f0fa63725dd
いや、まてよ、ローカル変数が使えないからとnxとかをグローバル変数にしてしまったから他の呼び出しの最中に上書きされるのか
ローカル変数がないため「返り値を関数呼び出し後即座に別の変数に入れておく」ができないから、返り値をスタックに積んでおいて必要になった時に取り出すことにした
https://gyazo.com/83eb45f492c9a69c958c7e4095c8c550
ステップ実行とウォッチ式が欲しかった()
「最後の実行結果がスタックトップにある」ということを忘れてnxとnzを逆にして停止しない関数になってしまった
ローカル変数がない件、正確には「ブロックの中で新たに代入を行うことはできない」であって引数はローカル変数になるから、関数の部分適用みたいなブロックを作るという手もあるか
https://gyazo.com/d97eef4ac78091828b83b2fb1c65aeba
できたが...w
スタックに積む方式とどっちがわかりやすいのか微妙だな。
後者のアプローチは「新しい変数に値を束縛するたびにその値とそこ以降での実行に必要な値を全部引数にして関数呼び出し」って感じで機械的に変換できるから簡単だという解釈もできる(ほんとか?)
あとは不定長のリストをプログラムの中で好きなだけ作りたいけど、それに関しては文字列にしちゃう手と、一つのリストの中でリンクトリストを作る手とがあるな。
次の課題は「開きカッコと閉じカッコで構成された文字列が与えられる。カッコが対応しているか判定せよ」で、その次が「S式で表現された計算をせよ」なのかな