1. Mal 是受 Clojure 啟發的 Lisp 解譯器
2.Mal是學習工具
mal 的每個實作都分為 11 個增量的、獨立的(且可測試的)步驟,展示了 Lisp 的核心概念。最後一步是能夠自架(運行 mal 的 mal 實作)。請參閱 make-a-lisp 流程指南。
make-a-lisp的步驟是:
每個 make-a-lisp 步驟都有相關的架構圖。該步驟中的新元素以紅色突出顯示。這是步驟 A 完成後的最終架構:
如果您有興趣創建 mal 實作(或只是對使用 mal 進行某些操作感興趣),歡迎加入我們的 Discord。除了 make-a-lisp 流程指南之外,還有 mal/make-a-lisp 常見問題解答,我嘗試在其中回答一些常見問題。
3. Mal以88種語言實現(94種不同的實作和117種運行模式)
語言 | 創作者 |
---|---|
艾達 | 克里斯·摩爾 |
艾達#2 | 尼古拉斯·布倫格斯 |
GNU awk | 刈谷滿 |
重擊4 | 喬爾馬丁 |
BASIC(C64 和 QBasic) | 喬爾馬丁 |
英國廣播公司基本五 | 本哈里斯 |
C | 喬爾馬丁 |
C#2 | 鄧肯·瓦茨 |
C++ | 史蒂芬·瑟爾沃爾 |
C# | 喬爾馬丁 |
查克 | 瓦西里·施奈德曼 |
Clojure(Clojure 和 ClojureScript) | 喬爾馬丁 |
咖啡腳本 | 喬爾馬丁 |
通用語言 | 伊克巴爾·安薩裡 |
水晶 | 琳達_pp |
D | 多夫·穆里克 |
鏢 | 哈里·特克爾森 |
靈丹妙藥 | 馬丁·艾克 |
榆樹 | 喬斯·範·巴克爾 |
Emacs Lisp | 瓦西里·施奈德曼 |
埃爾蘭 | 內森·費德勒 |
ES6(ECMAScript 2015) | 喬爾馬丁 |
F# | 彼得·史蒂芬斯 |
因素 | 喬丹劉易斯 |
幻影 | 多夫·穆里克 |
茴香 | 索蓋尤 |
福斯 | 克里斯·豪瑟 |
GNU 吉勒 | 穆蕾 |
GNU Smalltalk | 瓦西里·施奈德曼 |
去 | 喬爾馬丁 |
格羅維 | 喬爾馬丁 |
哈斯克爾 | 喬爾馬丁 |
Haxe(Neko、Python、C++ 和 JS) | 喬爾馬丁 |
海伊 | 喬爾馬丁 |
木衛一 | 多夫·穆里克 |
珍妮特 | 索蓋尤 |
爪哇 | 喬爾馬丁 |
Java Truffle (Truffle/GraalVM) | 馬特·麥吉爾 |
JavaScript(示範) | 喬爾馬丁 |
傑克 | 阿里·穆罕默德·普爾 |
茱莉亞 | 喬爾馬丁 |
科特林 | 哈維爾·費爾南德斯-伊文 |
乳膠3 | 尼古拉斯·布倫格斯 |
即時腳本 | 喬斯·範·巴克爾 |
標識 | 多夫·穆里克 |
盧阿 | 喬爾馬丁 |
GNU 使 | 喬爾馬丁 |
馬爾本身 | 喬爾馬丁 |
MATLAB(GNU Octave 和 MATLAB) | 喬爾馬丁 |
miniMAL(儲存庫、示範) | 喬爾馬丁 |
NASM | 本·達德森 |
尼姆 | 丹尼斯·費爾辛 |
對象帕斯卡 | 喬爾馬丁 |
目標C | 喬爾馬丁 |
奧卡米爾 | 克里斯·豪瑟 |
珀爾 | 喬爾馬丁 |
珀爾6 | 欣里克·奧恩·西於爾松 |
PHP | 喬爾馬丁 |
皮考利普 | 瓦西里·施奈德曼 |
派克 | 多夫·穆里克 |
PL/pgSQL (PostgreSQL) | 喬爾馬丁 |
PL/SQL(Oracle) | 喬爾馬丁 |
後記 | 喬爾馬丁 |
電源外殼 | 喬爾馬丁 |
序言 | 尼古拉斯·布倫格斯 |
純腳本 | 姆塞庫特 |
Python2 | 喬爾馬丁 |
Python3 | 加文·劉易斯 |
RPython | 喬爾馬丁 |
右 | 喬爾馬丁 |
球拍 | 喬爾馬丁 |
雷克斯 | 多夫·穆里克 |
紅寶石 | 喬爾馬丁 |
紅寶石 #2 | 瑞安庫克 |
鏽 | 喬爾馬丁 |
斯卡拉 | 喬爾馬丁 |
方案(R7RS) | 瓦西里·施奈德曼 |
傾斜 | 多夫·穆里克 |
標準機器學習 | 法比安·伯格斯特羅姆 |
雨燕3 | 喬爾馬丁 |
雨燕4 | 陸遙 |
雨燕6 | 奧列格·蒙塔克 |
鉈 | 多夫·穆里克 |
打字稿 | 裙帶菜正宏 |
瓦拉 | 西蒙·泰瑟姆 |
超高畫質描述語言 | 多夫·穆里克 |
Vim腳本 | 多夫·穆里克 |
Visual Basic.NET | 喬爾馬丁 |
Visual Basic 腳本 | 劉百超 |
WebAssembly(wasm) | 喬爾馬丁 |
鷦 | 多夫·穆里克 |
XSLT | 阿里·穆罕默德·普爾 |
約里克 | 多夫·穆里克 |
之字形 | 喬許·托賓 |
Mal 在 2014 年 Clojure West 的閃電演講中首次公開亮相(遺憾的是沒有影片)。請參閱範例/clojurewest2014.mal,以了解會議上的簡報(是的,該簡報是一個 mal 程式)。
在 Midwest.io 2015 上,Joel Martin 就 Mal 做了題為「解鎖成就:更好的語言學習之路」的演講。影片、幻燈片。
最近,Joel 在 LambdaConf 2016 上發表了題為「用 10 個增量步驟創建自己的 Lisp 解釋器」的演講:第 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
第二個 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 模式已使用 cbmbasic 進行了測試(目前需要修補版本來修復線路輸入問題),而 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 的第二個 C 實作需要以下函式庫(lib 和頭包):libedit、libgc、libdl 和 libffi。
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# 實作已在 Linux 上使用 Mono C# 編譯器 (mcs) 和 Mono 運行時(版本 2.10.8.1)進行了測試。建置和運行 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
mal 的 Crystal 實作已使用 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 上進行了測試。雖然有非常基本的讀行編輯( <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
Mal 的 Elixir 實作已使用 Elixir 1.0.5 進行了測試。
cd impls/elixir
mix stepX_YYY
# Or with readline/line editing functionality:
iex -S mix stepX_YYY
mal 的 Elm 實作已使用 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# 實作已在 Linux 上使用 Mono F# 編譯器 (fsharpc) 和 Mono 運行時(版本 3.12.1)進行了測試。 Mono C# 編譯器 (mcs) 也是編譯 readline 依賴項所必需的。建置和運行 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
mal 的 Fantom 實作已使用 Fantom 1.0.70 進行了測試。
cd impls/fantom
make lib/fan/stepX_YYY.pod
STEP=stepX_YYY ./run
mal 的 Fennel 實作已在 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 版本才能編譯。支援四種不同的 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
mal 的 Janet 實作已使用 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
mal 的 Julia 實作需要 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 步中崩潰,顯然是由於硬編碼的限制。
任何從事此工作的人都應該取消註釋步驟文件中的兩行(慢速)調試選項,並導出 DEBUG=1 (以獲得比測試接受的更多輸出)。
mal 的 LiveScript 實作已使用 LiveScript 1.5 進行了測試。
cd impls/livescript
make
node_modules/.bin/lsc stepX_YYY.ls
mal 的 Logo 實作已使用 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 實作已在 Linux 上使用 Free Pascal 編譯器版本 2.6.2 和 2.6.4 進行建置和測試。
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 登入值(使用者名稱/密碼@connect_identifier)是“system/oracle”,但這可以使用 ORACLE_LOGON 環境變數覆蓋。此實作已使用 Oracle Express Edition 11g 第 2 版進行了測試。
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 支持,並已在 Debian GNU/Linux 版本 8.2.1 上進行了測試。
cd impls/prolog
swipl stepX_YYY
PureScript 實作需要 spago 編譯器版本 0.20.2。
cd impls/purs
make
node ./stepX_YYY.js
此實作僅使用了python2的特性,但避免了與python3的不相容。
此實作會檢查樣式和類型(flake8、pylint、mypy)。它報告所有錯誤並附有詳細資訊。它示範了迭代器、裝飾器、函數工具、鏈映射、資料類別、內省、匹配語句、賦值表達式。
您的路徑上必須有 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
mal 的 Racket 實作需要 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
第二個 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 的方案實施已使用 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
mal 的 Vimscript 實作需要 Vim 8.0 才能運作。
cd impls/vimscript
./run_vimscript.sh ./stepX_YYY.vim
mal 的 VB.NET 實作已在 Linux 上使用 Mono VB 編譯器 (vbnc) 和 Mono 運行時(版本 2.10.8.1)進行了測試。建置和運行 VB.NET 實作都需要兩者。
cd impls/vb
make
mono ./stepX_YYY.exe
mal 的 VBScript 實作已在 Windows 10 1909 上進行了測試install.vbs
如果您尚未安裝.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
mal 的 Wren 實作在 Wren 0.2.0 上進行了測試。
cd impls/wren
wren ./stepX_YYY.wren
Mal 的 Yorick 實現在 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 步驟實現,然後一次將一個測試提供給實現,並將輸出/返回值與預期輸出/返回值進行比較。
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
作為 REPL 實現,並使用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"
每個實作目錄都包含一個 Dockerfile,用於建立包含該實作的所有相依性的 docker 映像。此外,頂層 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 公共授權 2.0)獲得許可。有關詳細信息,請參閱 LICENSE.txt。