1. Mal은 Clojure에서 영감을 받은 Lisp 해석기입니다.
2. Mal은 학습 도구입니다
Mal의 각 구현은 Lisp의 핵심 개념을 보여주는 11개의 점진적이고 자체 포함된(및 테스트 가능한) 단계로 구분됩니다. 마지막 단계에서는 자체 호스팅(mal의 잘못된 구현 실행)이 가능합니다. make-a-lisp 프로세스 가이드를 참조하세요.
혀를 내미는 단계는 다음과 같습니다.
각 입술 만들기 단계에는 관련 아키텍처 다이어그램이 있습니다. 해당 단계의 새로운 요소는 빨간색으로 강조 표시됩니다. A단계가 완료되면 최종 아키텍처는 다음과 같습니다.
잘못된 구현을 만드는 데 관심이 있거나 Mal을 사용하여 무언가에 관심이 있는 경우 Discord에 가입하실 수 있습니다. 리스프 만들기 프로세스 가이드 외에도 몇 가지 일반적인 질문에 답할 수 있는 잘못된/make-a-lisp FAQ도 있습니다.
3. Mal은 88개 언어로 구현됩니다(94개의 다양한 구현 및 117개의 런타임 모드).
언어 | 창조자 |
---|---|
에이다 | 크리스 무어 |
에이다 #2 | 니콜라스 불렝게즈 |
GNU 깨어 | 카리야 미츠루 |
배쉬 4 | 조엘 마틴 |
기본(C64 및 QBasic) | 조엘 마틴 |
BBC 베이직 V | 벤 해리스 |
기음 | 조엘 마틴 |
C#2 | 던컨 와츠 |
C++ | 스티븐 설월 |
기음# | 조엘 마틴 |
척 | 바실리 슈나이더만 |
클로저(Clojure 및 ClojureScript) | 조엘 마틴 |
커피스크립트 | 조엘 마틴 |
커먼 리스프 | 이크발 안사리 |
결정 | Linda_pp |
디 | 도브 무리크 |
다트 | 해리 터켈슨 |
엘릭서 | 마틴 에크 |
느릅나무 | 요스 반 베이켈 |
이맥스 리스프 | 바실리 슈나이더만 |
얼랭 | 네이선 피들러 |
ES6(ECMA스크립트 2015) | 조엘 마틴 |
에프# | 피터 스티븐스 |
요인 | 조던 루이스 |
팬텀 | 도브 무리크 |
회향 | 소가이우 |
앞으로 | 크리스 하우저 |
GNU 가일 | 무 레이 |
GNU 스몰토크 | 바실리 슈나이더만 |
가다 | 조엘 마틴 |
그루비 | 조엘 마틴 |
하스켈 | 조엘 마틴 |
Haxe(Neko, Python, C++ 및 JS) | 조엘 마틴 |
하이 | 조엘 마틴 |
이오 | 도브 무리크 |
자넷 | 소가이우 |
자바 | 조엘 마틴 |
자바 트러플(Truffle/GraalVM) | 매트 맥길 |
자바스크립트(데모) | 조엘 마틴 |
jq | 알리 모하마드푸르 |
줄리아 | 조엘 마틴 |
코틀린 | 하비에르 페르난데스-이번 |
LaTeX3 | 니콜라스 불렝게스 |
라이브스크립트 | 요스 반 베이켈 |
심벌 마크 | 도브 무리크 |
루아 | 조엘 마틴 |
GNU 메이크 | 조엘 마틴 |
말 그 자체 | 조엘 마틴 |
MATLAB(GNU 옥타브 및 MATLAB) | 조엘 마틴 |
miniMAL(레포, 데모) | 조엘 마틴 |
NASM | 벤 더드슨 |
님 | 데니스 펠싱 |
오브젝트 파스칼 | 조엘 마틴 |
목표 C | 조엘 마틴 |
OCaml | 크리스 하우저 |
펄 | 조엘 마틴 |
펄 6 | 힌리크 외른 시구르드손 |
PHP | 조엘 마틴 |
피콜리스프 | 바실리 슈나이더만 |
단창 | 도브 무리크 |
PL/pgSQL(PostgreSQL) | 조엘 마틴 |
PL/SQL(오라클) | 조엘 마틴 |
추신 | 조엘 마틴 |
파워셸 | 조엘 마틴 |
프롤로그 | 니콜라스 불렝게즈 |
퓨어스크립트 | Mrsekut |
파이썬2 | 조엘 마틴 |
파이썬3 | 개빈 루이스 |
R파이썬 | 조엘 마틴 |
아르 자형 | 조엘 마틴 |
라켓 | 조엘 마틴 |
렉스 | 도브 무리크 |
루비 | 조엘 마틴 |
루비 #2 | 라이언 쿡 |
녹 | 조엘 마틴 |
스칼라 | 조엘 마틴 |
구성표(R7RS) | 바실리 슈나이더만 |
비스듬한 | 도브 무리크 |
표준 ML | 파비안 버그스트롬 |
스위프트 3 | 조엘 마틴 |
스위프트 4 | 陆遥 |
스위프트 6 | 올렉 몬탁 |
Tcl | 도브 무리크 |
타입스크립트 | 마사히로 와카메 |
발라 | 사이먼 테이텀 |
VHDL | 도브 무리크 |
Vimscript | 도브 무리크 |
비주얼 베이직.NET | 조엘 마틴 |
비주얼 베이직 스크립트 | 刘百超 |
웹어셈블리(wasm) | 조엘 마틴 |
렌 | 도브 무리크 |
XSLT | 알리 모하마드푸르 |
요릭 | 도브 무리크 |
급격한 변경 | 조쉬 토빈 |
Mal은 Clojure West 2014의 번개 강연에서 처음으로 공개적으로 발표되었습니다(안타깝게도 비디오가 없습니다). 컨퍼런스에서 발표된 프레젠테이션은 example/clojurewest2014.mal을 참조하세요(예, 프레젠테이션은 잘못된 프로그램입니다).
Midwest.io 2015에서 Joel Martin은 "Achievement Unlocked: A Better Path to Language Learning"이라는 제목으로 Mal에 대해 프레젠테이션을 했습니다. 비디오, 슬라이드.
최근에 Joel은 LambdaConf 2016: 1부, 2부, 3부, 4부, 슬라이드에서 "10단계 증분 단계로 나만의 Lisp 해석기 만들기"에 대한 프레젠테이션을 진행했습니다.
특정 구현을 실행하는 가장 간단한 방법은 docker를 사용하는 것입니다. 모든 구현에는 언어 종속성이 설치된 사전 구축된 Docker 이미지가 있습니다. 최상위 Makefile에서 편리한 대상을 사용하여 REPL을 시작할 수 있습니다(여기서 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 및 (선택적으로) make가 있는 경우 Windows에서 변경되지 않은 상태로 컴파일됩니다. 외부 종속성은 없습니다(readline이 구현되지 않음).
cd impls/ada
make
./stepX_YYY
두 번째 Ada 구현은 GNAT 8로 개발되었으며 GNU readline 라이브러리와 연결됩니다.
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 구현은 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 구현에는 libedit, libgc, libdl 및 libffi 라이브러리(lib 및 헤더 패키지)가 필요합니다.
cd impls/c.2
make
./stepX_YYY
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
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
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
Mal의 Elm 구현은 Elm 0.18.0에서 테스트되었습니다.
cd impls/elm
make stepX_YYY.js
STEP=stepX_YYY ./run
Mal의 Erlang 구현에는 Erlang/OTP R17 및 철근이 필요합니다.
cd impls/erlang
make
# OR
MAL_STEP=stepX_YYY rebar compile escriptize # build individual step
./stepX_YYY
ES6/ECMAScript 2015 구현에서는 바벨 컴파일러를 사용하여 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 종속성을 컴파일하려면 모노 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 parsc 및 readline(또는 editline) 패키지도 필요합니다.
cd impls/haskell
make
./stepX_YYY
Haxe의 Mal 구현을 컴파일하려면 Haxe 버전 3.2가 필요합니다. Neko, Python, C++ 및 JavaScript의 네 가지 Haxe 대상이 지원됩니다.
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
IO 부서에서 많은 부정 행위가 발생한 버전 1.6에 대해 테스트되었습니다.
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
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의 로고 구현은 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의 잘못된 구현을 실행하려면 다른 구현 중 하나의 stepA를 실행하고 명령줄 인수로 실행할 잘못된 단계를 전달해야 합니다.
cd impls/IMPL
IMPL_STEPA_CMD ../mal/stepX_YYY.mal
cd impls/make
make -f stepX_YYY.mk
NASM의 말 구현은 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
Mal의 오브젝트 파스칼 구현은 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" 도커 이미지는 자동으로 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" 도커 이미지는 자동으로 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 지원을 포함하며 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의 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
Vala의 Mal 구현은 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 구현은 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 매크로 언어)으로 작성되었으며 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
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이 포함되어 있습니다. 또한 최상위 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를 참조하세요.