矢澤にこ言語が完成(※)しました
Haskell製にこ言語
謎の集団で合宿に行ってきた
某所に技術関連の集まりで技術合宿をしてきました。
各位、目的は各々で決めていく感じの3日連続もくもく会という感じです。
- 僕の主観内で観測された各位の動き
- DeepLearning
- Tensorflow
- VR
- Unity + Android
- ラズパイ電子工作
- Lチカ
- AngularJS1の勉強
- Javaの勉強
- CentOSデスクトップ環境構築
- Archデスクトップ環境構築だったはずが、いつの間にかCentOSに変わっていた
- LinuQuestという謎の企画について
- DeepLearning
DeepLearningの挫折から入る
-
僕の合宿の予定
- にこちゃん作りたい
- にこちゃん作りたいので、深層学習学ぶ
- 深層学習で「にこちゃんへたれ判定bot」を作る
-
実際
- にこちゃん作りたい
- Tensorflow学ぶ
- Tensorflow難しすぎてムリになる
ということで、にこちゃん言語の定義と処理系作成に馳せ参じることになりました。
にこ言語
にこ言語とは
Brainf*ckの方言です。
Brainf*ckの各命令(以下の表の左辺)は、右辺の文字列に割当たります。
> : 笑顔届ける矢澤にこにこ!
< : だめだめだめっ!
+ : にっこにっこにー
- : にこにーって覚えてラブニコ!
. : ぴょんぴょんぴょんっ!
, : あなたのハートににこにこにー!
[ : にこにーはみんなのもの!
] : キモチワルイ
BNFの練習のためにも、意味論はBNFで書いてみました。
こんな感じ。
<code> ::= <empty-code> | <operation> | <operation> <code>
<empty-code> ::= ""
<operation> ::= <forward> | <backword> | <increment> | <decrement> | <output> | <input> | <loop>
<loop> ::= <loop-begin> <code> <loop-end>
<forward> ::= "笑顔届ける矢澤にこにこ!"
<backword> ::= "だめだめだめっ!"
<increment> ::= "にっこにっこにー"
<decrement> ::= "にこにーって覚えてラブニコ!"
<output> ::= "ぴょんぴょんぴょんっ!"
<input> ::= "あなたのハートににこにこにー!"
<loop-begin> ::= "にこにーはみんなのもの!"
<loop-end> ::= "キモチワルイ"
「Hello」と出力するコードはこうなります。
笑顔届ける矢澤にこにこ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにこにーはみんなのもの!だめだめだめっ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにー笑顔届ける矢澤にこにこ!にこにーって覚えてラブニコ!キモチワルイだめだめだめっ!ぴょんぴょんぴょんっ!笑顔届ける矢澤にこにこ!笑顔届ける矢澤にこにこ!にっこにっこにーにっこにっこにーにっこにっこにーにこにーはみんなのもの!だめだめだめっ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにー笑顔届ける矢澤にこにこ!にこにーって覚えてラブニコ!キモチワルイだめだめだめっ!ぴょんぴょんぴょんっ!笑顔届ける矢澤にこにこ!笑顔届ける矢澤にこにこ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにこにーはみんなのもの!だめだめだめっ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにー笑顔届ける矢澤にこにこ!にこにーって覚えてラブニコ!キモチワルイだめだめだめっ!ぴょんぴょんぴょんっ!笑顔届ける矢澤にこにこ!笑顔届ける矢澤にこにこ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにこにーはみんなのもの!だめだめだめっ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにー笑顔届ける矢澤にこにこ!にこにーって覚えてラブニコ!キモチワルイだめだめだめっ!ぴょんぴょんぴょんっ!笑顔届ける矢澤にこにこ!笑顔届ける矢澤にこにこ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにこにーはみんなのもの!だめだめだめっ!にっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにーにっこにっこにー笑顔届ける矢澤にこにこ!にこにーって覚えてラブニコ!キモチワルイだめだめだめっ!にっこにっこにーぴょんぴょんぴょんっ!笑顔届ける矢澤にこにこ!
いいね!
合宿中進捗について
パーサーと、デバッグのためのBrainf*ck形式への変換までを実装しました。
というわけで、本記事のタイトル中の「※」の回収です。
※
矢澤にこちゃん言語の実行器が完成しなかったけど、パーサーは完成したし、brainfckへのトランスパイルもできるようになってるので、実質完成では???
— あいや@型無しラムダ計算 (@public_ai000ya) 2016年12月29日
合宿中の最後のcommitはこれになります。
合宿での学び
にこ言語はHaskellで開発しているのですが、Haskellの型システム周りは最強なので、こういったことができます。
Haskellで型定義をしてから実定義はundefinedでコンパイル(BDD?)
— あいや@型無しラムダ計算 (@public_ai000ya) 2016年12月28日
その後テスト書いてテストセカンド。
最後に実定義を書くという手法が最高になりましたので、よろしく。
短い合宿期間中(※)の結構な部分は、この学び及びHaskellのテスト技法の探りに費やされましたが、わりといい学びだったと思います。
誰かHaskellのtastyでの、IO ()
での標準入力と標準出力の扱い方を教えて。
※ 2泊3日中の1日目はDeepLeaningで潰した
結論
合宿中に にこ言語 完成しなかったよ…。