タプルに対応 続

タプルの型定義をかけるようにしてみた
構文は[Int, String]にした
使う側はvar x = (1, "str")なのに型定義はカギカッコなのはちょっとどうかなと思ったけど
戻り値がIntとStringの関数で
sub f() (Int, String)が良いか
sub f() [Int, String]が良いか考えたら後者がいい
f:id:zenu:20180506012127p:plain
そろそろ一通りの機能が揃ってきたので自作コンパイラでアプリを作りたい
自作コンパイラで作るものと言ったら、もちろんセルフコンパイルできるコンパイラだろう
何の機能がたんねーかなー?

タプルに対応

タプルが使えるようになった
最初はvar x = [1, "str"]なんて文法がええかと思っていたけど
これやと配列と区別が付かないのでvar x = (1, "str")にした

タプルの要素へは数字のプロパティでアクセスする
なんか知らんけど、深夜のテンションでそう決めた
勢いでプロパティ名の変数名だけ数字が使えるようになっている
f:id:zenu:20180430053136p:plain
ホンマはprint(x[1])とかいう風に配列の添え字風にアクセスできたらええんやけど
これやと型解決ができへん

1要素のタプルは作れへん
いらんし

ローカルスコープに対応

ローカルスコープが扱えるようになりifの中で変数が定義できるようになった
スコープ内で外側の変数と同名の変数を定義した場合、別の変数として扱うことにした
オーソドックスなCと同じ仕様にした
なんかjavascriptあたりがきしょい動きをしていたような気がする

f:id:zenu:20180427005356p:plain

クロージャ変数の取り扱いがちょっと変わった
今までは関数スコープにクロージャ変数とマークされた変数があればframeを作りつつぶちこんでいた

今度からはローカルにクロージャ変数があるやもしれへん
クロージャ変数が見つかったタイミングで関数へframeを作るようにし、ローカルスコープ側から関数のframeを作るようにした

1文字変数

プログラムで1文字変数をよく使う
よく使う1文字変数の用途はだいたいこんな感じ


a…意味のない変数、だいたいaとbをセットで使う、単品で使う場合はxを使う
b…同上
c…文字型(char)に使う
d…数値に使う、主に10進数を入れる、たまに日付を入れる
e…自然対数の底を入れるが滅多に使わない、評価値(eval)を入れることもある
f…関数を入れる、どうでもいいサンプルプログラムの関数名に使ったりもする
g…グローバル変数を入れる
h…高さの数値を入れる
i…ループカウンタ
j…ループカウンタその2
k…ループカウンタその3
l…使わない、数値の1と似てるから
m…数式っぽい式に使う
n…数式っぽい式に使う
o…使わない、数値の0と似てるから
p…ポインタを入れる
q…公式でqを使ってた時以外滅多に使わない
r…角度とか入れる
s…文字列(string)を入れる
t…変数を入れ替えるための一時変数に使う、たまに時間を入れる
u…使わない
v…valueという変数を受けるのに使う
w…幅の数値を入れる
x…意味のない変数やごく短い関数でよく使う、座標を扱う場所では使えない
y…y座標を入れる
z…z座標を入れる

nullに対応

nullに対応した
え、いまさら?
はい

nullはNull型のインスタンスとした
せやから[Foo | Bar]?[Foo | Bar | Null]シンタックスシュガーになる
CILでは値型にnull入れれへんから、Object型にしてBox/UnBoxする事にした

f:id:zenu:20180409034452p:plain

.NET Frameworkの参照型はnullが無制限で入るから、全部Foo?にするんかい、って所は面倒なのであまりやりたくない
ただ、本当にnullを入れたい時に型が合わんくて代入できなくなるから・・・そのうちやらんといかん

マグマイザー

人類の男だけ滅ぼそうとする悪の組織と戦うためにAV男優の力を借りて戦う変身ヒーローもの
AV男優が近くに居続けないと変身が解けてしまう
内部に裏切り者がいてAV男優の魂が抜かれてしまうが
精神統一をしたらAV男優を召喚できるようになりラスボスを倒す


人類滅亡まで10日しかないのに仕事のスケジュール調整をしていたりする
別に神雄の職業がAV男優でなくても通じる話だとおもうんだけど、なぜかAV男優
最初に吉村の魂が抜かれた時にペンペンたたいて反射を確認し続けるのが可笑しかった

裏ボスは加藤鷹