矢澤にこ言語が完成(※)しました

Posted on 2016/12/30
Tags: [Haskell] [日記]

Haskell製にこ言語

合宿所の近くの海

合宿所の近くの海

謎の集団で合宿に行ってきた

 某所に技術関連の集まりで技術合宿をしてきました。
各位、目的は各々で決めていく感じの3日連続もくもく会という感じです。

DeepLearningの挫折から入る

ということで、にこちゃん言語の定義と処理系作成に馳せ参じることになりました。

にこ言語

にこ言語とは

 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で潰した

夜の海

夜の海

結論

 合宿中に にこ言語 完成しなかったよ…。



この記事はこちらから修正リクエストを送ることができます。
矢澤にこ言語が完成(※)しました - github
ゴミ箱ボタンの左にある、鉛筆ボタンを押してね!