LoginSignup
14

More than 5 years have passed since last update.

純粋関数型プログラミング言語spinozaに惚れて

Last updated at Posted at 2015-01-26

[ ここに 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を分かりづらくしただけのようなクソ言語に成り下ってしまいます。
そこで、この実装を完全なものにすることを読者への課題とします。

別の人による実装を通して、彼の遺した言語の"""素晴しさ"""が少しでも伝われば幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14