1. Mal は Clojure に影響を受けた Lisp インタプリタです
2. マルは学習ツールです
mal の各実装は、Lisp の核となる概念を示す 11 の段階的な自己完結型 (そしてテスト可能な) ステップに分かれています。最後のステップでは、自己ホスティング (mal の mal 実装の実行) が可能です。 make-a-lisp プロセス ガイドを参照してください。
make-a-lisp の手順は次のとおりです。
各 make-a-lisp ステップには、関連するアーキテクチャ図があります。そのステップの新しい要素は赤色で強調表示されます。ステップ A が完了した後の最終的なアーキテクチャは次のとおりです。
mal 実装の作成に興味がある場合 (または単に何かに mal を使用することに興味がある場合) は、Discord に参加することを歓迎します。 make-a-lisp プロセス ガイドに加えて、mal/make-a-lisp FAQ もあり、いくつかの一般的な質問に答えようとしています。
3. Mal は 88 の言語で実装されています (94 の異なる実装と 117 のランタイム モード)
言語 | クリエイター |
---|---|
エイダ | クリス・ムーア |
エイダ #2 | ニコラ・ブーランゲス |
GNU Awk | 刈谷充 |
バッシュ4 | ジョエル・マーティン |
BASIC (C64 および QBasic) | ジョエル・マーティン |
BBCベーシックV | ベン・ハリス |
C | ジョエル・マーティン |
C#2 | ダンカン・ワッツ |
C++ | スティーブン・サールウォール |
C# | ジョエル・マーティン |
チャック | ヴァシリー・シュナイダーマン |
Clojure (Clojure および ClojureScript) | ジョエル・マーティン |
コーヒースクリプト | ジョエル・マーティン |
共通Lisp | イクバル・アンサリ |
結晶 | リンダ_pp |
D | ドブ・ムリク |
ダーツ | ハリー・ターケルセン |
エリクサー | マーティン・エク |
エルム | ヨス・ファン・バケル |
Emacs Lisp | ヴァシリー・シュナイダーマン |
アーラン | ネイサン・フィードラー |
ES6 (ECMAScript 2015) | ジョエル・マーティン |
F# | ピーター・スティーブンス |
要素 | ジョーダン・ルイス |
ファントム | ドブ・ムリック |
フェンネル | そがいう |
フォース | クリス・ハウザー |
GNU ガイル | ムー・レイ |
GNU Smalltalk | ヴァシリー・シュナイダーマン |
行く | ジョエル・マーティン |
グルーヴィー | ジョエル・マーティン |
ハスケル | ジョエル・マーティン |
Haxe (Neko、Python、C++、JS) | ジョエル・マーティン |
ハイ | ジョエル・マーティン |
イオ | ドブ・ムリック |
ジャネット | そがいう |
ジャワ | ジョエル・マーティン |
Java Truffle (Truffle/GraalVM) | マット・マッギル |
JavaScript (デモ) | ジョエル・マーティン |
jq | アリ・モハマドプール |
ジュリア | ジョエル・マーティン |
コトリン | ハビエル・フェルナンデス=アイバーン |
LaTeX3 | ニコラ・ブーランゲス |
ライブスクリプト | ヨス・ファン・バケル |
ロゴ | ドブ・ムリク |
ルア | ジョエル・マーティン |
GNU Make | ジョエル・マーティン |
マルそのもの | ジョエル・マーティン |
MATLAB (GNU オクターブ & MATLAB) | ジョエル・マーティン |
miniMAL (リポジトリ、デモ) | ジョエル・マーティン |
NASM | ベン・ダドソン |
ニム | デニス・フェルシング |
オブジェクト パスカル | ジョエル・マーティン |
目標 C | ジョエル・マーティン |
OCaml | クリス・ハウザー |
パール | ジョエル・マーティン |
パール6 | ヒンリク・オルン・シグルソン |
PHP | ジョエル・マーティン |
ピコスプ | ヴァシリー・シュナイダーマン |
パイク | ドブ・ムリク |
PL/pgSQL (PostgreSQL) | ジョエル・マーティン |
PL/SQL (オラクル) | ジョエル・マーティン |
追記 | ジョエル・マーティン |
パワーシェル | ジョエル・マーティン |
プロローグ | ニコラ・ブーランゲス |
PureScript | ムルセクット |
Python2 | ジョエル・マーティン |
Python3 | ギャビン・ルイス |
RPython | ジョエル・マーティン |
R | ジョエル・マーティン |
ラケット | ジョエル・マーティン |
レックス | ドブ・ムリック |
ルビー | ジョエル・マーティン |
ルビー #2 | ライアン・クック |
さび | ジョエル・マーティン |
スカラ座 | ジョエル・マーティン |
スキーム(R7RS) | ヴァシリー・シュナイダーマン |
スキュー | ドブ・ムリク |
標準ML | ファビアン・バーグストロム |
スイフト3 | ジョエル・マーティン |
スイフト4 | 陆遥 |
スイフト6 | オレグ・モンタク |
Tcl | ドブ・ムリック |
TypeScript | ワカメマサヒロ |
ヴァラ | サイモン・テイサム |
VHDL | ドブ・ムリック |
Vimscript | ドブ・ムリック |
Visual Basic.NET | ジョエル・マーティン |
Visual Basic スクリプト | 刘百超 |
WebAssembly (wasm) | ジョエル・マーティン |
ミソサザイ | ドブ・ムリック |
XSLT | アリ・モハマドプール |
ヨリック | ドブ・ムリック |
ジグ | ジョシュ・トービン |
Mal は、Clojure West 2014 のライトニング トークで初めて公の場で披露されました (残念ながらビデオはありません)。カンファレンスで行われたプレゼンテーションについては、examples/clojurewest2014.mal を参照してください (はい、プレゼンテーションは mal プログラムです)。
Midwest.io 2015 で、Joel Martin は「Achievement Unlocked: A Better Path to Language Learning」と題して Mal についてプレゼンテーションを行いました。ビデオ、スライド。
最近では、Joel が LambdaConf 2016 で「Make Your Own Lisp Interpreter in 10 Incremental Steps」(パート 1、パート 2、パート 3、パート 4、スライド) に関するプレゼンテーションを行いました。
特定の実装を実行する最も簡単な方法は、docker を使用することです。すべての実装には、言語の依存関係がインストールされた状態で事前に構築された Docker イメージが含まれています。最上位 Makefile 内の便利なターゲットを使用して REPL を起動できます (IMPL は実装ディレクトリ名、stepX は実行するステップです)。
make DOCKERIZE=1 "repl^IMPL^stepX"
# OR stepA is the default step:
make DOCKERIZE=1 "repl^IMPL"
次の実装は別のプロジェクトとして維持されます。
Ada 実装は、debian 上の GNAT 4.9 を使用して開発されました。 Windows バージョンの git、GNAT、および (オプションで) make がある場合は、Windows 上でも変更せずにコンパイルされます。外部依存関係はありません (readline は実装されていません)。
cd impls/ada
make
./stepX_YYY
2 番目の Ada 実装は GNAT 8 で開発され、GNU readline ライブラリとリンクします。
cd impls/ada
make
./stepX_YYY
mal の GNU awk 実装は、GNU awk 4.1.1 でテストされています。
cd impls/gawk
gawk -O -f stepX_YYY.awk
cd impls/bash
bash stepX_YYY.sh
BASIC 実装では、C64 BASIC (CBM v2) または QBasic の両方と互換性のある BASIC コードを生成できるプリプロセッサが使用されます。 C64 モードは cmbbasic でテストされており (現在、ライン入力の問題を修正するにはパッチ適用されたバージョンが必要です)、QBasic モードは FreeBASIC でテストされています。
C64 コードを生成し、cbmbasic を使用して実行します。
cd impls/basic
make MODE=cbm stepX_YYY.bas
STEP=stepX_YYY basic_MODE=cbm ./run
QBasic コードを生成し、FreeBASIC を使用してコンパイルし、実行します。
cd impls/basic
make MODE=qbasic stepX_YYY.bas
make MODE=qbasic stepX_YYY
./stepX_YYY
この実装の最初のインスピレーションを与えてくれた Steven Syrek に感謝します。
BBC BASIC V 実装は Brandy インタープリタで実行できます。
cd impls/bbc-basic
brandy -quit stepX_YYY.bbc
または、RISC OS 3 以降の ARM BBC BASIC V では次のようになります。
*Dir bbc-basic.riscos
*Run setup
*Run stepX_YYY
mal の C 実装には、次のライブラリ (lib およびヘッダー パッケージ): glib、libffi6、libgc、および libedit または GNU readline ライブラリが必要です。
cd impls/c
make
./stepX_YYY
mal の 2 番目の C 実装には、libedit、libgc、libdl、および libffi のライブラリ (lib およびヘッダー パッケージ) が必要です。
cd impls/c.2
make
./stepX_YYY
mal の C++ 実装には、g++-4.9 または Clang++-3.5 と、readline 互換ライブラリのビルドが必要です。詳細については、 cpp/README.md
を参照してください。
cd impls/cpp
make
# OR
make CXX=clang++-3.5
./stepX_YYY
mal の C# 実装は、Mono C# コンパイラー (mcs) と Mono ランタイム (バージョン 2.10.8.1) を使用して Linux 上でテストされています。 C# 実装をビルドして実行するには、両方とも必要です。
cd impls/cs
make
mono ./stepX_YYY.exe
ChucK 実装は ChucK 1.3.5.2 でテストされています。
cd impls/chuck
./run
ほとんどの場合、Clojure の実装には Clojure 1.5 が必要ですが、すべてのテストに合格するには、Clojure 1.8.0-RC4 が必要です。
cd impls/clojure
lein with-profile +stepX trampoline run
sudo npm install -g coffee-script
cd impls/coffee
coffee ./stepX_YYY
実装は、Ubuntu 16.04 および Ubuntu 12.04 上の SBCL、CCL、CMUCL、GNU CLISP、ECL、および Allegro CL を使用してテストされています。詳細については、README を参照してください。前述の依存関係がインストールされている場合、次の手順を実行して実装を実行します。
cd impls/common-lisp
make
./run
Crystal の mal 実装は、Crystal 0.26.1 でテストされています。
cd impls/crystal
crystal run ./stepX_YYY.cr
# OR
make # needed to run tests
./stepX_YYY
mal の D 実装は GDC 4.8 でテストされました。 GNU readline ライブラリが必要です。
cd impls/d
make
./stepX_YYY
Dart 実装は Dart 1.20 でテストされています。
cd impls/dart
dart ./stepX_YYY
mal の Emacs Lisp 実装は、Emacs 24.3 および 24.5 でテストされています。非常に基本的な readline 編集 ( <backspace>
とCd
機能しますが、 Cc
プロセスをキャンセルします) もありますが、 rlwrap
使用することをお勧めします。
cd impls/elisp
emacs -Q --batch --load stepX_YYY.el
# with full readline support
rlwrap emacs -Q --batch --load stepX_YYY.el
Elixir の mal 実装は Elixir 1.0.5 でテストされています。
cd impls/elixir
mix stepX_YYY
# Or with readline/line editing functionality:
iex -S mix stepX_YYY
Elm の mal 実装は Elm 0.18.0 でテストされています
cd impls/elm
make stepX_YYY.js
STEP=stepX_YYY ./run
mal の Erlang 実装には、構築するために Erlang/OTP R17 と rebar が必要です。
cd impls/erlang
make
# OR
MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
./stepX_YYY
ES6 / ECMAScript 2015 実装では、babel コンパイラーを使用して ES5 互換の JavaScript を生成します。生成されたコードは Node 0.12.4 でテストされています。
cd impls/es6
make
node build/stepX_YYY.js
mal の F# 実装は、Mono F# コンパイラ (fsharpc) と Mono ランタイム (バージョン 3.12.1) を使用して Linux 上でテストされています。 readline の依存関係をコンパイルするには、mono C# コンパイラー (mcs) も必要です。 F# 実装をビルドして実行するには、すべてが必要です。
cd impls/fsharp
make
mono ./stepX_YYY.exe
mal の Factor 実装は、Factor 0.97 (factorcode.org) でテストされています。
cd impls/factor
FACTOR_ROOTS=. factor -run=stepX_YYY
Fantom の mal 実装は Fantom 1.0.70 でテストされています。
cd impls/fantom
make lib/fan/stepX_YYY.pod
STEP=stepX_YYY ./run
Fennel の mal 実装は、Lua 5.4 上の Fennel バージョン 0.9.1 でテストされています。
cd impls/fennel
fennel ./stepX_YYY.fnl
cd impls/forth
gforth stepX_YYY.fs
cd impls/guile
guile -L ./ stepX_YYY.scm
mal の Smalltalk 実装は、GNU Smalltalk 3.2.91 でテストされています。
cd impls/gnu-smalltalk
./run
mal の Go 実装では、go がパス上にインストールされている必要があります。実装は Go 1.3.1 でテストされています。
cd impls/go
make
./stepX_YYY
mal の Groovy 実装には Groovy を実行する必要があり、Groovy 1.8.6 でテストされています。
cd impls/groovy
make
groovy ./stepX_YYY.groovy
Haskell の実装には、ghc コンパイラ バージョン 7.10.1 以降と、Haskell parsec および readline (または editline) パッケージが必要です。
cd impls/haskell
make
./stepX_YYY
mal の Haxe 実装では、コンパイルに Haxe バージョン 3.2 が必要です。 4 つの異なる Haxe ターゲット (Neko、Python、C++、JavaScript) がサポートされています。
cd impls/haxe
# Neko
make all-neko
neko ./stepX_YYY.n
# Python
make all-python
python3 ./stepX_YYY.py
# C++
make all-cpp
./cpp/stepX_YYY
# JavaScript
make all-js
node ./stepX_YYY.js
mal の Hy 実装は Hy 0.13.0 でテストされています。
cd impls/hy
./stepX_YYY.hy
mal の Io 実装は、Io バージョン 20110905 でテストされています。
cd impls/io
io ./stepX_YYY.io
Janet の mal 実装は、Janet バージョン 1.12.2 でテストされています。
cd impls/janet
janet ./stepX_YYY.janet
mal の Java 実装には、maven2 をビルドする必要があります。
cd impls/java
mvn compile
mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY
# OR
mvn -quiet exec:java -Dexec.mainClass=mal.stepX_YYY -Dexec.args="CMDLINE_ARGS"
この Java 実装は OpenJDK 上で実行されますが、Truffle フレームワークのおかげで GraalVM 上では 30 倍高速に実行できます。 OpenJDK 11、GraalVM CE 20.1.0、および GraalVM CE 21.1.0 でテストされています。
cd impls/java-truffle
./gradlew build
STEP=stepX_YYY ./run
cd impls/js
npm install
node stepX_YYY.js
Julia の mal 実装には Julia 0.4 が必要です。
cd impls/julia
julia stepX_YYY.jl
バージョン 1.6 に対してテスト済みですが、IO 部門に多くの不正行為が含まれています
cd impls/jq
STEP=stepA_YYY ./run
# with Debug
DEBUG=true STEP=stepA_YYY ./run
mal の Kotlin 実装は Kotlin 1.0 でテストされています。
cd impls/kotlin
make
java -jar stepX_YYY.jar
mal の LaTeX3 実装は、pdfTeX 3.141592653-2.6-1.40.24 でテストされています。
セルフホスティングは、適切なタイムアウトを発生させるには遅すぎるため、ステップ 4 でクラッシュします。これは、明らかにハードコードされた制限が原因です。
これに取り組んでいる人は、ステップ ファイル内の 2 行の (遅い) デバッグ オプションのコメントを解除し、DEBUG=1 をエクスポートする必要があります (テストが受け入れるよりも多くの出力を得る場合)。
mal の LiveScript 実装は LiveScript 1.5 でテストされています。
cd impls/livescript
make
node_modules/.bin/lsc stepX_YYY.ls
mal のロゴ実装は UCBLogo 6.0 でテストされています。
cd impls/logo
logo stepX_YYY.lg
mal の Lua 実装は Lua 5.3.5 でテストされています。実装には luarocks がインストールされている必要があります。
cd impls/lua
make # to build and link linenoise.so and rex_pcre.so
./stepX_YYY.lua
mal の mal 実装を実行するには、他の実装のいずれかの stepA を実行し、実行する mal ステップをコマンド ライン引数として渡す必要があります。
cd impls/IMPL
IMPL_STEPA_CMD ../mal/stepX_YYY.mal
cd impls/make
make -f stepX_YYY.mk
mal の NASM 実装は x86-64 Linux 用に書かれており、Linux 3.16.0-4-amd64 および NASM バージョン 2.11.05 でテストされています。
cd impls/nasm
make
./stepX_YYY
mal の Nim 実装は Nim 1.0.4 でテストされています。
cd impls/nim
make
# OR
nimble build
./stepX_YYY
mal の Object Pascal 実装は、Free Pascal コンパイラ バージョン 2.6.2 および 2.6.4 を使用して Linux 上で構築およびテストされています。
cd impls/objpascal
make
./stepX_YYY
mal の Objective C 実装は、clang/LLVM 3.6 を使用して Linux 上で構築およびテストされています。また、Xcode 7 を使用して OS X 上でも構築およびテストされています。
cd impls/objc
make
./stepX_YYY
cd impls/ocaml
make
./stepX_YYY
MatLab 実装は GNU Octave 4.2.1 でテストされています。 Linux 上の MATLAB バージョン R2014a でもテストされています。 MATLAB は商用製品であることに注意してください。
cd impls/matlab
./stepX_YYY
octave -q --no-gui --no-history --eval "stepX_YYY();quit;"
matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY();quit;"
# OR with command line arguments
octave -q --no-gui --no-history --eval "stepX_YYY('arg1','arg2');quit;"
matlab -nodisplay -nosplash -nodesktop -nojvm -r "stepX_YYY('arg1','arg2');quit;"
miniMAL は、1024 バイト未満の JavaScript で実装された小さな Lisp インタープリターです。 mal の miniMAL 実装を実行するには、miniMAL インタープリター (Node.js が必要) をダウンロード/インストールする必要があります。
cd impls/miniMAL
# Download miniMAL and dependencies
npm install
export PATH=`pwd`/node_modules/minimal-lisp/:$PATH
# Now run mal implementation in miniMAL
miniMAL ./stepX_YYY
Perl 5 実装は Perl 5.19.3 以降で動作するはずです。
readline 行編集をサポートするには、CPAN から Term::ReadLine::Perl または Term::ReadLine::Gnu をインストールします。
cd impls/perl
perl stepX_YYY.pl
Perl 6 の実装は、Rakudo Perl 6 2016.04 でテストされました。
cd impls/perl6
perl6 stepX_YYY.pl
mal の PHP 実装では、php コマンド ライン インターフェイスを実行する必要があります。
cd impls/php
php stepX_YYY.php
Picolisp の実装には、libreadline および Picolisp 3.1.11 以降が必要です。
cd impls/picolisp
./run
Pike の実装は Pike 8.0 でテストされました。
cd impls/pike
pike stepX_YYY.pike
mal の PL/pgSQL 実装には、実行中の PostgreSQL サーバーが必要です (「kanaka/mal-test-plpgsql」Docker イメージによって PostgreSQL サーバーが自動的に起動されます)。この実装では、PostgreSQL サーバーに接続し、テーブルとストアド プロシージャを格納するための「mal」という名前のデータベースを作成します。ラッパー スクリプトは psql コマンドを使用してサーバーに接続し、デフォルトではユーザー「postgres」になりますが、これは PSQL_USER 環境変数で上書きできます。パスワードは、PGPASSWORD 環境変数を使用して指定できます。実装は PostgreSQL 9.4 でテストされています。
cd impls/plpgsql
./wrap.sh stepX_YYY.sql
# OR
PSQL_USER=myuser PGPASSWORD=mypass ./wrap.sh stepX_YYY.sql
mal の PL/SQL 実装には、実行中の Oracle DB サーバーが必要です (「kanaka/mal-test-plsql」Docker イメージにより、Oracle Express サーバーが自動的に起動します)。この実装では、Oracle サーバーに接続して、型、テーブル、ストアド プロシージャを作成します。デフォルトの SQL*Plus ログオン値 (username/password@connect_identifier) は「system/oracle」ですが、これは ORACLE_LOGON 環境変数で上書きできます。この実装は、Oracle Express Edition 11g リリース 2 でテストされています。SQL*Plus 接続の警告 (ユーザー パスワードの期限切れなど) は、ラッパー スクリプトが DB と通信する機能を妨げることに注意してください。
cd impls/plsql
./wrap.sh stepX_YYY.sql
# OR
ORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql
mal の PostScript 実装では、Ghostscript を実行する必要があります。 Ghostscript 9.10 でテストされています。
cd impls/ps
gs -q -dNODISPLAY -I./ stepX_YYY.ps
mal の PowerShell 実装には、PowerShell スクリプト言語が必要です。 Linux 上の PowerShell 6.0.0 Alpha 9 でテストされています。
cd impls/powershell
powershell ./stepX_YYY.ps1
Prolog 実装は、SWI-Prolog に固有のいくつかの構造を使用し、readline サポートを含み、バージョン 8.2.1 の Debian GNU/Linux でテストされています。
cd impls/prolog
swipl stepX_YYY
PureScript の実装には、spago コンパイラ バージョン 0.20.2 が必要です。
cd impls/purs
make
node ./stepX_YYY.js
この実装では python2 の機能のみを使用しますが、python3 との非互換性を回避します。
この実装では、スタイルとタイプ (flake8、pylint、mypy) がチェックされます。すべてのエラーを詳細とともに報告します。イテレータ、デコレータ、関数ツール、チェーン マップ、データクラス、イントロスペクション、match ステートメント、代入式を示します。
パス上に rpython が必要です (pypy に含まれています)。
cd impls/rpython
make # this takes a very long time
./stepX_YYY
mal の R 実装では、R (r-base-core) を実行する必要があります。
cd impls/r
make libs # to download and build rdyncall
Rscript stepX_YYY.r
Racket の mal 実装には、Racket コンパイラー/インタープリターを実行する必要があります。
cd impls/racket
./stepX_YYY.rkt
mal の Rexx 実装は Regina Rexx 3.6 でテストされています。
cd impls/rexx
make
rexx -a ./stepX_YYY.rexxpp
cd impls/ruby
ruby stepX_YYY.rb
次の目的を持った 2 番目の Ruby 実装:
Mal
モジュール名前空間にモジュール化 cd impls/ruby.2
ruby stepX_YYY.rb
mal の Rust 実装には、Rust コンパイラとビルド ツール (cargo) が必要です。
cd impls/rust
cargo run --release --bin stepX_YYY
scala と sbt をインストールします (http://www.scala-sbt.org/0.13/tutorial/Installing-sbt-on-Linux.html)。
cd impls/scala
sbt 'run-main stepX_YYY'
# OR
sbt compile
scala -classpath target/scala*/classes stepX_YYY
MAL の Scheme 実装は、Chibi-Scheme 0.10、Kawa 3.1.1、Gauche 0.9.6、CHICKEN 5.1.0、Sagittarius 0.9.7、Cyclone 0.32.0 (Git バージョン)、および Foment 0.4 (Git バージョン) でテストされています。ライブラリがどのようにロードされるかを理解し、 Makefile
調整してそれに応じてスクリプトをrun
、他の適合する R7RS 実装でも実行できるはずです。
cd impls/scheme
# chibi
scheme_MODE=chibi ./run
# kawa
make kawa
scheme_MODE=kawa ./run
# gauche
scheme_MODE=gauche ./run
# chicken
make chicken
scheme_MODE=chicken ./run
# sagittarius
scheme_MODE=sagittarius ./run
# cyclone
make cyclone
scheme_MODE=cyclone ./run
# foment
scheme_MODE=foment ./run
mal の Skew 実装は、Skew 0.7.42 でテストされています。
cd impls/skew
make
node stepX_YYY.js
mal の標準 ML 実装には、SML97 実装が必要です。 Makefile は Poly/ML、MLton、Moscow ML をサポートしており、Poly/ML 5.8.1、MLton 20210117、Moscow ML バージョン 2.10 でテストされています。
cd impls/sml
# Poly/ML
make sml_MODE=polyml
./stepX_YYY
# MLton
make sml_MODE=mlton
./stepX_YYY
# Moscow ML
make sml_MODE=mosml
./stepX_YYY
mal の Swift 3 実装には、Swift 3.0 コンパイラが必要です。 Swift 3 Preview 3 でテストされています。
cd impls/swift3
make
./stepX_YYY
mal の Swift 4 実装には、Swift 4.0 コンパイラが必要です。 Swift 4.2.3 リリースでテストされています。
cd impls/swift4
make
./stepX_YYY
mal の Swift 5 実装には、Swift 5.0 コンパイラが必要です。 Swift 5.1.1 リリースでテストされています。
cd impls/swift6
swift run stepX_YYY
mal の Tcl 実装では、Tcl 8.6 を実行する必要があります。 readline 行編集をサポートするには、tclreadline をインストールします。
cd impls/tcl
tclsh ./stepX_YYY.tcl
mal の TypeScript 実装には、TypeScript 2.2 コンパイラが必要です。 Node.js v6 でテストされています。
cd impls/ts
make
node ./stepX_YYY.js
mal の Vala 実装は、Vala 0.40.8 コンパイラーでテストされています。 valac
とlibreadline-dev
または同等のものをインストールする必要があります。
cd impls/vala
make
./stepX_YYY
mal の VHDL 実装は GHDL 0.29 でテストされています。
cd impls/vhdl
make
./run_vhdl.sh ./stepX_YYY
Vimscript で mal を実装するには、Vim 8.0 を実行する必要があります。
cd impls/vimscript
./run_vimscript.sh ./stepX_YYY.vim
mal の VB.NET 実装は、Mono VB コンパイラ (vbnc) と Mono ランタイム (バージョン 2.10.8.1) を使用して Linux 上でテストされています。 VB.NET 実装をビルドして実行するには、両方とも必要です。
cd impls/vb
make
mono ./stepX_YYY.exe
mal の VBScript 実装は、Windows 10 1909 でテストされていますinstall.vbs
要件 (.NET 2.0 3.0 3.5) をインストールするのに役立ちます。 .NET 2.0 3.0 3.5
インストールしていない場合は、インストール用のウィンドウがポップアップ表示されます。すでにインストールされている場合は何も起こりません。
cd implsvbs
install.vbs
cscript -nologo stepX_YYY.vbs
WebAssembly 実装は Wam (WebAssembly マクロ言語) で書かれており、いくつかの異なる非 Web 埋め込み (ランタイム) の下で実行されます:node、wasmtime、wasmer、wax、wace、warpy。
cd impls/wasm
# node
make wasm_MODE=node
./run.js ./stepX_YYY.wasm
# wasmtime
make wasm_MODE=wasmtime
wasmtime --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
# wasmer
make wasm_MODE=wasmer
wasmer run --dir=./ --dir=../ --dir=/ ./stepX_YYY.wasm
# wax
make wasm_MODE=wax
wax ./stepX_YYY.wasm
# wace
make wasm_MODE=wace_libc
wace ./stepX_YYY.wasm
# warpy
make wasm_MODE=warpy
warpy --argv --memory-pages 256 ./stepX_YYY.wasm
mal の XSLT 実装は XSLT 3 で書かれており、Saxon 9.9.1.6 Home Edition でテストされています。
cd impls/xslt
STEP=stepX_YY ./run
Wren の mal 実装は Wren 0.2.0 でテストされました。
cd impls/wren
wren ./stepX_YYY.wren
Yorick の mal 実装は Yorick 2.2.04 でテストされました。
cd impls/yorick
yorick -batch ./stepX_YYY.i
mal の Zig 実装は Zig 0.5 でテストされました。
cd impls/zig
zig build stepX_YYY
最上位の Makefile には、実装の開発とテストを支援する便利なターゲットが多数含まれています。 help
ターゲットには、ターゲットとオプションのリストが表示されます。
make help
tests/
ディレクトリには、(すべての実装に対して) 約 800 の汎用機能テストがあります。各ステップには、そのステップに固有のテストを含む対応するテスト ファイルがあります。 runtest.py
テスト ハーネスは、Mal ステップ実装を起動し、テストを一度に 1 つずつ実装にフィードし、出力/戻り値を期待される出力/戻り値と比較します。
make test
make "test^IMPL"
# e.g.
make "test^clojure"
make "test^js"
make "test^stepX"
# e.g.
make "test^step2"
make "test^step7"
make "test^IMPL^stepX"
# e.g
make "test^ruby^step3"
make "test^ps^step4"
mal
指定し、 MAL_IMPL
make 変数を使用して基礎となるホスト言語 (デフォルトは JavaScript) を変更します。 make MAL_IMPL=IMPL "test^mal^step2"
# e.g.
make "test^mal^step2" # js is default
make MAL_IMPL=ruby "test^mal^step2"
make MAL_IMPL=python3 "test^mal^step2"
make "repl^IMPL^stepX"
# e.g
make "repl^ruby^step3"
make "repl^ps^step4"
stepA
が使用されます。 make "repl^IMPL"
# e.g
make "repl^ruby"
make "repl^ps"
mal
指定し、 MAL_IMPL
make 変数を使用して基礎となるホスト言語 (デフォルトは JavaScript) を変更します。 make MAL_IMPL=IMPL "repl^mal^stepX"
# e.g.
make "repl^mal^step2" # js is default
make MAL_IMPL=ruby "repl^mal^step2"
make MAL_IMPL=python3 "repl^mal"
警告: これらのパフォーマンス テストは統計的に有効でも包括的でもありません。実行時のパフォーマンスは mal の主な目標ではありません。これらのパフォーマンス テストから重大な結論が得られた場合は、カンザス州の素晴らしい海沿いの不動産について私に連絡してください。喜んで格安で販売します。
make "perf^IMPL"
# e.g.
make "perf^js"
make "perf"
make "stats^IMPL"
# e.g.
make "stats^js"
すべての実装ディレクトリには、その実装のすべての依存関係を含む Docker イメージを作成するための Dockerfile が含まれています。さらに、トップレベルの Makefile には、make コマンド ラインで「DOCKERIZE=1」を渡すことによって、その実装の Docker コンテナ内でテスト ターゲット (および perf、stats、repl など) を実行するためのサポートが含まれています。例えば:
make DOCKERIZE=1 "test^js^step3"
既存の実装では、すでに Docker イメージが構築され、Docker レジストリにプッシュされています。ただし、Docker イメージをローカルで構築または再構築する場合は、トップレベルの Makefile で Docker イメージを構築するためのルールが提供されます。
make "docker-build^IMPL"
注:
make DOCKERIZE=1 "repl^IMPL"
必要があります。これは、テストを実行する前に、実行時の依存関係をダウンロードする必要があるためです。テストがタイムアウトします。これらの依存関係は /mal ディレクトリ内のドット ファイルにダウンロードされるため、実行間で保持されます。 Mal (make-a-lisp) は、MPL 2.0 (Mozilla Public License 2.0) に基づいてライセンスされています。詳細については、LICENSE.txt を参照してください。