Moon言語を作っています
Moon言語がチューリング完全であることが証明された‥ pic.twitter.com/Foz8ptNHEg
— W.V.O.KOTOKO (@make_now_just) 2015, 4月 19
たまには言語オタっぽいことをしようと思って、Moon言語というプログラミング言語を作りはじめました。
現状、超絶作りかけで、まだリポジトリも作ってません。というかバージョン管理する気にもなりません。
とりあえずチューリング完全ということが証明されたので公開しておきます。
Moon is Macro based Programming Language.
Moon言語
Moon言語はマクロ(ルール)によるテキスト置換をベースにしたプログラミング言語です。
といっても分かりにくいので簡単に例を示すと、
@def(hello){world}# @hello
こんな感じにして、最初の行でhello
というルールを定義して、それを次の行の@hello
で展開しています。1行目の末尾の#
はコメントです。TeXなんかだとよくある感じですね。
で、これを実行すると、
world
という出力が得られるわけです。
当然ながら再帰的に展開することもできて、
@def(a){A!!!}# @def(b){B!!! @a}# @b
とすると、
A!!! B!!!
になったりとか、引数を取ることもできて、
@def(say,word){I say "@word"}# @say(YES)
とすると、
I say "YES"
となったりとか、他にもブロック引数とか可変引数とかがあります。
また、特徴的な命令として、@return
と@yield
があります。
@return
は、通常のプログラミング言語にあるように、そのルールの実行を中断して、現在までの出力とそのあとの規則の文字列を合わせて出力します。
@def(rule1){@rule2 @return @rule3}# @def(rule2){Rule 2}# @rule1
とすると、
Rule 2 @rule3
となります。今気付きましたがこれはエスケープに使えますね。
また、@yield
も基本的に@return
と同じように動作するのですが、出力したものを呼び出しもとのソースと結合してそこから実行していきます。あ、@
のあとに、特殊な記号を並べるとエスケープになります。
@def(rule1){@@rule2@yield}# @def(rule2){Rule 2}# @rule1
とすると、まず@rule1
が展開されて、
@rule2
となり、これがさらに展開されて、最終的には
Rule 2
となるわけです。要はevalですね。
この@yield
を駆使するとマクロっぽいことができたりします。どういうことかは考えてみてください。
おやすみなさい。