1. Mal เป็นล่าม Lisp ที่ได้รับแรงบันดาลใจจาก Clojure
2. Mal เป็นเครื่องมือการเรียนรู้
การใช้งาน mal แต่ละครั้งจะแบ่งออกเป็น 11 ขั้นตอนที่เพิ่มขึ้นในตัวเอง (และทดสอบได้) ซึ่งแสดงให้เห็นถึงแนวคิดหลักของ Lisp ขั้นตอนสุดท้ายคือความสามารถในการโฮสต์ด้วยตนเอง (เรียกใช้การใช้งาน mal ของ mal) ดูคู่มือกระบวนการ make-a-lisp
ขั้นตอนการทำเมคอัพคือ:
ขั้นตอนการทำเสียงกระเพื่อมแต่ละขั้นตอนมีแผนภาพทางสถาปัตยกรรมที่เกี่ยวข้องกัน องค์ประกอบที่เป็นใหม่สำหรับขั้นตอนนั้นจะถูกเน้นด้วยสีแดง นี่คือสถาปัตยกรรมขั้นสุดท้ายเมื่อขั้นตอน A เสร็จสมบูรณ์:
หากคุณสนใจที่จะสร้างการใช้งาน mal (หรือเพียงสนใจที่จะใช้ mal เพื่อบางสิ่งบางอย่าง) คุณสามารถเข้าร่วม Discord ของเราได้ นอกจากคู่มือกระบวนการ make-a-lisp แล้ว ยังมีคำถามที่พบบ่อยเกี่ยวกับ mal/make-a-lisp ซึ่งฉันพยายามตอบคำถามทั่วไปบางข้อ
3. Mal ถูกนำไปใช้ใน 88 ภาษา (การใช้งานที่แตกต่างกัน 94 แบบและโหมดรันไทม์ 117 โหมด)
ภาษา | ผู้สร้าง |
---|---|
เอด้า | คริส มัวร์ |
เอด้า #2 | นิโคลัส บูลองเกซ |
GNU อัค | มิตสึรุ คาริยะ |
ทุบตี 4 | โจเอล มาร์ติน |
พื้นฐาน (C64 และ QBasic) | โจเอล มาร์ติน |
บีบีซี เบสิก วี | เบน แฮร์ริส |
ค | โจเอล มาร์ติน |
ค #2 | ดันแคน วัตต์ |
ซี++ | สตีเฟน เธิร์ลวอลล์ |
ค# | โจเอล มาร์ติน |
ชัคเค | วาซิลิจ ชไนเดอร์มันน์ |
โคลจูร์ (Clojure & ClojureScript) | โจเอล มาร์ติน |
คอฟฟี่สคริปต์ | โจเอล มาร์ติน |
เสียงกระเพื่อมทั่วไป | อิกบัล อันซารี |
คริสตัล | ลินดา_pp |
ดี | โดฟ มูริค |
โผ | แฮร์รี เทอร์เคลเซ่น |
น้ำอมฤต | มาร์ติน เอก |
เอล์ม | จอส ฟาน เบเคิล |
อีแมคส์ ลิสป์ | วาซิลิจ ชไนเดอร์มันน์ |
เออร์หลาง | นาธาน ฟิดเลอร์ |
ES6 (ECMAScript 2015) | โจเอล มาร์ติน |
ฉ# | ปีเตอร์ สตีเฟนส์ |
ปัจจัย | จอร์แดน ลูอิส |
แฟนทอม | โดฟ มูริค |
ยี่หร่า | โซไกอุ |
ออกมา | คริส เฮาส์เซอร์ |
กนู กิล | มู่เล่ย |
GNU สมอลทอล์ค | วาซิลิจ ชไนเดอร์มันน์ |
ไป | โจเอล มาร์ติน |
เก๋ | โจเอล มาร์ติน |
ฮาสเคล | โจเอล มาร์ติน |
Haxe (เนโกะ, ไพธอน, C++ และ JS) | โจเอล มาร์ติน |
ฮ | โจเอล มาร์ติน |
ไอโอ | โดฟ มูริค |
เจเน็ต | โซไกอุ |
ชวา | โจเอล มาร์ติน |
จาวา ทรัฟเฟิล (Truffle/GraalVM) | แมตต์ แมคกิล |
จาวาสคริปต์ (สาธิต) | โจเอล มาร์ติน |
เจคิว | อาลี โมฮัมหมัด |
จูเลีย | โจเอล มาร์ติน |
คอตลิน | ฮาเวียร์ เฟร์นานเดซ-อิเวิร์น |
ลาเท็กซ์3 | นิโคลัส บูลองเกซ |
ไลฟ์สคริปต์ | จอส ฟาน เบเคิล |
โลโก้ | โดฟ มูริค |
ลัวะ | โจเอล มาร์ติน |
GNU ทำ | โจเอล มาร์ติน |
มาลเอง | โจเอล มาร์ติน |
MATLAB (GNU อ็อกเทฟและ MATLAB) | โจเอล มาร์ติน |
miniMAL (Repo, สาธิต) | โจเอล มาร์ติน |
นาสเอ็ม | เบน ดัดสัน |
นิม | เดนนิส เฟลซิง |
วัตถุปาสคาล | โจเอล มาร์ติน |
วัตถุประสงค์ ค | โจเอล มาร์ติน |
โอแคมล์ | คริส เฮาส์เซอร์ |
ภาษาเพิร์ล | โจเอล มาร์ติน |
เพิร์ล 6 | ฮินริก เอิร์น ซิกูร์ดส์สัน |
PHP | โจเอล มาร์ติน |
พิโคสป | วาซิลิจ ชไนเดอร์มันน์ |
หอก | โดฟ มูริค |
PL/pgSQL (PostgreSQL) | โจเอล มาร์ติน |
PL/SQL (ออราเคิล) | โจเอล มาร์ติน |
โพสต์สคริปต์ | โจเอล มาร์ติน |
พาวเวอร์เชลล์ | โจเอล มาร์ติน |
อารัมภบท | นิโคลัส บูลองเกซ |
เพียวสคริปต์ | คุณนายคุต |
หลาม2 | โจเอล มาร์ติน |
หลาม3 | กาวิน ลูอิส |
RPython | โจเอล มาร์ติน |
ร | โจเอล มาร์ติน |
แร็กเกต | โจเอล มาร์ติน |
เร็กซ์ | โดฟ มูริค |
ทับทิม | โจเอล มาร์ติน |
รูบี้ #2 | ไรอัน คุก |
สนิม | โจเอล มาร์ติน |
สกาล่า | โจเอล มาร์ติน |
โครงการ (R7RS) | วาซิลิจ ชไนเดอร์มันน์ |
ลาด | โดฟ มูริค |
มล.มาตรฐาน | ฟาเบียน เบิร์กสตรอม |
สวิฟท์ 3 | โจเอล มาร์ติน |
สวิฟท์ 4 | 陆遥 |
สวิฟท์ 6 | โอเล็ก มอนตัก |
ทีซีแอล | โดฟ มูริค |
TypeScript | มาซาฮิโระ วากาเมะ |
วาลา | ไซมอน เทแธม |
วีเอชดีแอล | โดฟ มูริค |
วิมสคริปต์ | โดฟ มูริค |
วิชวลเบสิก.NET | โจเอล มาร์ติน |
สคริปต์ Visual Basic | 刘百超 |
WebAssembly (wasm) | โจเอล มาร์ติน |
นกกระจิบ | โดฟ มูริค |
XSLT | อาลี โมฮัมหมัด |
ยอริค | โดฟ มูริค |
ซิก | จอช โทบิน |
Mal ถูกนำเสนอต่อสาธารณะเป็นครั้งแรกในการพูดคุยแบบสายฟ้าแลบที่ Clojure West 2014 (น่าเสียดายที่ไม่มีวิดีโอ) ดูตัวอย่าง/clojurewest2014.mal สำหรับการนำเสนอที่ได้รับในการประชุม (ใช่ การนำเสนอเป็นโปรแกรม mal)
ที่ Midwest.io 2015 Joel Martin ได้นำเสนอเกี่ยวกับ Mal ในหัวข้อ "Achievement Unlocked: A Better Path to Language Learning" วิดีโอสไลด์
เมื่อเร็วๆ นี้ Joel ได้นำเสนอเรื่อง "สร้างล่ามเสียงกระเพื่อมของคุณเองใน 10 ขั้นตอนที่เพิ่มขึ้น" ที่ LambdaConf 2016: ตอนที่ 1, ส่วนที่ 2, ส่วนที่ 3, ส่วนที่ 4, สไลด์
วิธีที่ง่ายที่สุดในการรันการใช้งานที่กำหนดคือการใช้นักเทียบท่า การใช้งานทุกครั้งมีอิมเมจนักเทียบท่าที่สร้างไว้ล่วงหน้าพร้อมการติดตั้งการพึ่งพาภาษา คุณสามารถเรียกทำงาน REPL โดยใช้เป้าหมายที่สะดวกใน Makefile ระดับบนสุด (โดยที่ IMPL คือชื่อไดเร็กทอรีการใช้งานและ stepX เป็นขั้นตอนในการรัน):
make DOCKERIZE=1 "repl^IMPL^stepX"
# OR stepA is the default step:
make DOCKERIZE=1 "repl^IMPL"
การใช้งานต่อไปนี้ได้รับการดูแลเป็นโปรเจ็กต์ที่แยกจากกัน:
การใช้งาน Ada ได้รับการพัฒนาด้วย GNAT 4.9 บนเดเบียน นอกจากนี้ยังคอมไพล์ไม่เปลี่ยนแปลงบน windows หากคุณมี git, GNAT และ (เป็นทางเลือก) เวอร์ชัน windows ไม่มีการพึ่งพาภายนอก (ไม่ได้ใช้งาน Readline)
cd impls/ada
make
./stepX_YYY
การใช้งาน Ada ครั้งที่สองได้รับการพัฒนาด้วย GNAT 8 และเชื่อมโยงกับไลบรารี Readline ของ GNU
cd impls/ada
make
./stepX_YYY
การใช้งาน GNU awk ของ mal ได้รับการทดสอบด้วย GNU awk 4.1.1
cd impls/gawk
gawk -O -f stepX_YYY.awk
cd impls/bash
bash stepX_YYY.sh
การใช้งาน BASIC ใช้ตัวประมวลผลล่วงหน้าที่สามารถสร้างโค้ด BASIC ที่เข้ากันได้กับทั้ง C64 BASIC (CBM v2) หรือ QBasic โหมด 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 สามารถทำงานในล่ามบรั่นดี:
cd impls/bbc-basic
brandy -quit stepX_YYY.bbc
หรือใน ARM BBC BASIC V ภายใต้ RISC OS 3 หรือใหม่กว่า:
*Dir bbc-basic.riscos
*Run setup
*Run stepX_YYY
การใช้งาน C ของ mal ต้องการไลบรารีต่อไปนี้ (แพ็คเกจ lib และส่วนหัว): glib, libffi6, libgc และไลบรารี libedit หรือ GNU readline
cd impls/c
make
./stepX_YYY
การใช้งาน C ครั้งที่สองของ mal ต้องการไลบรารีต่อไปนี้ (lib และแพ็คเกจส่วนหัว): libedit, libgc, libdl และ libffi
cd impls/c.2
make
./stepX_YYY
การใช้งาน C++ ของ mal ต้องใช้ g++-4.9 หรือ clang++-3.5 และไลบรารี่ที่เข้ากันได้กับ readline ในการสร้าง ดู cpp/README.md
สำหรับรายละเอียดเพิ่มเติม:
cd impls/cpp
make
# OR
make CXX=clang++-3.5
./stepX_YYY
การใช้งาน C# ของ mal ได้รับการทดสอบบน Linux โดยใช้คอมไพเลอร์ Mono C# (mcs) และรันไทม์ Mono (เวอร์ชัน 2.10.8.1) ทั้งสองจำเป็นต้องสร้างและรันการใช้งาน C#
cd impls/cs
make
mono ./stepX_YYY.exe
การใช้งาน ChuckK ได้รับการทดสอบกับ 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
การใช้งานได้รับการทดสอบกับ SBCL, CCL, CMUCL, GNU CLISP, ECL และ Allegro CL บน Ubuntu 16.04 และ Ubuntu 12.04 โปรดดู 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
การใช้งาน D ของ mal ได้รับการทดสอบด้วย GDC 4.8 ต้องใช้ไลบรารี readline ของ GNU
cd impls/d
make
./stepX_YYY
การใช้งาน Dart ได้รับการทดสอบกับ Dart 1.20
cd impls/dart
dart ./stepX_YYY
การใช้งาน Emacs Lisp ของ mal ได้รับการทดสอบกับ 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
การใช้ Erlang ของ mal ต้องใช้ Erlang/OTP R17 และเหล็กเส้นในการสร้าง
cd impls/erlang
make
# OR
MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
./stepX_YYY
การใช้งาน ES6 / ECMAScript 2015 ใช้คอมไพเลอร์ babel เพื่อสร้าง JavaScript ที่เข้ากันได้กับ ES5 รหัสที่สร้างขึ้นได้รับการทดสอบกับ Node 0.12.4
cd impls/es6
make
node build/stepX_YYY.js
การใช้งาน F# ของ mal ได้รับการทดสอบบน Linux โดยใช้คอมไพเลอร์ Mono F# (fsharpc) และรันไทม์ Mono (เวอร์ชัน 3.12.1) คอมไพเลอร์ mono C# (mcs) ก็จำเป็นเช่นกันในการรวบรวมการขึ้นต่อกันของ readline ทั้งหมดจำเป็นต้องสร้างและรันการใช้งาน F#
cd impls/fsharp
make
mono ./stepX_YYY.exe
การใช้ปัจจัยของ mal ได้รับการทดสอบด้วยปัจจัย 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 ได้รับการทดสอบกับ Fennel เวอร์ชัน 0.9.1 บน 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
การใช้งาน Smalltalk ของ mal ได้รับการทดสอบด้วย GNU Smalltalk 3.2.91
cd impls/gnu-smalltalk
./run
การใช้งาน Go ของ mal จำเป็นต้องติดตั้ง go บนเส้นทาง การใช้งานได้รับการทดสอบด้วย Go 1.3.1
cd impls/go
make
./stepX_YYY
การใช้งาน Groovy ของ mal ต้องการให้ 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
การใช้งาน Haxe ของ mal ต้องใช้ 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
การใช้งาน Hy ของ mal ได้รับการทดสอบด้วย Hy 0.13.0
cd impls/hy
./stepX_YYY.hy
การใช้งาน Io ของ mal ได้รับการทดสอบกับ Io เวอร์ชัน 20110905
cd impls/io
io ./stepX_YYY.io
การใช้ mal ของ Janet ได้รับการทดสอบกับ Janet เวอร์ชัน 1.12.2
cd impls/janet
janet ./stepX_YYY.janet
การใช้งาน Java ของ mal ต้องใช้ 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 แต่สามารถทำงานได้เร็วขึ้นถึง 30 เท่าบน GraalVM ต้องขอบคุณเฟรมเวิร์ก Truffle ได้รับการทดสอบกับ 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
การใช้งาน Kotlin ของ mal ได้รับการทดสอบด้วย Kotlin 1.0
cd impls/kotlin
make
java -jar stepX_YYY.jar
การใช้งาน LaTeX3 ของ mal ได้รับการทดสอบด้วย pdfTeX 3.141592653-2.6-1.40.24
การโฮสต์ด้วยตนเองช้าเกินไปสำหรับการหมดเวลาที่เหมาะสม และล้มเหลวในขั้นตอนที่ 4 เห็นได้ชัดว่าเป็นเพราะข้อจำกัดด้านฮาร์ดโค้ด
ใครก็ตามที่ทำงานเกี่ยวกับเรื่องนี้ควรยกเลิกหมายเหตุตัวเลือกการดีบัก (ช้า) สองบรรทัดในไฟล์ขั้นตอน และส่งออก DEBUG=1 (สำหรับเอาต์พุตมากกว่าที่การทดสอบจะยอมรับ)
การใช้งาน LiveScript ของ mal ได้รับการทดสอบด้วย 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
การใช้งาน Lua ของ mal ได้รับการทดสอบด้วย 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
การใช้งาน NASM ของ mal เขียนขึ้นสำหรับ x86-64 Linux และได้รับการทดสอบกับ Linux 3.16.0-4-amd64 และ NASM เวอร์ชัน 2.11.05
cd impls/nasm
make
./stepX_YYY
การใช้งาน Nim ของ mal ได้รับการทดสอบกับ Nim 1.0.4
cd impls/nim
make
# OR
nimble build
./stepX_YYY
การใช้งาน Object Pascal ของ mal ได้รับการสร้างและทดสอบบน Linux โดยใช้คอมไพเลอร์ Free Pascal เวอร์ชัน 2.6.2 และ 2.6.4
cd impls/objpascal
make
./stepX_YYY
การใช้งาน Objective C ของ mal ได้รับการสร้างและทดสอบบน Linux โดยใช้ clang/LLVM 3.6 นอกจากนี้ยังได้รับการสร้างและทดสอบบน OS X โดยใช้ Xcode 7
cd impls/objc
make
./stepX_YYY
cd impls/ocaml
make
./stepX_YYY
การใช้งาน MatLab ได้รับการทดสอบด้วย GNU Octave 4.2.1 นอกจากนี้ยังได้รับการทดสอบกับ MATLAB เวอร์ชัน R2014a บน Linux ด้วย โปรดทราบว่า 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 เป็นล่าม Lisp ขนาดเล็กที่ใช้งานใน JavaScript น้อยกว่า 1,024 ไบต์ หากต้องการเรียกใช้การใช้งาน miniMAL ของ mal คุณต้องดาวน์โหลด/ติดตั้งล่าม 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 ให้ติดตั้ง Term::ReadLine::Perl หรือ Term::ReadLine::Gnu จาก CPAN
cd impls/perl
perl stepX_YYY.pl
การใช้งาน Perl 6 ได้รับการทดสอบบน Rakudo Perl 6 2016.04
cd impls/perl6
perl6 stepX_YYY.pl
การใช้งาน PHP ของ mal ต้องใช้อินเทอร์เฟซบรรทัดคำสั่ง 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
การใช้งาน PL/pgSQL ของ mal ต้องใช้เซิร์ฟเวอร์ PostgreSQL ที่ทำงานอยู่ (อิมเมจนักเทียบท่า "kanaka/mal-test-plpgsql" จะเริ่มเซิร์ฟเวอร์ PostgreSQL โดยอัตโนมัติ) การใช้งานจะเชื่อมต่อกับเซิร์ฟเวอร์ PostgreSQL และสร้างฐานข้อมูลชื่อ "mal" เพื่อจัดเก็บตารางและขั้นตอนการจัดเก็บ สคริปต์ wrapper ใช้คำสั่ง 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
การใช้งาน PL/SQL ของ mal ต้องใช้เซิร์ฟเวอร์ Oracle DB ที่ทำงานอยู่ (อิมเมจนักเทียบท่า "kanaka/mal-test-plsql" จะเริ่มเซิร์ฟเวอร์ Oracle Express โดยอัตโนมัติ) การใช้งานจะเชื่อมต่อกับเซิร์ฟเวอร์ Oracle เพื่อสร้างประเภท ตาราง และขั้นตอนการจัดเก็บ ค่าการเข้าสู่ระบบ SQL*Plus เริ่มต้น (ชื่อผู้ใช้/รหัสผ่าน@connect_identifier) คือ "system/oracle" แต่สามารถแทนที่ได้ด้วยตัวแปรสภาพแวดล้อม ORACLE_LOGON การใช้งานได้รับการทดสอบกับ Oracle Express Edition 11g Release 2 แล้ว โปรดทราบว่าคำเตือนการเชื่อมต่อ SQL*Plus (การหมดอายุของรหัสผ่านผู้ใช้ ฯลฯ) จะรบกวนความสามารถของสคริปต์ Wrapper ในการสื่อสารกับ DB
cd impls/plsql
./wrap.sh stepX_YYY.sql
# OR
ORACLE_LOGON=myuser/mypass@ORCL ./wrap.sh stepX_YYY.sql
การใช้งาน PostScript ของ mal ต้องใช้ Ghostscript เพื่อทำงาน ได้รับการทดสอบด้วย Ghostscript 9.10
cd impls/ps
gs -q -dNODISPLAY -I./ stepX_YYY.ps
การใช้งาน PowerShell ของ mal ต้องใช้ภาษาสคริปต์ PowerShell ได้รับการทดสอบกับ PowerShell 6.0.0 Alpha 9 บน Linux
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
การใช้งาน R ของ mal ต้องใช้ 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
การใช้งาน Rexx ของ mal ได้รับการทดสอบกับ 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 ต้องใช้คอมไพเลอร์สนิมและเครื่องมือสร้าง (สินค้า) ในการสร้าง
cd impls/rust
cargo run --release --bin stepX_YYY
ติดตั้งสกาล่าและ 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) คุณควรจะสามารถทำให้มันทำงานบนการใช้งาน R7RS อื่นๆ ที่สอดคล้องได้ หลังจากหาวิธีโหลดไลบรารีและปรับ Makefile
และ run
สคริปต์ตามนั้น
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
การใช้งาน Skew ของ mal ได้รับการทดสอบด้วย Skew 0.7.42
cd impls/skew
make
node stepX_YYY.js
การใช้ ML มาตรฐานของ mal จำเป็นต้องมีการใช้งาน 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 release
cd impls/swift4
make
./stepX_YYY
การใช้ mal Swift 5 ต้องใช้คอมไพเลอร์ Swift 5.0 ได้รับการทดสอบกับ Swift 5.1.1 release
cd impls/swift6
swift run stepX_YYY
การใช้งาน Tcl ของ mal ต้องใช้ Tcl 8.6 จึงจะทำงาน หากต้องการรองรับการแก้ไขบรรทัด Readline ให้ติดตั้ง tclreadline
cd impls/tcl
tclsh ./stepX_YYY.tcl
การใช้งาน TypeScript ของ mal ต้องใช้คอมไพเลอร์ TypeScript 2.2 ได้รับการทดสอบด้วย Node.js v6
cd impls/ts
make
node ./stepX_YYY.js
การใช้งาน Vala ของ mal ได้รับการทดสอบกับคอมไพเลอร์ Vala 0.40.8 คุณจะต้องติดตั้ง valac
และ libreadline-dev
หรือเทียบเท่า
cd impls/vala
make
./stepX_YYY
การใช้งาน VHDL ของ mal ได้รับการทดสอบด้วย 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
การใช้งาน VB.NET ของ mal ได้รับการทดสอบบน Linux โดยใช้คอมไพเลอร์ Mono VB (vbnc) และรันไทม์ Mono (เวอร์ชัน 2.10.8.1) ทั้งสองจำเป็นต้องสร้างและรันการใช้งาน VB.NET
cd impls/vb
make
mono ./stepX_YYY.exe
การใช้งาน VBScript ของ mal ได้รับการทดสอบบน 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 Macro) และทำงานภายใต้การฝังที่ไม่ใช่เว็บ (รันไทม์) ที่แตกต่างกันหลายประการ: 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
การใช้ XSLT ของ mal เขียนด้วย 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
การใช้ mal ของ Yorick ได้รับการทดสอบบน Yorick 2.2.04
cd impls/yorick
yorick -batch ./stepX_YYY.i
การใช้งาน Zig ของ mal ได้รับการทดสอบบน Zig 0.5
cd impls/zig
zig build stepX_YYY
Makefile ระดับบนสุดมีเป้าหมายที่เป็นประโยชน์มากมายเพื่อช่วยในการพัฒนาและทดสอบการใช้งาน เป้าหมาย help
แสดงรายการเป้าหมายและตัวเลือก:
make help
มีการทดสอบการทำงานทั่วไปเกือบ 800 รายการ (สำหรับการใช้งานทั้งหมด) ในไดเรกทอรี tests/
แต่ละขั้นตอนมีไฟล์ทดสอบที่เกี่ยวข้องซึ่งมีการทดสอบเฉพาะสำหรับขั้นตอนนั้น ชุดทดสอบ 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
เป็นการใช้งานการทดสอบ และใช้ตัวแปร make MAL_IMPL
เพื่อเปลี่ยนภาษาโฮสต์พื้นฐาน (ค่าเริ่มต้นคือ 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 และใช้ตัวแปร make MAL_IMPL
เพื่อเปลี่ยนภาษาโฮสต์พื้นฐาน (ค่าเริ่มต้นคือ 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 เพื่อสร้างอิมเมจนักเทียบท่าที่มีการขึ้นต่อกันทั้งหมดสำหรับการใช้งานนั้น นอกจากนี้ Makefile ระดับบนสุดยังรองรับการรันเป้าหมายการทดสอบ (และ perf, สถิติ, repl ฯลฯ) ภายในคอนเทนเนอร์นักเทียบท่าสำหรับการใช้งานนั้นโดยส่ง "DOCKERIZE=1" บนบรรทัดคำสั่ง make ตัวอย่างเช่น:
make DOCKERIZE=1 "test^js^step3"
การใช้งานที่มีอยู่ได้สร้างอิมเมจนักเทียบท่าและพุชไปยังรีจิสทรีนักเทียบท่าแล้ว อย่างไรก็ตาม หากคุณต้องการสร้างหรือสร้างอิมเมจนักเทียบท่าขึ้นใหม่ภายในเครื่อง Makefile ระดับบนสุดจะมีกฎสำหรับการสร้างอิมเมจนักเทียบท่า:
make "docker-build^IMPL"
หมายเหตุ :
make DOCKERIZE=1 "repl^IMPL"
ด้วยตนเองก่อนจึงจะสามารถรันการทดสอบได้เนื่องจากต้องดาวน์โหลดการพึ่งพารันไทม์เพื่อหลีกเลี่ยง หมดเวลาการทดสอบ การขึ้นต่อกันเหล่านี้จะถูกดาวน์โหลดไปยังไฟล์ dot ในไดเร็กทอรี /mal ดังนั้นจึงจะคงอยู่ระหว่างการรัน Mal (make-a-lisp) ได้รับอนุญาตภายใต้ MPL 2.0 (Mozilla Public License 2.0) ดู LICENSE.txt สำหรับรายละเอียดเพิ่มเติม