プログラミング
April: Common LispにおけるDSLとしてのAPL
April: APL as a DSL in Common Lisp (github.com)
要約
Aprilは、APL(A Programming Language)のサブセットをCommon Lispにコンパイルするプロジェクトです。APLの強力な表現力とCommon Lispのマクロ機能や数値処理能力を組み合わせることで、Lisp開発者がAPLの利点を活用できるようになります。これにより、複雑な数値計算コードを数行のAPLで記述することが可能になり、データ処理の効率が大幅に向上します。
全文翻訳
April Array Programming Re-Imagined in Lisp
Ken Iversonの傑作がLispの媒体で反映されています。
AprilはAPLプログラミング言語のサブセットをCommon Lispにコンパイルします。Lispの強力なマクロと数値処理能力を活用し、APLの表現力をLisp開発者に提供します。
何百行もの数値計算コードを、APLの1行で置き換えます。
なぜAprilなのか?
APLはアルゴリズムの力で本当に唸りを上げます。数文字が字句解析器を通過するにつれて、膨大なデータフィールドが成長し、変化し、蒸留されてその秘密を明らかにします。
しかし、APLはこれまで象牙の塔に住んでおり、モノリシックな実行環境の中に隠れていました。APLで処理したいデータの蓄積がある場合、そこへ到達することは、狭い山道を通ってロバの背中に何トンもの貨物を運ぶような苦行になり得ます。
オリジナルのAPLインタープリタは、キーボードのみを入力とし、プリンターのみを出力とするメインフレームで実行されていました。そして、その実装アプローチの遺産は今日まで続いており、言語のリーチを制限しています。
しかし、もうそうではありません。
Lispはソフトウェアの世界の偉大なコネクタであり、APLが数値パターンを処理するのと同じ方法で、意味論的パターンを消化・変換します。Lisp内のAPLにより、データベース、ストリーム、バイナリファイル、その他のメディアは、APLでの処理からわずか数行のコードでアクセスできるようになります。
ディスカッション
現時点では、Aprilとその開発に関するディスカッションは、irc.libera.chatの##phantomicsチャンネルで行われています。
Aprilの開発をサポートする
Aprilの継続的な作業のために支援を提供したい場合は、Patreonを通じて貢献できます。
Aprilは、強力でフル機能のプロフェッショナルなAPL実装という目標に向けて、迅速かつ着実に進歩しています。その拡張性と他のソフトウェアとの統合の容易さは、ベクトル言語分野でゲームを変えるような利点を提供します。
2021年12月初旬のAprilのコードは、2020年9月初旬のコードから95%以上異なっていたことをご存知でしたか?
Aprilメディアと出版物
PLDI 2023プレゼンテーション
Aprilの遅延評価機能に関する論文のプレゼンテーション
ArrayCastインタビュー
Aprilの歴史と機能を探る開発者インタビュー
APL Seedsプレゼンテーション
DyalogのAPL Seeds '22カンファレンスでのAprilのプレゼンテーション
LispNYC Aprilコンパイラプレゼンテーション
初期のApril設計を示すビデオ概要とパネルディスカッション
European Lisp Symposium 2022論文
April: APLをCommon Lispにコンパイルする
Common Lisp実装との互換性
AprilはCommon Lispの数値および配列処理能力をテストします。SBCL、CCL、ECL、ABCL、Clasp、Allegro CL、LispWorksで動作することが確認されています。
SBCLとCCLは、機能するために特別な配慮なしに完全に互換性があると見なされています。ECLとClaspは、他のCL実装との違いに対処するための特定の配慮の助けを借りて、すべてのテストに合格します。ABCLは、基盤となるJava仮想マシンの制限によりロードできないツリーライブラリのすべてのテストを除き、特別な配慮の助けを借りてすべての主要テストに合格します。Allegro CLとLispWorksは両方とも、dfnテストの失敗を引き起こすいくつかの互換性の問題があります。実装間の機能の違いのリストについては、このドキュメントを参照してください。
自動インストール
AprilはQuicklispライブラリマネージャーから提供されているため、Aprilをインストールする最も簡単な方法はQuicklisp経由です。
QuicklispでAprilをインストールするには、次を評価します。
(ql:quickload 'april)
手動インストール
このリポジトリからAprilを手動でインストールしたい場合は、これらの手順に従うことができます。
リポジトリのクローン
まず、システム上の場所にリポジトリをクローンします。この例では、~/mystuff/aprilディレクトリにクローンしたとします。
Quicklispの準備
Quicklispのローカルプロジェクトディレクトリ(通常は~/quicklisp/local-projects)に入り、Aprilリポジトリをクローンしたディレクトリへのシンボリックリンクを作成します。たとえば、リポジトリを~/mystuff/aprilにクローンし、Quicklispディレクトリが~/quicklisp/の場合、次のように入力します。
cd ~/quicklisp/local-projects
ln -s ~/mystuff/april
依存関係のインストール
インストールを完了するには、Common Lisp REPLを起動して次のように入力します。
(ql:quickload 'april)
これにより、Aprilの依存関係がダウンロードおよびインストールされ、パッケージがビルドされて準備が整います。
APL関数と演算子
APL言語は、プリミティブ関数と演算子を表すために単一の文字を使用します。これらの記号のほとんどは標準ASCII文字セットの一部ではありませんが、APLに固有です。
Aprilがサポートするグリフのリストを表示するには、以下のリンクを参照してください。
完全なApril APL辞書はここにあります。
APLからLispへのコンパイラとしてのAprilの設計では意味をなさない一部のAPL関数と演算子は追加されません。将来的に追加されるものもあります。実装されていない機能のリストを参照してください。
APLを知る
APL言語の完全なガイドは、このファイルの範囲をはるかに超えていますが、いくつかの良い情報源へのリンクを以下に示します。
APLのハイレベルな紹介。
これは、Aprilのほとんどの関数と演算子をカバーする詳細な言語チュートリアルです。
APLの作成者であるKen Iversonによる、言語の根底にある哲学を詳述した元の論文。
クイックツアーをご希望の場合は、Aprilにはすべてのコマンドのデモと多くのAPL構文機能を印刷する関数が含まれています。
デモを表示するには、次のように入力します。
* (april (demo))
*はREPLプロンプトを示します。
長文の読書に備えてください。
印刷されるデモコンテンツには、各記号に対応する操作の名前が表示され、それぞれの機能のアイデアが得られるはずです。
APL文字の入力方法
APLプログラムを作成するには、言語の特殊文字セットを使用する方法が必要です。
EmacsでAPL入力を有効にする方法については、ここをクリックしてください。
VimでAPL入力を有効にする方法については、ここをクリックしてください。
GNU/Linuxで普遍的にAPL入力を有効にする方法については、ここをクリックしてください。
基本的な評価: (april) および (april-f)
APL式の評価は次のように簡単です。
* (april-f "1+2 3 4")
3 4 5
#(3 4 5)
上記のように、*はREPLプロンプトを示し、下のテキストは式の出力です。
(april-f)マクロ(april-formatの略)は、引数として渡されたAPL文字列を評価し、最終結果を返します。
(april-f)を使用すると、APLの従来の配列印刷スタイルでの出力の印刷も行われ、実際の出力値の前に表示されます。
上記のように、3 4 5が値#(3 4 5)の前に印刷されているのがわかります。
APLスタイルの印刷配列は、Lispの配列印刷スタイルよりも読みやすいです。APLは、Lispほど多くの異なるデータ型や構造を持っていないため、よりシンプルなスタイルを使用して出力を表現できます。
印刷出力を必要としない場合は、プレーンな(april)マクロを使用できます。
このように:
* (april "1+2 3 4")
#(3 4 5)
プログラム内でAprilを使用して計算を行っており、印刷出力が必要ない場合は(april)を使用してください。
それ以外の場合、特に大規模なデータセットを扱っている場合は、システムが計算結果を印刷する際にかなりのリソースを消費する可能性があります。
APLインスタンスの状態プロパティの設定は、次のように行うことができます。
* (april-f (with (:state :count-from 0)) "⍳9")
0 1 2 3 4 5 6 7 8
#(0 1 2 3 4 5 6 7 8)
(april)または(april-f)の最初の引数は、APL文字列の代わりにAPL環境のパラメータのリストにすることができます。
APL式は、2番目の引数で渡されます。
たとえば、:count-fromパラメータを使用して、評価されたAPLコード内の関数が0または1からカウントを開始するかどうかを決定できます。
これらのパラメータがどのように機能するかについては、後で詳しく説明します。
* (april-f (with (:state :count-from 1)) "⍳9")
1 2 3 4 5 6 7 8 9
#(1 2 3 4 5 6 7 8 9)
* (april-f (with (:state :count-from 0)) "⍳9")
0 1 2 3 4 5 6 7 8
#(0 1 2 3 4 5 6 7 8)
その他のAPL式:
* (april-f "⍳12")
1 2 3 4 5 6 7 8 9 10 11 12
#(1 2 3 4 5 6 7 8 9 10 11 12)
* (april-f "3 4⍴⍳12")
1 2 3 4 5 6 7 8 9 10 11 12
#2A((