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