難解プログラミング言語を整える
専門Grassを整える。
= w・W・v の3文字だけで書く言語 Grass を実行して、関数と適用の色分けを見られます。
Grass が初めての方は、先に そもそも Grass とは・なぜ草なのか をどうぞ。
サンプル(クリックでエディタに入れる)
w・W・v(全角の w W v も同じ)以外の文字は無視されます。最初の w より前の W・v も無視されます。
出力
「実行」を押すと、ここに出力が出ます。
仕組みを見る
関数定義と適用を色分けして、スタックが積み上がるのを見る
w… 関数定義(w の数が引数の数) W…w… 適用(W の数=関数の番号、w の数=引数の番号) v 区切り。番号はスタックの上から数えます。
プログラム(次に実行する命令を囲んで示します)
スタックの長さの移り変わり(最初の部分)
スタック(1番が一番上。積むだけで取り出しません)
出力(途中経過)
命令を文章で読む
生成
文字列から Grass を作る
入れた文字列を出力する Grass を作ってエディタに入れます。Succ を 1・2・4…128 回かける関数を先に8個定義し、w(119)から必要な回数だけ Succ して文字を作ります。日本語は UTF-8 のバイト列で出ます。
そもそも Grass とは
w・W・v の3文字だけで書く、ラムダ計算の言語。
Grass(グラス)は、UENO Katsuhiro氏が作った言語です。作者の公式ページによると、2006年9月17日に「情報科学若手の会」(第39回)で、プログラミング言語を形式的に定義する方法の紹介として提案されました。公式ページは2007年9月24日に開設され、日本語版は2007年10月4日に公開されています。
書くのは w・W・v の3文字だけで、ほかの文字は無視されるので、間にコメントや絵を書き込めます。全角の w W v も同じ文字として扱われます。
構文は「関数定義」と「関数適用」の2種類です。w で始まる並びは関数定義で、最初の w の連続の数が引数の数です。そのあとに W の連続と w の連続を組にした適用が並び、これが関数の本体になります。適用 WWw… は「W の数」番目の値を「w の数」番目の値に適用する、という意味です。区切りは v です。
プログラムの実行は、積むだけで取り出さないスタック(正式には環境)を使います。関数定義に出会うとその時点のスタックを持った関数を積み、適用に出会うと結果を積みます。プログラムの末尾に来たら、一番上の関数を自分自身に適用します。作者は、型なしラムダ計算(A正規形・ラムダ持ち上げ・de Bruijn 添字にしたもの)と SECD 機械にもとづいて定義した、と説明しています。
初期スタックの4つの値
実行の最初、スタックには上から Out・Succ・w・In の4つが積まれています(番号は上から 1・2・3・4)。
- Out 文字を1つ受け取って出力し、その文字を返す。文字でないものを渡すと異常終了。
- Succ 文字の次の文字を返す(コード n → n+1。255 の次は 0)。文字でないものを渡すと異常終了。
- w 文字 w(コード 119)。関数としても働き、同じ文字を渡されると Church の真(λxy.x)、それ以外は偽(λxy.y)を返す。
- In 標準入力から1文字読んで返す。入力の終わりに来ていたら、渡された引数をそのまま返す。
なぜ「草」なのか
日本のインターネットでは、笑いを「笑」や「w」と書く習慣があります。w は「笑い」のローマ字の頭文字から来たものです。笑いが大きいと w を重ねて「www」と書き、これが地面に草が生えているように見えることから、「草」や「草が生える」で笑いを表すようになりました。
Grass は、プログラムの大部分が w の連なりになるので、この見た目をそのまま名前にした言語です。作者の公式ページも、自分の言語を英語で「grass-planting programming language」、日本語で「ちょっと草植えときますね型言語」と紹介し、ページ内のサンプルにも全角の w を連ねたものがあります。
このページの対応範囲
- 対応: 関数定義・関数適用、先頭の W・v の無視、全角文字、初期スタックの Out・Succ・w・In、文字の比較(Church の真偽)、プログラム末尾の自己適用、異常終了(Out・Succ に文字以外を渡したとき、存在しない番号を指したとき)。
- 省いたこと: 仕様に定められていない追加の組み込み関数は持ちません。Church の真偽は専用の値で持ち、ラムダ式としては展開しません(結果は同じです)。末尾位置の関数呼び出しは呼び出しの記録を積まず、スタックの表示は呼び出し先のものになります。
- 上限: 命令の実行は 1,000,000 回、出力は20万バイト、関数呼び出しの深さは10万段までです。超えると止まります。
- 標準入力はこのページの入力欄の文字列を UTF-8 のバイトで読みます。送信はしません。
出典: 作者の公式ページ Grass(blue.sky.or.jp)、esolangs.org: Grass。サンプルのうち「w」を出すもの、1+1、「はいはいわろすわろす」は公式ページのものです。
あわせてエソラング図鑑やBrainfuckの遊び場もどうぞ。
このツールについて
Grass は w・W・v の3文字だけで書く、ラムダ計算にもとづく言語です。wwwと並んだ見た目が草のようなので「草」です。プログラムを実行し、関数定義と適用の色分け、積み上がるスタックの長さ、出力を見てみましょう。
w・W・v の3文字で書く Grass を実行し、関数定義・適用の色分けとスタックの伸びを見て仕組みを学べる。
主な機能
- 作者の公式仕様に沿ったインタプリタ(Out・Succ・w・In・文字の比較)
- 全角の w W v も同じ文字として読む
- 関数定義と適用の色分け表示
- スタックの長さの推移・中身・出力を1つずつ再生
- 文字列から Grass を自動生成(Hello, World! ほか)
よくある質問
Q. Grass とは何ですか?
A. w・W・v の3文字だけで書く関数型の難解プログラミング言語です。UENO Katsuhiro氏が2006年に提案しました。ラムダ計算にもとづき、ほかの文字はコメントとして無視されます。
Q. なぜ「草」なのですか?
A. 日本のネットでは笑いを w と書き、重ねた www が草の生えた様子に見えることから「草」と呼ばれます。Grass はプログラムの大半が w の連なりになるため、その見た目を名前にしています。
Q. 全角の w や W は使えますか?
A. 使えます。公式の仕様では、全角の w W v は半角と同じ文字として扱われます。w・W・v 以外の文字は無視されます。
Q. 無限ループになるとどうなりますか?
A. 命令の実行が100万回に達した時点で自動的に止まります。出力が20万バイトを超えるか、関数呼び出しが10万段を超えた場合も止まります。
Q. 入力したプログラムは送信されますか?
A. されません。実行はすべてブラウザの中で行い、プログラムや標準入力は外部へ送りません。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。