📦 Out of Context リポジトリ

リポジトリ / emssr / independent_common_compiler

r2
r2 emssr1
# referenceとは呼べない程度の備忘録
r2 emssr2
r2 emssr3
Common言語にしろコモン公用語にしろ、根底にあるのは数学で、5みたいな小さい自然数を定義するのにすら
r2 emssr4
r2 emssr5
"""
r2 emssr6
hu hu hu hu hu ka, no ka, no ka, no ka, no ka.
r2 emssr7
r2 emssr8
hu ka, he ka, no ka, he ka, no ka, hu ka, no ka. 
r2 emssr9
r2 emssr10
hu ka, hu ka, no ka, he ka, no ka. hu ka, no ka.
r2 emssr11
r2 emssr12
hu ka, he ka, no ka, he ka, no ka, ki hu ka, no ka.
r2 emssr13
"""
r2 emssr14
r2 emssr15
など、複数の解法がある。
r2 emssr16
r2 emssr17
これだけだとこの語彙が何を言っているか?は分かりにくいが、下に説明すると:
r2 emssr18
r2 emssr19
hu : 最初に書く「1」。
r2 emssr20
    この1を操作する。基本的にこれがないとプログラムは始まらない。
r2 emssr21
r2 emssr22
he : コピー。
r2 emssr23
    与えられた語の値の順番の語をコピーしてw[0]に値を置く。
r2 emssr24
r2 emssr25
ka : 句読点。
r2 emssr26
    操作を区切る。これがあって操作を区切ることができる(逆に言えば、無ければ区切られない)。
r2 emssr27
r2 emssr28
no : 加算。
r2 emssr29
    加算の操作。二つの対象があって初めて適用可能(当然ながら)。
r2 emssr30
r2 emssr31
ha : 負にする・裏返す。
r2 emssr32
    実はコモン公用語において引き算は存在しない。引き算をしたいなら、引く数を裏返す必要がある。hukahakaなら-1を作るだけ。
r2 emssr33
r2 emssr34
mu : 書き込み・左の語番号に右の値を書き込む。
r2 emssr35
    上に今まで挙がった中で唯一の左右による作用の違いを持つ単語。左の値で定義された語を右の値の語に書き込む。つまり、 **右の値が語の番号。左の単語は語の中身** になる。普通のプログラミングっぽく言えば、右がメモリアドレス。左が値。まぁそんな単純な話ではもちろんないんだけど...。
r2 emssr36
    それと、できるだけ1とかあまりにも小さい語を指定すべきではない。プログラムにも寄るけど、基本的に小さい語は新しい語の定義に一時的に使う。大きい語を一時メモリに使おう。
r2 emssr37
r2 emssr38
me : 成功報告・C言語のreturn 0みたいなやつ。
r2 emssr39
    frontierが空っぽのまま実行終了したいときに必要な単語。
r2 emssr40
r2 emssr41
mi : 非破壊読み出し・語番号を作る。
r2 emssr42
    Common言語で状態を読み出す唯一の方法。入力は語番号で、中身の語を返す。非破壊読み出し。
r2 emssr43
r2 emssr44
hi : 比較器
r2 emssr45
    左の語の値が右の語の値より小さければ1、左の語の値が右の語の値より大きければ0。
r2 emssr46
r2 emssr47
mo : 忘れる・語の値を捨てる
r2 emssr48
    frontierをw[0]に戻す。
r2 emssr49
r2 emssr50
区切りがなければ操作は適用されるため、こういうトリッキーなこともできる:
r2 emssr51
r2 emssr52
    すべての hu ka 。つまり1をまとめるためにnoを多重につける。 
r2 emssr53
    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, no no no ka, no no ka, no ka.
r2 emssr54
    = 7
r2 emssr55
r2 emssr56
    最後のno kaをなくしてみる。
r2 emssr57
    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka, no no ka.
r2 emssr58
    = 4, 3
r2 emssr59
r2 emssr60
    no no ka も消す。
r2 emssr61
    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka.
r2 emssr62
    =  2, 2, 2, 1
r2 emssr63
r2 emssr64
    1が残っていてきしょいので、7個のhu ka 定義のうち最後のhu kaを一つ消して6個にする。
r2 emssr65
    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka. 
r2 emssr66
r2 emssr67
    8を作ってから1 = hu kaを裏返して引いてみる。ついでにhu ka を8つ定義するためのkaを省略する。
r2 emssr68
r2 emssr69
    hu hu hu hu hu hu hu hu ka, no no no no ka, no no ka, no ka.
r2 emssr70
r2 emssr71
    hu ka, ha ka. no ka.
r2 emssr72
r2 emssr73
    同じことを、8を作るうえで8つバカ正直に1を定義するのは愚かなので、文明人らしく2進数風に書いてみる。
r2 emssr74
r2 emssr75
    hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
r2 emssr76
r2 emssr77
    hu ka, ha ka. no ka.
r2 emssr78
r2 emssr79
    天邪鬼なことに、-8をつくってから戻して計算する。
r2 emssr80
r2 emssr81
    hu ka, ha ka, he ka, no ka, he ka, no ka, he ka, no ka.
r2 emssr82
r2 emssr83
    hu ka. no ka, ha ka.
r2 emssr84
r2 emssr85
brainfuck言語みがあるのは確かにそう...。
r2 emssr86