MAL - 制作一个LISP

2021-04-26 10:26:11

每次实施MAL都分开了11个增量,独立(和可测试的)步骤,该步骤规范了LISP的概念。最后一步能够自托管(运行MAL的MAL实现)。请参阅Make-A-Lisp ProcessGuide。

每个make-a-lisp步骤都有一个相关的架构图。元素突出显示该步骤的新功能是Red.re是步骤a的最终图:

如果您有兴趣创建MAL实现(或在使用MAR中的内容中刚刚入口),请在Freenode上删除#malchannel。除了Make-A-Lisp ProcessGuide还有一个Mal / Make-A-Lispfaq,我试图回答一些常见问题。

MAL在2014年闪电谈话中首次公开展示(不幸的是没有视频)。 Seexamples / ClojureWest2014.对于在Thecenference提供的演示文稿(是的,演示文稿是一个MAL程序)。

在2015年中西欧,Joel Martin在标题为&#34的Mal;成就解锁的展示:更好的语言学习道路和#34;视频,幻灯片。

最近的乔尔更加努力给出"让自己的LISP译员10个增量步骤"在Lambdaconf 2016:第1部分,第2部分,第3部分,第4部分,幻灯片。

运行任何给定实现的最简单方法是使用Docker.every实现使用安装了LobsicigeNepyencies预构建的Docker映像。您可以使用顶级Makefile中使用方便机构启动REPT(其中ichl是实现指向漫步名称和stepx是运行的步骤):

通过VI - 使用害虫语法,而不是使用典型的MAL基础设施(货物-IZED步骤和内置转换测试)。

MALC - MAL(制作一个LISP)编译器。将MAL程序编译为LLVM汇编语言,然后是二进制文件。

Malcc - Malcc是MAL语言的增量编译器实现。它使用Tiny C编译器作为编译器后端,并完全支持MAL语言,包括宏,尾呼救,甚至运行时eMP。 "我建造了一个lisp编译器"帖子关于这个过程。

ADA实施是在Debian上的GNAT 4.9开发的。如果您有Windows版本的Git,GNAT和(可选)制作,则它在Windows上不变。没有外部依赖项(未实现读数)。

第二个ADA实现是用GNAT 8开发的,与GNU Readline Library的链接。

基本实现使用可以生成与C64基本(CBM V2)和QBASIC兼容的基本代码的预处理器。 THEC64模式已使用CBMBASIC进行测试(修复的修补版本需要使用行输入修复问题),并且使用QB64测试QBASIC MODEHAS。

MAL的C实现需要以下库(lib和header软件包):glib,libffi6,libgc,以及libedit或gnu readlinelibrary。

MAL的C ++实现需要G ++ - 4.9或Clang ++ - 3.5和A Readline兼容库来构建。查看CPP / README.MD Formore详细信息:

使用MONOC#编译器(MCS)和MONO运行时(版本2.10.8.1版本)在Linux上测试了MAL的C#实现。两个都是为了构建和运行C#实现。

在大多数情况下,Clojure实现需要Clojure 1.5,但是,通过所有测试,需要Clojure 1.8.0-RC4。

在Ubuntu 16.04和Ubuntu 12.04上,使用SBCL,CCL,CMUCL,GNU CLISP,ECL和Allegro CL进行了测试。更多细节,Seethe Readme。如果您已安装了绑定,则执行以下操作以运行执行

使用GDC 4.8测试MAL的D实施。它需要GNUreadline库。

EMACS LISP MAL的实施已通过Emacs 24.3和24.5进行了测试。虽然存在非常基本的readline编辑(< backspace>和c-d工作,c-d取消该过程),建议使用rlwrap。

CD iclims / ELISPEMACS -Q --batch -load Stepx_yyy.el#与完整readline supportrlwrap emacs -q - 托 - --load stepx_yyy.el

ES6 / ECMAScript 2015实现使用Babel编译器来生成ES5兼容性javascript。生成的代码已使用节点0.12.4进行测试。

使用Monof#编译器(FSHARPC)和Mono Runtime(版本3.12.1)在Linux上测试了MAL的F#实现。单声道C#编译器(MCS)也需要编译读数依赖性。所有内容都是为了构建和运行F#实现。

MAL的GO实现需要转移到路径上。该实施已通过Go 1.3.1进行了测试。

Groovy的Mal的实现需要Groovy运行,并且已经有了Groovy 1.8.6。

Haskell实现需要GHC编译器7.10.1 Orlater以及Haskell Parsec和Readline(或编辑线)软件包。

MAL的HAXE实现需要HAXE 3.2版编译。支持不同的HAXE目标:NEKO,PYTHON,C ++,ANDJAVASCRIPT。

使用Lua 5.3.5的Lua实施MAL的实现需要安装Luocks。

运行MAL的MAL实现涉及运行其他实现之一的STEPA,并将MAL步骤作为CommandLine参数运行。

MAL的NASM实现是为X86-64 Linux编写的,并且已经测试过Linux 3.16.0-4-AMD64和NASM版本2.11.05。

使用免费的Pascal Compiler版本2.6.2和2.6.4,已经建立和测试了MAL的对象Pascal实施。

使用Clang / LLVM 3.6,已建立和测试MAL的目标C实现。它也使用Xcode 7在OSX上构建和测试。

MATLAB实现已经使用GNU Octave 4.2.1进行了测试。它也在Linux上使用Matlab版R2014A进行了测试。请注意,据此是商业产品。

CD iclows / matlab。/ stepx_yyyoctave -q --no-gui --no-hardent --eval" stepx_yyy(); quit;" matlab -nodisplay --nosplash -nodektop -nojvm -r&#34 ; stepx_yyy(); quit;" #或使用命令行argumentsoctave -q - n - no-gui --no-hardent - verg" stepx_yyy(' arg1'' arg2'); z. 34; matlab -nodisplay --nosplash -nodektop -nojvm -r" stepx_yyy(' arg1'' arg2' arg2');"

最小的LISP在少于1024个字节的JavaScript中诠释仪表层。要运行MAL的最小值,您需要下载/安装最小interpreter(这需要node.js)。

CD iclims / minimal#下载最小和依赖关系,installexport路径=`pwd` / node_modules / minimal-lisp /:$ path#现在在Minimalminal中运行MAL实现./stepx_yyy

MAL的PL / PGSQL实现需要运行的PostgreSQL服务器(" kanaka / mal-test-plpgsql" Docker Image自动启动PostgreSQL Server)。该实现连接到PostgreSQL Server和创建名为" Mal"存储表格和存储程序。包装脚本使用psql命令连接到子宫和默认为用户" postgres"但这可以覆盖PSQL_USER环境变量。可以指定密码pgpassword环境变量。在PostgreSQL 9.4中已经存在了实施。

MAL的PL / SQL实现需要运行的Oracle DBServer(" kanaka / mal-test-plsql" docker映像自动启动Oracle Express Server)。该实现连接到Theoracle服务器以创建类型,表和存储过程。 thedefault sql * plus登录值(用户名/ password @ connect_identifier)是"系统/ oracle"但这可以通过Oracle_LogonEnvironment变量覆盖。使用OracleExpress Edition 11G版本2.注意,任何SQL * Plus ConnectionWarnings(用户密码到期等)都会干扰包装脚本的戏剧与DB通信。

MAL的PostScript实施需要GhostScript运行。伊萨已经用ghostscript 9.10进行了测试。

PowerShell执行MAL需要PowerShell ScriptLanguage。它已经在Linux上使用PowerShell 6.0.0 Alpha 9进行了测试。

Prolog实现使用特定于SWI-prolog的构造,包括读线路支持,并已在Debian GNU / Linux中进行测试8.2.1。

第二个Python实现批次使用类型注释并使用Arpeggio Parser库。

该方案实施MAL已用Chibi-scheme0.7.3,Kawa 2.4,Gauche 0.9.5,鸡肉4.11.0,射手座0.8.3,旋风0.6.3(Git版)和Foment 0.4(Git版本)。您应该能够将其运行在其他符合R7RS实现中,以确定如何加载库和调整Makefile并相应地运行脚本。

CD iclims / schememake symlinks#chibischeme_mode = chibi ./run# kawamake kawascheme_mode = kawa ./run# gauchescheme_mode = gauche ./run# chickenmake chickenscheme_mode = chicken ./run# sagittariusscheme_mode = sagittarius ./run# cyclonemake cyclonescheme_mode = cyclone ./run #fomentscheme_mode = foment ./run

SWIFT的MAR需要SWIFT 2.0编译器(Xcode7.0)来构建。由于中风和标准库的变化,较旧版本无法正常工作。

SWIFT 3 MAL的实施需要SWIFT 3.0编译器。伊萨已经用Swift 3预览3进行了测试。

SWIFT 4 MAR的实施需要SWIFT 4.0编译器。伊萨已经用Swift 4.2.3发布进行了测试。

SWIFT 5 MAL的实施需要SWIFT 5.0编译器。 ithas通过swift 5.1.1发布进行了测试。

MAL的TCL实施需要TCL 8.6运行。对于readline Lineed支持,请安装TClreadline。

MAL的TypeScript实现需要使用Node.js v6测试Ringscript 2.2 Compiler.it。

MAL的VALA实施已通过VALA 0.40.8计量器进行测试。您需要安装Valac和LibreaDline-Dev Orequivalent。

使用MONOVB编译器(VBNC)和MONO运行时(版本为2.10.8.1),在Linux上测试了MAL的VB.NET实现。两个都是为了构建和运行VB.NET实现。

Webassembly实现是用WAM(Webassemblymbly宏语言)的andruns编写的,在几个不同的非网络嵌入式(运行时):节点,Wasmtime,Waser,LuceT,Wax,WACE,Warpy。

CD iclims / wasm#nodemake wasm_mode = node。/ run.js ./stepx_yyy.wasm# wasmtimemake wasm_mode = wasmtimewasmtime --dir =。/ --dir =。/ --dir = / ./stepx_yyy.wasm# wasmermake wasm_mode = wasmerwasmer运行--dir =。/ --dir =。/ --dir = / ./stepx_yyy.wasm# lucetmake wasm_mode = lucetlucet-wasi --dir =。/:./ --dir = .. /: ../ --dir = /:/ ./stepx_yyy.so# waxmake wasm_mode = waxwax ./stepx_yyy.wasm# wacemake wasm_mode = wace_libcwace ./stepx_yyy.wasm# warpypake wasm_mode = warpywarpy --argv --memory-pages 256。 /stepx_yyy.wasm.wasm.

MAL的XSLT实现是用XSLT 3编写的,并在Saxon 9.9.1.6 Home Edition上进行测试。

顶级Makefile拥有许多有用的目标,可以帮助实现开发和测试。帮助目标提供目标和选项列表:

Tests /目录中的几乎是800个通用功能测试(对于所有实现)。每个步骤都有一个特定于该步骤的相应测试杂交测试。 runtest.py test harnesslaunches一个mal步骤实现,然后将测试一个ATA时间馈送到实现,并比较了预期输出/返回值的输出/返回值。

要在自托管模式下运行功能测试,请指定MALAS测试实现并使用MAL_IMPL MARE MARE更改底层主机语言(默认为JavaScript):

要启动自托管实现的求建,请指定MAL,因此执行并使用MAL_IMPL使变量更改underwing host语言(默认为javascript):

警告:这些性能测试既不是统计上有效的;运行时性能不是MAL的主要目标。如果你从这些表演测试中得出任何认真的结论,那么请与我联系在堪萨斯那我愿意卖给你的一些惊人的海滨物业。

每个实现目录都包含一个dockerfile到Cantea Docker映像,包含所有依赖性的overementation。此外,顶级Makefile包含通过通过&#34运行该实现的测试目标(和perf,stats,repl等)的支持,以便通过" dockerize = 1"在make命令行上。例如:

现有实现已经构建并推送了Docker注册表。但是,如果您希望在本地构建或重建Docker图像,TopleVelmakefile提供了构建Docker图像的规则:

基于JVM的语言实现(Groovy,Java,Clojure,Scala):您可能需要一次手动运行此命令,使Dockerize = 1" Repl ^ impl"在您可以运行测试之前,需要下载依赖的依赖项,以避免测试时序输出。这些依赖项将在/ maldirectory中下载到dot文件,以便它们将在运行之间持续存在。

MAL(Make-A-Lisp)在MPL 2.0下获得许可(Mozilla Publiclicense 2.0)。 有关更多详细信息,请参阅License.txt。