カテゴリー
fun

Folders.py – ディレクトリ構成(だけ)で書く変態プログラミング言語 Folders の Python 実装

Folders.py は、難解(esoteric)プログラミング言語と言われる変わったプログラミング言語のひとつ Folders の Python による実装です。

オリジナルの Folders 処理系は 2015年に C# で書かれたということです。

  • プログラムはディレクトリの階層構造として記述される
  • フォルダ内のファイルはすべて無視される
  • 文や式はフォルダ内にあるサブフォルダの個数によって定義される

コマンドの定義はこんな感じ。

コマンド サブフォルダの数 詳細(引数など)
if 0 folders Second sub-folder holds expression, third holds list of commands
while 1 folder Second sub-folder holds expression, third holds list of commands
declare 2 folders Second sub-folder holds type, third holds var name (in number of folders, ex. zero folders becomes “var_0”)
let 3 folders Second sub-folder hold variable name (in number of folders), third holds an expression
print 4 folders Second sub-folder holds expression
input 5 folders Second sub-folder holds variable name

Expression, Type も同じような表で、サブフォルダの個数と改装で定義されます。

サンプルの加算プログラムを読んでみる

サンプルディレクトリ(プログラム)が6種類ついてきているので少し眺めますが、こんな感じなのでパッと見ても何がなにやら。以下は一番短そうな AddTwoNumbersOrStringsです。

実行結果はこんな。2 と 5 を入力すると 7 が返ってきます。

PS > Folders .\AddTwoNumbersOrStrings\
2
5
7
PS >

この二つの値を足す Folders プログラムはこちら。

フォルダはソート順に読まれます。

まず、1つ目のサブフォルダ(1 – Input)の1番目のサブフォルダ(1 – init)の中にフォルダが5つあることから、ユーザー入力を受け取る Input コマンドだとわかります。2番目のサブフォルダ(2-name)はフォルダが0個なので変数0に値が格納されます。

2つ目のサブフォルダ(2 – Input 2)は、同じく1番目のサブフォルダ中のフォルダが5個なので Input コマンド。2番目のサブフォルダ(2-name)中のフォルダが1個なので変数1に値が格納されます。

最後、3つ目のサブフォルダ(3 – Print)は、1番目のサブフォルダ(1 – init)中のフォルダ数が4個なので Print コマンド。Print コマンドは2つ目のサブフォルダに式(2 – expression)を取ります。

式の1番目のサブフォルダ(1 – init)内のサブフォルダは1個であることから、この式は Add 式。2番目のフォルダ(2 – expression 1)の式を加算し、3番目のフォルダ(3 – expression 2)の式を返します。

2番目の式はサブフォルダから変数0、3番目の式は変数1を指すため、初回の Input と2回目の Input でそれぞれ格納した値が加算され、結果がコンソールに出力されます。

…と、いう解釈で合ってると思うのですが。試しに、加算式のところのフォルダ

AddTwoNumbersOrStrings / 3 - Print / 2 - expression / 1 - init

内にもう2つフォルダを作って動かしてみると、

PS > Folders .\AddTwoNumbersOrStrings\
2
5
10
PS >

と、2つの数の乗算になりました。

フォルダ名もファイルも関係ない

サンプルプログラムでは、フォルダに連番の数字やコマンド名などがわかりやすく入っていて、一見するとこのフォルダ名を見て動いてるのではと思うかもしれませんが、これはわかりやすさのためにつけてくれている名前なだけで、普通のプログラミング言語でいえばコメントにあたるようです。

サブフォルダの順番に意味がある場合があるので、ソート順でフォルダ名をつける必要があります。

実際、適当にフォルダ名を変えても問題なく動きました。

そして、GitHub で公開されていることから全フォルダに .gitkeep が置いてありますが、フォルダの中のファイルは何でも構いません。空でもいいし、好きなだけファイルを置いても動作に影響はありません。

Folders 言語の利点

ドキュメントにも書かれていますが、Windows ではディレクトリをいくつもっても、ディスク上のサイズが増えることはありません。先ほどの AddTwoNumbersOrStrings プログラムのフォルダのプロパティを表示しても、サイズは0と表示されます。

言語のオリジナル作者も、352,449 フォルダを含むフォルダを作ってもサイズは0だった、と報告しています。ディスク資源を消費することのない、夢のプログラミング言語ですね!

…というのは冗談ですが、ソースコードの短さを競うコードゴルフにおいて、出題者のルール決めに不備が有った場合にはこの Folders が最強のコードゴルフ言語となるでしょう。

via Hacker News