1. Mal adalah penerjemah Lisp yang terinspirasi Clojure
2. Mal adalah sarana pembelajaran
Setiap implementasi mal dipisahkan menjadi 11 langkah tambahan, mandiri (dan dapat diuji) yang menunjukkan konsep inti Lisp. Langkah terakhir adalah mampu self hosting (menjalankan implementasi mal mal). Lihat panduan proses make-a-lisp.
Langkah-langkah membuat cadel adalah:
Setiap langkah make-a-lisp memiliki diagram arsitektur terkait. Elemen yang baru untuk langkah tersebut disorot dengan warna merah. Berikut adalah arsitektur terakhir setelah langkah A selesai:
Jika Anda tertarik untuk membuat implementasi mal (atau hanya tertarik menggunakan mal untuk sesuatu), Anda dapat bergabung dengan Discord kami. Selain panduan proses make-a-lisp, ada juga FAQ mal/make-a-lisp di mana saya mencoba menjawab beberapa pertanyaan umum.
3. Mal diimplementasikan dalam 88 bahasa (94 implementasi berbeda dan 117 mode runtime)
Bahasa | Pencipta |
---|---|
Ada | Chris Moore |
Ada #2 | Nicolas Boulenguez |
GNU Awk | Mitsuru Kariya |
Pesta 4 | Joel Martin |
DASAR (C64 & QBasic) | Joel Martin |
BBC DASAR V | Ben Haris |
C | Joel Martin |
C#2 | Duncan Watt |
C++ | Stephen Thirlwall |
C# | Joel Martin |
Membuang | Vasilij Schneidermann |
Clojure (Clojure & Skrip Clojure) | Joel Martin |
Skrip Kopi | Joel Martin |
Cadel Umum | Iqbal Ansari |
Kristal | Linda_pp |
D | Dov Murik |
Anak panah | Harry Terkelsen |
Eliksir | Martin Ek |
Elm | Jos van Bakel |
Emacs Cadel | Vasilij Schneidermann |
Erlang | Nathan Fiedler |
ES6 (Skrip ECMA 2015) | Joel Martin |
F# | Peter Stephens |
Faktor | Jordan Lewis |
Fantom | Dov Murik |
Adas | sogaiu |
Keempat | Chris Houser |
Tipuan GNU | Mu Lei |
Obrolan Kecil GNU | Vasilij Schneidermann |
Pergi | Joel Martin |
asyik | Joel Martin |
Haskell | Joel Martin |
Haxe (Neko, Python, C++, & JS) | Joel Martin |
Hai | Joel Martin |
Io | Dov Murik |
Janet | sogaiu |
Jawa | Joel Martin |
Truffle Java (Truffle/GraalVM) | Matt McGill |
JavaScript (Demo) | Joel Martin |
jq | Ali Muhammad Pur |
Julia | Joel Martin |
Kotlin | Javier Fernandez-Ivern |
LaTeX3 | Nicolas Boulenguez |
Skrip Langsung | Jos van Bakel |
logo | Dov Murik |
Lua | Joel Martin |
Pembuatan GNU | Joel Martin |
mal itu sendiri | Joel Martin |
MATLAB (GNU Oktaf & MATLAB) | Joel Martin |
miniMAL (Repo, Demo) | Joel Martin |
NASM | Ben Dudson |
Nim | Dennis Felsing |
Objek Pascal | Joel Martin |
Tujuan C | Joel Martin |
Ocaml | Chris Houser |
Perl | Joel Martin |
Perl 6 | Hinrik Örn Sigurðsson |
PHP | Joel Martin |
picolisp | Vasilij Schneidermann |
Tombak | Dov Murik |
PL/pgSQL (PostgreSQL) | Joel Martin |
PL/SQL (Oracle) | Joel Martin |
Nota bene | Joel Martin |
PowerShell | Joel Martin |
Prolog | Nicolas Boulenguez |
Skrip Murni | Tuansekut |
Python2 | Joel Martin |
Python3 | Gavin Lewis |
RPython | Joel Martin |
R | Joel Martin |
Raket | Joel Martin |
Rexx | Dov Murik |
Rubi | Joel Martin |
rubi #2 | Ryan Masak |
Karat | Joel Martin |
skala | Joel Martin |
Skema (R7RS) | Vasilij Schneidermann |
Condong | Dov Murik |
ML standar | Fabian Bergstrom |
Cepat 3 | Joel Martin |
Cepat 4 | 陆遥 |
Cepat 6 | Oleg Montak |
Tcl | Dov Murik |
Skrip Ketik | Masahiro Wakame |
Vala | Simon Tatham |
VHDL | Dov Murik |
skrip vim | Dov Murik |
Visual Basic.NET | Joel Martin |
Skrip Visual Basic | 刘百超 |
WebAssembly (wasm) | Joel Martin |
gelatik | Dov Murik |
XSLT | Ali Muhammad Pur |
Yorick | Dov Murik |
Zig | Josh Tobin |
Mal pertama kali dihadirkan ke publik dalam Lightning Talk di Clojure West 2014 (sayangnya tidak ada videonya). Lihat contoh/clojurewest2014.mal untuk presentasi yang diberikan pada konferensi (ya, presentasi tersebut adalah program mal).
Pada Midwest.io 2015, Joel Martin memberikan presentasi tentang Mal bertajuk "Achievement Unlocked: A Better Path to Language Learning". Video, Slide.
Baru-baru ini Joel memberikan presentasi tentang "Buat Interpreter Lisp Anda Sendiri dalam 10 Langkah Tambahan" di LambdaConf 2016: Bagian 1, Bagian 2, Bagian 3, Bagian 4, Slide.
Cara paling sederhana untuk menjalankan implementasi apa pun adalah dengan menggunakan buruh pelabuhan. Setiap implementasi memiliki image buruh pelabuhan yang telah dibuat sebelumnya dengan dependensi bahasa yang diinstal. Anda dapat meluncurkan REPL menggunakan target yang sesuai di Makefile tingkat atas (dengan IMPL adalah nama direktori implementasi dan stepX adalah langkah untuk menjalankannya):
make DOCKERIZE=1 "repl^IMPL^stepX"
# OR stepA is the default step:
make DOCKERIZE=1 "repl^IMPL"
Implementasi berikut dipertahankan sebagai proyek terpisah:
Implementasi Ada dikembangkan dengan GNAT 4.9 di debian. Itu juga dikompilasi tidak berubah di windows jika Anda memiliki git, GNAT dan (opsional) versi windows. Tidak ada ketergantungan eksternal (readline tidak diterapkan).
cd impls/ada
make
./stepX_YYY
Implementasi Ada kedua dikembangkan dengan GNAT 8 dan dihubungkan dengan perpustakaan readline GNU.
cd impls/ada
make
./stepX_YYY
Implementasi GNU awk dari mal telah diuji dengan GNU awk 4.1.1.
cd impls/gawk
gawk -O -f stepX_YYY.awk
cd impls/bash
bash stepX_YYY.sh
Implementasi BASIC menggunakan praprosesor yang dapat menghasilkan kode BASIC yang kompatibel dengan C64 BASIC (CBM v2) atau QBasic. Mode C64 telah diuji dengan cbmbasic (versi yang dipatch saat ini diperlukan untuk memperbaiki masalah input saluran) dan mode QBasic telah diuji dengan FreeBASIC.
Hasilkan kode C64 dan jalankan menggunakan cbmbasic:
cd impls/basic
make MODE=cbm stepX_YYY.bas
STEP=stepX_YYY basic_MODE=cbm ./run
Hasilkan kode QBasic, kompilasi menggunakan FreeBASIC, dan jalankan:
cd impls/basic
make MODE=qbasic stepX_YYY.bas
make MODE=qbasic stepX_YYY
./stepX_YYY
Terima kasih kepada Steven Syrek atas inspirasi awal implementasi ini.
Implementasi BBC BASIC V dapat dijalankan di penerjemah Brandy:
cd impls/bbc-basic
brandy -quit stepX_YYY.bbc
Atau di ARM BBC BASIC V di bawah RISC OS 3 atau lebih baru:
*Dir bbc-basic.riscos
*Run setup
*Run stepX_YYY
Implementasi C dari mal memerlukan perpustakaan berikut (paket lib dan header): glib, libffi6, libgc, dan perpustakaan libedit atau GNU readline.
cd impls/c
make
./stepX_YYY
Implementasi C kedua dari mal memerlukan pustaka berikut (paket lib dan header): libedit, libgc, libdl, dan libffi.
cd impls/c.2
make
./stepX_YYY
Implementasi C++ dari mal memerlukan g++-4.9 atau clang++-3.5 dan pustaka yang kompatibel dengan readline untuk dibuat. Lihat cpp/README.md
untuk lebih jelasnya:
cd impls/cpp
make
# OR
make CXX=clang++-3.5
./stepX_YYY
Implementasi C# dari mal telah diuji di Linux menggunakan kompiler Mono C# (mcs) dan runtime Mono (versi 2.10.8.1). Keduanya diperlukan untuk membangun dan menjalankan implementasi C#.
cd impls/cs
make
mono ./stepX_YYY.exe
Implementasi Chuck telah diuji dengan Chuck 1.3.5.2.
cd impls/chuck
./run
Sebagian besar implementasi Clojure memerlukan Clojure 1.5, namun untuk lulus semua tes, diperlukan 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
Implementasinya telah diuji dengan SBCL, CCL, CMUCL, GNU CLISP, ECL dan Allegro CL di Ubuntu 16.04 dan Ubuntu 12.04, lihat README untuk lebih jelasnya. Asalkan Anda telah menginstal dependensi yang disebutkan, lakukan hal berikut untuk menjalankan implementasi
cd impls/common-lisp
make
./run
Implementasi Crystal dari mal telah diuji dengan Crystal 0.26.1.
cd impls/crystal
crystal run ./stepX_YYY.cr
# OR
make # needed to run tests
./stepX_YYY
Implementasi D dari mal diuji dengan GDC 4.8. Ini membutuhkan perpustakaan readline GNU.
cd impls/d
make
./stepX_YYY
Implementasi Dart telah diuji dengan Dart 1.20.
cd impls/dart
dart ./stepX_YYY
Implementasi mal Emacs Lisp telah diuji dengan Emacs 24.3 dan 24.5. Meskipun ada pengeditan readline yang sangat mendasar ( <backspace>
dan Cd
berfungsi, Cc
membatalkan prosesnya), disarankan untuk menggunakan rlwrap
.
cd impls/elisp
emacs -Q --batch --load stepX_YYY.el
# with full readline support
rlwrap emacs -Q --batch --load stepX_YYY.el
Implementasi Elixir dari mal telah diuji dengan Elixir 1.0.5.
cd impls/elixir
mix stepX_YYY
# Or with readline/line editing functionality:
iex -S mix stepX_YYY
Implementasi mal Elm telah diuji dengan Elm 0.18.0
cd impls/elm
make stepX_YYY.js
STEP=stepX_YYY ./run
Implementasi Erlang dari mal membutuhkan Erlang/OTP R17 dan rebar untuk dibangun.
cd impls/erlang
make
# OR
MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
./stepX_YYY
Implementasi ES6/ECMAScript 2015 menggunakan kompiler babel untuk menghasilkan JavaScript yang kompatibel dengan ES5. Kode yang dihasilkan telah diuji dengan Node 0.12.4.
cd impls/es6
make
node build/stepX_YYY.js
Implementasi F# dari mal telah diuji di Linux menggunakan kompiler Mono F# (fsharpc) dan runtime Mono (versi 3.12.1). Kompiler mono C# (mcs) juga diperlukan untuk mengkompilasi ketergantungan readline. Semua diperlukan untuk membangun dan menjalankan implementasi F#.
cd impls/fsharp
make
mono ./stepX_YYY.exe
Implementasi Faktor mal telah diuji dengan Faktor 0.97 (factorcode.org).
cd impls/factor
FACTOR_ROOTS=. factor -run=stepX_YYY
Implementasi Fantom dari mal telah diuji dengan Fantom 1.0.70.
cd impls/fantom
make lib/fan/stepX_YYY.pod
STEP=stepX_YYY ./run
Implementasi mal Adas telah diuji dengan Adas versi 0.9.1 pada Lua 5.4.
cd impls/fennel
fennel ./stepX_YYY.fnl
cd impls/forth
gforth stepX_YYY.fs
cd impls/guile
guile -L ./ stepX_YYY.scm
Implementasi Smalltalk dari mal telah diuji dengan GNU Smalltalk 3.2.91.
cd impls/gnu-smalltalk
./run
Implementasi Go dari mal mengharuskan go diinstal pada jalurnya. Implementasinya telah diuji dengan Go 1.3.1.
cd impls/go
make
./stepX_YYY
Implementasi mal Groovy memerlukan Groovy untuk dijalankan dan telah diuji dengan Groovy 1.8.6.
cd impls/groovy
make
groovy ./stepX_YYY.groovy
Implementasi Haskell memerlukan kompiler ghc versi 7.10.1 atau lebih baru dan juga paket parsec dan readline (atau editline) Haskell.
cd impls/haskell
make
./stepX_YYY
Implementasi Haxe dari mal memerlukan Haxe versi 3.2 untuk dikompilasi. Empat target Haxe berbeda yang didukung: Neko, Python, C++, dan 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
Implementasi Hy dari mal telah diuji dengan Hy 0.13.0.
cd impls/hy
./stepX_YYY.hy
Implementasi Io dari mal telah diuji dengan Io versi 20110905.
cd impls/io
io ./stepX_YYY.io
Implementasi mal Janet telah diuji dengan Janet versi 1.12.2.
cd impls/janet
janet ./stepX_YYY.janet
Implementasi mal di Java memerlukan maven2 untuk membangunnya.
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"
Implementasi Java ini akan berjalan di OpenJDK, tetapi dapat berjalan 30x lebih cepat di GraalVM berkat kerangka Truffle. Ini telah diuji dengan OpenJDK 11, GraalVM CE 20.1.0, dan GraalVM CE 21.1.0.
cd impls/java-truffle
./gradlew build
STEP=stepX_YYY ./run
cd impls/js
npm install
node stepX_YYY.js
Implementasi mal Julia membutuhkan Julia 0.4.
cd impls/julia
julia stepX_YYY.jl
Diuji terhadap versi 1.6, dengan banyak kecurangan di departemen IO
cd impls/jq
STEP=stepA_YYY ./run
# with Debug
DEBUG=true STEP=stepA_YYY ./run
Implementasi mal Kotlin telah diuji dengan Kotlin 1.0.
cd impls/kotlin
make
java -jar stepX_YYY.jar
Implementasi mal LaTeX3 telah diuji dengan pdfTeX 3.141592653-2.6-1.40.24.
Hosting mandiri terlalu lambat untuk batas waktu yang masuk akal, dan mogok di langkah 4, tampaknya karena keterbatasan kode keras.
Siapa pun yang mengerjakan ini harus menghapus komentar pada dua baris opsi debugging (lambat) di file langkah, dan mengekspor DEBUG=1 (untuk keluaran lebih banyak daripada yang diterima pengujian).
Implementasi LiveScript dari mal telah diuji dengan LiveScript 1.5.
cd impls/livescript
make
node_modules/.bin/lsc stepX_YYY.ls
Implementasi Logo mal telah diuji dengan UCBLogo 6.0.
cd impls/logo
logo stepX_YYY.lg
Implementasi Lua dari mal telah diuji dengan Lua 5.3.5 Implementasinya memerlukan instalasi luarocks.
cd impls/lua
make # to build and link linenoise.so and rex_pcre.so
./stepX_YYY.lua
Menjalankan implementasi mal dari mal melibatkan menjalankan langkah A dari salah satu implementasi lainnya dan meneruskan langkah mal untuk dijalankan sebagai argumen baris perintah.
cd impls/IMPL
IMPL_STEPA_CMD ../mal/stepX_YYY.mal
cd impls/make
make -f stepX_YYY.mk
Implementasi mal NASM ditulis untuk Linux x86-64, dan telah diuji dengan Linux 3.16.0-4-amd64 dan NASM versi 2.11.05.
cd impls/nasm
make
./stepX_YYY
Implementasi Nim dari mal telah diuji dengan Nim 1.0.4.
cd impls/nim
make
# OR
nimble build
./stepX_YYY
Implementasi mal Object Pascal telah dibangun dan diuji di Linux menggunakan compiler Free Pascal versi 2.6.2 dan 2.6.4.
cd impls/objpascal
make
./stepX_YYY
Implementasi mal Objective C telah dibangun dan diuji di Linux menggunakan clang/LLVM 3.6. Itu juga telah dibangun dan diuji pada OS X menggunakan Xcode 7.
cd impls/objc
make
./stepX_YYY
cd impls/ocaml
make
./stepX_YYY
Implementasi MatLab telah diuji dengan GNU Octave 4.2.1. Ini juga telah diuji dengan MATLAB versi R2014a di Linux. Perhatikan bahwa MATLAB adalah produk komersial.
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 adalah penerjemah Lisp kecil yang diimplementasikan dalam JavaScript kurang dari 1024 byte. Untuk menjalankan implementasi miniMAL mal Anda perlu mengunduh/menginstal penerjemah miniMAL (yang memerlukan 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
Implementasi Perl 5 harus bekerja dengan Perl 5.19.3 dan yang lebih baru.
Untuk dukungan pengeditan baris readline, instal Term::ReadLine::Perl atau Term::ReadLine::Gnu dari CPAN.
cd impls/perl
perl stepX_YYY.pl
Implementasi Perl 6 diuji pada Rakudo Perl 6 2016.04.
cd impls/perl6
perl6 stepX_YYY.pl
Implementasi PHP dari mal memerlukan antarmuka baris perintah php untuk dijalankan.
cd impls/php
php stepX_YYY.php
Implementasi Picolisp memerlukan libreadline dan Picolisp 3.1.11 atau lebih baru.
cd impls/picolisp
./run
Implementasi Pike diuji pada Pike 8.0.
cd impls/pike
pike stepX_YYY.pike
Implementasi mal PL/pgSQL memerlukan server PostgreSQL yang berjalan (gambar buruh pelabuhan "kanaka/mal-test-plpgsql" secara otomatis memulai server PostgreSQL). Implementasinya terhubung ke server PostgreSQL dan membuat database bernama "mal" untuk menyimpan tabel dan prosedur tersimpan. Skrip pembungkus menggunakan perintah psql untuk terhubung ke server dan defaultnya adalah pengguna "postgres" tetapi ini dapat diganti dengan variabel lingkungan PSQL_USER. Kata sandi dapat ditentukan menggunakan variabel lingkungan PPGASSWORD. Implementasinya telah diuji dengan PostgreSQL 9.4.
cd impls/plpgsql
./wrap.sh stepX_YYY.sql
# OR
PSQL_USER=myuser PGPASSWORD=mypass ./wrap.sh stepX_YYY.sql
Implementasi mal PL/SQL memerlukan server Oracle DB yang berjalan (gambar buruh pelabuhan "kanaka/mal-test-plsql" secara otomatis memulai server Oracle Express). Implementasinya terhubung ke server Oracle untuk membuat tipe, tabel, dan prosedur tersimpan. Nilai logon SQL*Plus default (nama pengguna/kata sandi@connect_identifier) adalah "system/Oracle" tetapi ini dapat diganti dengan variabel lingkungan ORACLE_LOGON. Implementasinya telah diuji dengan Oracle Express Edition 11g Rilis 2. Perhatikan bahwa setiap peringatan koneksi SQL*Plus (kedaluwarsa kata sandi pengguna, dll) akan mengganggu kemampuan skrip wrapper untuk berkomunikasi dengan DB.
cd impls/plsql
./wrap.sh stepX_YYY.sql
# OR
ORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql
Implementasi mal PostScript memerlukan Ghostscript untuk dijalankan. Ini telah diuji dengan Ghostscript 9.10.
cd impls/ps
gs -q -dNODISPLAY -I./ stepX_YYY.ps
Implementasi mal PowerShell memerlukan bahasa skrip PowerShell. Ini telah diuji dengan PowerShell 6.0.0 Alpha 9 di Linux.
cd impls/powershell
powershell ./stepX_YYY.ps1
Implementasi Prolog menggunakan beberapa konstruksi khusus untuk SWI-Prolog, termasuk dukungan readline dan telah diuji pada Debian GNU/Linux dengan versi 8.2.1.
cd impls/prolog
swipl stepX_YYY
Implementasi PureScript memerlukan kompiler spago versi 0.20.2.
cd impls/purs
make
node ./stepX_YYY.js
Implementasi ini hanya menggunakan fitur python2, tetapi menghindari ketidaksesuaian dengan python3.
Implementasi ini diperiksa gaya dan tipenya (flake8, pylint, mypy). Ini melaporkan semua kesalahan dengan detail. Ini menunjukkan iterator, dekorator, alat fungsional, peta rantai, kelas data, introspeksi, pernyataan kecocokan, ekspresi penugasan.
Anda harus memiliki rpython di jalur Anda (disertakan dengan pypy).
cd impls/rpython
make # this takes a very long time
./stepX_YYY
Implementasi R dari mal membutuhkan R (r-base-core) untuk dijalankan.
cd impls/r
make libs # to download and build rdyncall
Rscript stepX_YYY.r
Implementasi Racket dari mal memerlukan compiler/interpreter Racket untuk dijalankan.
cd impls/racket
./stepX_YYY.rkt
Implementasi mal Rexx telah diuji dengan Regina Rexx 3.6.
cd impls/rexx
make
rexx -a ./stepX_YYY.rexxpp
cd impls/ruby
ruby stepX_YYY.rb
Implementasi Ruby kedua dengan tujuan berikut:
Mal
cd impls/ruby.2
ruby stepX_YYY.rb
Implementasi karat dari mal memerlukan penyusun karat dan alat pembuat (muatan) untuk membangun.
cd impls/rust
cargo run --release --bin stepX_YYY
Instal scala dan 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
Implementasi Skema MAL telah diuji dengan Chibi-Scheme 0.10, Kawa 3.1.1, Gauche 0.9.6, CHICKEN 5.1.0, Sagittarius 0.9.7, Cyclone 0.32.0 (versi Git) dan Foment 0.4 (versi Git). Anda harus bisa menjalankannya pada implementasi R7RS lain yang sesuai setelah mengetahui bagaimana perpustakaan dimuat dan menyesuaikan Makefile
dan run
skrip yang sesuai.
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
Implementasi Skew dari mal telah diuji dengan Skew 0.7.42.
cd impls/skew
make
node stepX_YYY.js
Implementasi ML Standar dari mal memerlukan implementasi SML97. Makefile mendukung Poly/ML, MLton, Moscow ML, dan telah diuji dengan Poly/ML 5.8.1, MLton 20210117, dan Moscow ML versi 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
Implementasi mal Swift 3 memerlukan kompiler Swift 3.0. Ini telah diuji dengan Swift 3 Pratinjau 3.
cd impls/swift3
make
./stepX_YYY
Implementasi mal Swift 4 memerlukan kompiler Swift 4.0. Ini telah diuji dengan rilis Swift 4.2.3.
cd impls/swift4
make
./stepX_YYY
Implementasi mal Swift 5 memerlukan kompiler Swift 5.0. Ini telah diuji dengan rilis Swift 5.1.1.
cd impls/swift6
swift run stepX_YYY
Implementasi Tcl dari mal memerlukan Tcl 8.6 untuk dijalankan. Untuk dukungan pengeditan baris readline, instal tclreadline.
cd impls/tcl
tclsh ./stepX_YYY.tcl
Implementasi mal TypeScript memerlukan kompiler TypeScript 2.2. Telah diuji dengan Node.js v6.
cd impls/ts
make
node ./stepX_YYY.js
Implementasi mal Vala telah diuji dengan kompiler Vala 0.40.8. Anda perlu menginstal valac
dan libreadline-dev
atau yang setara.
cd impls/vala
make
./stepX_YYY
Implementasi VHDL mal telah diuji dengan GHDL 0.29.
cd impls/vhdl
make
./run_vhdl.sh ./stepX_YYY
Implementasi Vimscript dari mal memerlukan Vim 8.0 untuk dijalankan.
cd impls/vimscript
./run_vimscript.sh ./stepX_YYY.vim
Implementasi mal VB.NET telah diuji di Linux menggunakan kompiler Mono VB (vbnc) dan runtime Mono (versi 2.10.8.1). Keduanya diperlukan untuk membangun dan menjalankan implementasi VB.NET.
cd impls/vb
make
mono ./stepX_YYY.exe
Implementasi VBScript mal telah diuji pada Windows 10 1909. install.vbs
dapat membantu Anda menginstal persyaratan (.NET 2.0 3.0 3.5). Jika Anda belum menginstal .NET 2.0 3.0 3.5
, maka akan muncul jendela untuk instalasi. Jika Anda sudah menginstalnya, itu tidak akan melakukan apa pun.
cd implsvbs
install.vbs
cscript -nologo stepX_YYY.vbs
Implementasi WebAssembly ditulis dalam Wam (bahasa Makro WebAssembly) dan berjalan di bawah beberapa embeddings non-web (runtime) yang berbeda: 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
Implementasi XSLT dari mal ditulis dengan XSLT 3 dan diuji pada Saxon 9.9.1.6 Home Edition.
cd impls/xslt
STEP=stepX_YY ./run
Implementasi Wren dari mal diuji pada Wren 0.2.0.
cd impls/wren
wren ./stepX_YYY.wren
Implementasi mal Yorick diuji pada Yorick 2.2.04.
cd impls/yorick
yorick -batch ./stepX_YYY.i
Implementasi Zig dari mal diuji pada Zig 0.5.
cd impls/zig
zig build stepX_YYY
Makefile tingkat atas memiliki sejumlah target yang berguna untuk membantu pengembangan dan pengujian implementasi. Target help
menyediakan daftar target dan opsi:
make help
Ada hampir 800 tes fungsional umum (untuk semua implementasi) di direktori tests/
. Setiap langkah memiliki file pengujian terkait yang berisi pengujian khusus untuk langkah tersebut. Harness pengujian runtest.py
meluncurkan implementasi langkah Mal dan kemudian memasukkan pengujian satu per satu ke implementasi dan membandingkan nilai keluaran/pengembalian dengan nilai keluaran/pengembalian yang diharapkan.
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
sebagai implementasi pengujian dan gunakan variabel make MAL_IMPL
untuk mengubah bahasa host yang mendasarinya (standarnya adalah 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
digunakan: make "repl^IMPL"
# e.g
make "repl^ruby"
make "repl^ps"
mal
sebagai implementasi REPL dan gunakan variabel make MAL_IMPL
untuk mengubah bahasa host yang mendasarinya (defaultnya adalah 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"
Peringatan: Uji kinerja ini tidak valid secara statistik dan tidak komprehensif; kinerja runtime bukanlah tujuan utama mal. Jika Anda menarik kesimpulan serius dari tes kinerja ini, silakan hubungi saya tentang beberapa properti tepi laut yang menakjubkan di Kansas yang ingin saya jual dengan harga murah.
make "perf^IMPL"
# e.g.
make "perf^js"
make "perf"
make "stats^IMPL"
# e.g.
make "stats^js"
Setiap direktori implementasi berisi Dockerfile untuk membuat image buruh pelabuhan yang berisi semua dependensi untuk implementasi tersebut. Selain itu, Makefile tingkat atas berisi dukungan untuk menjalankan target pengujian (dan kinerja, statistik, repl, dll) dalam wadah buruh pelabuhan untuk implementasi tersebut dengan meneruskan "DOCKERIZE=1" pada baris perintah make. Misalnya:
make DOCKERIZE=1 "test^js^step3"
Implementasi yang ada sudah memiliki image buruh pelabuhan yang dibuat dan dimasukkan ke registri buruh pelabuhan. Namun, jika Anda ingin membuat atau membangun kembali image buruh pelabuhan secara lokal, Makefile tingkat atas menyediakan aturan untuk membuat image buruh pelabuhan:
make "docker-build^IMPL"
Catatan :
make DOCKERIZE=1 "repl^IMPL"
sebelum Anda dapat menjalankan pengujian karena dependensi runtime perlu diunduh untuk menghindari waktu tes habis. Dependensi ini diunduh ke file dot di direktori /mal sehingga akan tetap ada di antara proses yang dijalankan. Mal (make-a-lisp) dilisensikan di bawah MPL 2.0 (Mozilla Public License 2.0). Lihat LICENSE.txt untuk detail lebih lanjut.