1. Mal — интерпретатор Lisp, вдохновленный Clojure.
2. Мэл — это инструмент обучения
Каждая реализация Mal разделена на 11 дополнительных, автономных (и тестируемых) шагов, демонстрирующих основные концепции Lisp. Последний шаг обеспечивает самостоятельное размещение (запуск вредоносной реализации Mal). См. руководство по процессу make-a-lisp.
Шаги создания шепелявости:
Каждый шаг make-a-lisp имеет связанную с ним архитектурную диаграмму. Элементы, новые для этого шага, выделены красным. Вот окончательная архитектура после завершения шага А:
Если вы заинтересованы в создании вредоносной реализации (или просто заинтересованы в использовании вредоносной программы для чего-либо), добро пожаловать в наш Discord. В дополнение к руководству по процессу make-a-lisp существует также FAQ по mal/make-a-lisp, где я пытаюсь ответить на некоторые распространенные вопросы.
3. Mal реализован на 88 языках (94 различных реализации и 117 режимов выполнения).
Язык | Создатель |
---|---|
Ада | Крис Мур |
Ада #2 | Николя Буленгес |
GNU АВК | Мицуру Кария |
Баш 4 | Джоэл Мартин |
БАЗОВЫЙ (C64 и QBasic) | Джоэл Мартин |
BBC БЕЙСИК V | Бен Харрис |
С | Джоэл Мартин |
С #2 | Дункан Уоттс |
С++ | Стивен Тирлуолл |
С# | Джоэл Мартин |
ЧакК | Василий Шнайдерманн |
Clojure (Clojure и ClojureScript) | Джоэл Мартин |
Кофескрипт | Джоэл Мартин |
Общий Лисп | Икбал Ансари |
Кристалл | Линда_пп |
Д | Дов Мурик |
Дарт | Гарри Теркельсен |
Эликсир | Мартин Эк |
Вяз | Йос ван Бакель |
Эмакс Лисп | Василий Шнайдерманн |
Эрланг | Натан Фидлер |
ES6 (ECMAScript 2015) | Джоэл Мартин |
Ф# | Питер Стивенс |
Фактор | Джордан Льюис |
Фантом | Дов Мурик |
Фенхель | согайу |
Форт | Крис Хаузер |
GNU Коварство | Му Лэй |
GNU Смоллток | Василий Шнайдерманн |
Идти | Джоэл Мартин |
классный | Джоэл Мартин |
Хаскелл | Джоэл Мартин |
Хаксе (Neko, Python, C++ и JS) | Джоэл Мартин |
Хай | Джоэл Мартин |
Ио | Дов Мурик |
Джанет | согайу |
Ява | Джоэл Мартин |
Java-трюфель (Truffle/GraalVM) | Мэтт МакГилл |
JavaScript (демо) | Джоэл Мартин |
jq | Али МохаммадПур |
Юлия | Джоэл Мартин |
Котлин | Хавьер Фернандес-Иверн |
Латекс3 | Николя Буленгес |
LiveScript | Йос ван Бакель |
Логотип | Дов Мурик |
Луа | Джоэл Мартин |
GNU Сделать | Джоэл Мартин |
само по себе зло | Джоэл Мартин |
MATLAB (GNU Octave и MATLAB) | Джоэл Мартин |
miniMAL (Репо, Демо) | Джоэл Мартин |
НАСМ | Бен Дадсон |
Ним | Деннис Фелсинг |
Объектный Паскаль | Джоэл Мартин |
Цель С | Джоэл Мартин |
OCaml | Крис Хаузер |
Перл | Джоэл Мартин |
Перл 6 | Хинрик Орн Сигурдссон |
PHP | Джоэл Мартин |
Пиколис | Василий Шнайдерманн |
Щука | Дов Мурик |
PL/pgSQL (PostgreSQL) | Джоэл Мартин |
PL/SQL (Оракул) | Джоэл Мартин |
Постскриптум | Джоэл Мартин |
PowerShell | Джоэл Мартин |
Пролог | Николя Буленгес |
Чистый скрипт | миссискут |
Питон2 | Джоэл Мартин |
Python3 | Гэвин Льюис |
RPython | Джоэл Мартин |
Р | Джоэл Мартин |
Ракетка | Джоэл Мартин |
Рекс | Дов Мурик |
Руби | Джоэл Мартин |
Рубин #2 | Райан Кук |
Ржавчина | Джоэл Мартин |
Скала | Джоэл Мартин |
Схема (R7RS) | Василий Шнайдерманн |
Перекос | Дов Мурик |
Стандартный ML | Фабиан Бергстрем |
Свифт 3 | Джоэл Мартин |
Свифт 4 | 陆遥 |
Свифт 6 | Олег Монтак |
Ткл | Дов Мурик |
Машинопись | Масахиро Вакаме |
Вала | Саймон Тэтэм |
VHDL | Дов Мурик |
Вимскрипт | Дов Мурик |
Visual Basic.NET | Джоэл Мартин |
Сценарий Visual Basic | 刘百超 |
Веб-сборка (васм) | Джоэл Мартин |
Крапивник | Дов Мурик |
XSLT | Али МохаммадПур |
Йорик | Дов Мурик |
Зиг | Джош Тобин |
Впервые Мэл был представлен публично во время молниеносного выступления на Clojure West 2014 (к сожалению, видео нет). См. example/clojurewest2014.mal для презентации, которая была представлена на конференции (да, презентация представляет собой вредоносную программу).
На Midwest.io 2015 Джоэл Мартин выступил с презентацией о Мале под названием «Достижение открыто: лучший путь к изучению языка». Видео, слайды.
Совсем недавно Джоэл выступил с презентацией «Создайте свой собственный интерпретатор Lisp за 10 последовательных шагов» на LambdaConf 2016: Часть 1, Часть 2, Часть 3, Часть 4, Слайды.
Самый простой способ запустить любую реализацию — использовать docker. Каждая реализация имеет предварительно созданный образ Docker с установленными языковыми зависимостями. Вы можете запустить REPL, используя удобную цель в Makefile верхнего уровня (где IMPL — имя каталога реализации, а шагX — шаг для запуска):
make DOCKERIZE=1 "repl^IMPL^stepX"
# OR stepA is the default step:
make DOCKERIZE=1 "repl^IMPL"
Следующие реализации поддерживаются как отдельные проекты:
Реализация Ada была разработана с использованием GNAT 4.9 в Debian. Он также компилируется без изменений в Windows, если у вас есть версии git, GNAT и (необязательно) make для Windows. Внешних зависимостей нет (readline не реализован).
cd impls/ada
make
./stepX_YYY
Вторая реализация Ada была разработана с использованием GNAT 8 и связана с библиотекой чтения GNU.
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 использует препроцессор, который может генерировать код 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
Спасибо Стивену Сайреку за вдохновение для этой реализации.
Реализация BBC BASIC V может работать в интерпретаторе Brandy:
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
Реализация Mal на языке C требует следующих библиотек (пакетов lib и заголовков): glib, libffi6, libgc, а также библиотеки libedit или библиотеки чтения GNU.
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
Реализация была протестирована с SBCL, CCL, CMUCL, GNU CLISP, ECL и Allegro CL в Ubuntu 16.04 и Ubuntu 12.04, более подробную информацию см. в 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.
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 и арматура.
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
Реализация Mal на F# была протестирована в 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
Реализация Mal в Fantom была протестирована с Fantom 1.0.70.
cd impls/fantom
make lib/fan/stepX_YYY.pod
STEP=stepX_YYY ./run
Реализация Mal Fennel была протестирована с 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
Реализация 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, но может работать в 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, с большим количеством мошенничества в отделе ввода-вывода.
cd impls/jq
STEP=stepA_YYY ./run
# with Debug
DEBUG=true STEP=stepA_YYY ./run
Реализация 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 включает в себя запуск шага A одной из других реализаций и передачу шага Mal для запуска в качестве аргумента командной строки.
cd impls/IMPL
IMPL_STEPA_CMD ../mal/stepX_YYY.mal
cd impls/make
make -f stepX_YYY.mk
Реализация Mal NASM написана для Linux x86-64 и была протестирована с 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 была собрана и протестирована в 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, реализованный менее чем в 1024 байтах JavaScript. Чтобы запустить реализацию 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 и более поздних версий.
Для поддержки редактирования строки чтения установите 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
Для реализации 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 по умолчанию (имя пользователя/пароль@connect_identifier) является «system/oracle», но его можно переопределить с помощью переменной среды ORACLE_LOGON. Реализация была протестирована с Oracle Express Edition 11g Release 2. Обратите внимание, что любые предупреждения о соединении SQL*Plus (истечение срока действия пароля пользователя и т. д.) будут мешать возможности сценария-оболочки взаимодействовать с БД.
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. Он был протестирован с PowerShell 6.0.0 Alpha 9 в Linux.
cd impls/powershell
powershell ./stepX_YYY.ps1
Реализация Пролога использует некоторые конструкции, специфичные для SWI-Prolog, включает поддержку строки чтения и была протестирована в 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). Вы сможете запустить его на других реализациях, соответствующих 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
Стандартная реализация 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). Если вы не установили .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
XSLT-реализация Mal написана с использованием 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 в Йорике была протестирована на Йорике 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
в качестве реализации теста и используете переменную 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 для создания образа Docker, содержащего все зависимости для этой реализации. Кроме того, Makefile верхнего уровня содержит поддержку запуска целевых тестов (а также perf, stats, repl и т. д.) в Docker-контейнере для этой реализации путем передачи "DOCKERIZE=1" в командной строке make. Например:
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.