[ ここに Baruch De Spinoza の肖像画が載る ]
純粋関数型プログラミング言語spinozaに惚れて
先日、皆のアイドルであるところのkenokabeさんがQiitaから追放されてしまいました。
kenokabeさんは、Qiita上で良質のポエムを投稿する、実力派ITポエマーで、私はそんな彼の大ファンでした。
彼が追放されてしまった今、彼の新作を見る事はできません。
彼の生産物をもっと見たいのに、もうそれは叶わない願いになってしまった……そんなやりきれない気持ちをどうにかするために、彼が最期に遺した""純粋関数型""プログラミング言語spinozaの一部をAPLで実装しました。
APLはIBM Mainframeとかで使われていた配列指向言語です。
spinozaでは、『【値】を明示的に【集合】として取り扱うには「配列」データ型で表現』するため、配列を中心に回るAPLと親和性が高いことでしょう。
実装上の制限
- 値は数字か関数しか取れない。( Stringは存在しない。 )
- 関数名はシングルクォーテーションで囲む必要がある。
- GNU APL に依存している
実装
spinoza.apl
∇Spinoza ;R
'===== spinoza ====='
→((';'≢¯1↑R)∧'world = $'≢9↑R←⍞)/7
→((⍴R)=⍴⍕R←⍎¯1↓9↓R)/5
R←⌽R
R←⍎⍕R
→2
'===== APL ====='⍫
∇R←out X
→((⍴X)=⍴⍕X)/3
X←⌽X
R←⎕←' > ',X⍫
使用例
testcases
Coding$ apl --script -f hoge.apl
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
* Spinoza<CR> to enter Spinoza interpreter. *
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
∇R←APL
R←'APL'⍫
∇R←Hello x
R←'Hello, ',x⍫
∇R←plus10 x
R←x+10⍫
Spinoza
===== spinoza =====
world = $(1);
world = $(1)('out');
> 1
world = $(1)(2)(3);
world = $(1)(2)(3)('out');
> 1 2 3
world = $(1)('plus10');
world = $(1)('plus10')('out');
> 11
world = $(1)(2)(3)('plus10');
world = $(1)(2)(3)('plus10')('out');
> 11 12 13
world = $('APL');
world = $('APL')('out');
> APL
world = $('APL')('Hello');
world = $('APL')('Hello')('out');
> Hello, APL
world = $(9)('⍳')('/')('+');
world = $(9)('⍳')('/')('+')('out');
> 45
===== APL =====
)OFF
Coding$
最後に
この実装は不完全です。
このままでは、spinozaは、圏論の概念もクソもない、Lispを分かりづらくしただけのようなクソ言語に成り下ってしまいます。
そこで、この実装を完全なものにすることを読者への課題とします。
別の人による実装を通して、彼の遺した言語の"""素晴しさ"""が少しでも伝われば幸いです。