カテゴリー
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

カテゴリー
技術

プログラムはロックだ。あるいはロックがプログラムだ。プログラミング言語Rockstar

[2021-12-08 追記] 独自ドメインで言語作者 Dylan Beattie さんによるrockstar の公式サイト ができていますね。

rockstar-js は、Rockstar言語の JavaScript によるトランスパイラ実装です。

Rockstarプログラミング言語とは何か? 言語仕様書にあるように、「1980年代ハードロック・パワーバラードの歌詞に大きく影響を受けた、歌詞として通用するプログラムが書けるようにデザインされた新言語」です。

FizzBuzz の実装は、サンプルコードからたとえばこんな感じになるということで、


Modulus takes Number and Divisor
While Number is as high as Divisor
Put Number minus Divisor into Number
(blank line ending While block)
Give back Number
(blank line ending function declaration)
Limit is 100
Counter is 0
Fizz is 3
Buzz is 5
Until Counter is Limit
Build Counter up

これだと、英語の文章風といってもまだ「あ、プログラミング言語だな。FizzBuzz 書いてるんだな」となりますが、言語仕様を活用してロック風に書いた例では、こんな風になってきます。


Midnight takes your heart and your soul
While your heart is as high as your soul
Put your heart without your soul into your heart

Give back your heart

Desire is a lovestruck ladykiller
My world is nothing
Fire is ice
Hate is water
Until my world is Desire
Build my world up
If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing
Shout "FizzBuzz!"
Take it to the top


歌詞だと思って訳してみました。

真夜中がお前の心と魂を奪う
お前の心が魂と同じ高みにある時
魂のない心をお前の心に注げ

心を取り戻せ

欲望は恋に落ちた色男
俺の世界には何もない
炎は氷
憎しみは水
俺の世界が欲望ならば
その世界を築きあげろ
真夜中が俺の世界を奪うなら、炎なんてなんでもない
真夜中が俺の世界を奪うなら、憎しみなんてなんでもない
“FizzBuzz!”と叫べ
それを頂へと高めよ

任意の小文字の単語に冠詞や”my”, “your”をつけると変数になるとか、代名詞は直近に定義された変数を参照するというルールに、true/false でなく right/wrong, +/- の演算のエイリアスとして”Build up”/”Knock down”が使えるとか、加減乗を”with”/”without”/”of” でも表せるとか、ドラマティックな歌詞を書けるようにする仕様が用意されています。

たくさん数値が出てくるとロックっぽくないので、数値も任意の単語の語の長さなどで表現できるようになっています。

これで、”boolean heart = true;”みたいな文を、”My heart is true”と書けたり、”int i = 16;”が”Sweet Lucy was a dancer”(a=1, dancer=6 文字で16)と書けたりするわけですね。制御構文も用意されていてループも書けるので、慣れてくれば前述の2つ目のような、実にロックっぽい動くプログラムが書けてしまう、ということ。実際手元で変換したコードが、ちゃんとFizzBuzz として動きました。

rockstar-js は、JavaScript製パーザ・ジェネレータPEG.jsで作られています。言語仕様のメモには「ミートローフの歌詞に意味があるように見えるようなプログラミング言語があったら面白いだろう?」とも有ったので、Meatloaf の曲の歌詞を食わせてみたのですが、I’d の “‘” でパーズエラーになるなど、実際には言語仕様を良く読み込んでかなりの腕前が無いと、ロックの歌詞として読めつつもちゃんと動くプログラムを書くのは難しそうです。

言語仕様の方のリポジトリには、Python インタプリタのプルリクエストも投げられており、Rockstar言語がより多くの環境で使えるようになるかもしれませんね。

求人票に出てくる Rockstar

英語圏のIT業界の求人募集では、「突出した才能を持った人」という意味で、”Wizard”(魔法使い)、”Guru”(導師)らと並んで、”Rockstar”求む、などと書いてることがあります。まあ、使い古されてちょっと飽き飽きされている表現なのかもしれません。実際、向こうの求人サイトを検索してみると、Rockstarたくさん出てきます。何千件も

dylanbeattieさんがRockstarの言語仕様を作って公開した主な動機の一つは、

もし Rockstar を実在する(無意味な)プログラミング言語にできたら、リクルーターや人事マネージャーは二度と「ロックスター・プログラマー求む」って書けないだろう?

だそうです。そんな突出した人材を欲している企業に、この Rockstar 言語を覚えただけの人が求職してきても困るでしょうね。

via Hacker News

カテゴリー
技術

Anyprint – いろんな言語のprint命令がPythonで使えるライブラリ

ライブラリ anyprint をインポートするだけで、Python で以下のような出力文が書けるようになります。


printf("printf %d\n", 10);

fmt.Println("hello")

cout << "Hello, C++!" << endl;

Print["Hello from Mathematica!"]

console.log("yes");

io.write("lua land")

System.out.printf("java stuff\n");

System.Console.WriteLine("C# looks awkard");

Ada.Text_IO.Put_Line("Ada is cool")

IO.puts("elixir")

現在サポートされている他言語は、go, Java, VB .NET, C(とその類似言語), ActionScript, Ada, Amiga E, ASP, B, D, PureBasic, Clipper, C++, C#, Delphi, JavaScript, Lua, Mathematica, matlab, nim, Pascal, Pike, Elixir のようです。

Objective-C の NSLog, Ruby のp はプルリクエストが出ています。Closure風 と Rust風は Python の中では難しいと作者が答えていますが、誰か解決できる人がいたら挑戦してみてはどうでしょうか。

Pythonがメインの言語でない人でも、これを入れておけば自分の慣れた方法でprintできますね。

利用者からの推薦文が載ってますが、味わい深いです。

  • 「おかしいよあんた」
  • 「馬鹿馬鹿しいし役立たずだ」
  • 「僕の推薦文を追加してよ『なんて正確な推薦文たち』」
  • 「kragniz, おかしなPythonのメタモジュールばっかり公開するのはよせよ」

via Hacker News