使用75种语言编写一个 Lisp 解释器

2019/03/06

今天介绍一个 GitHub 上面的 Lisp 解释器项目: kanaka / mal。mal 来源于 make a Lisp,既是这个项目的名称,也是这个项目使用的 Lisp 方言的名称。 之前有篇文章介绍了这个项目:56种语言编写一个Lisp解释器。不好意思各位,数字现在已经增长到75了,并且还会继续上升。

这个项目的特点是什么呢? 首先,从功利的角度来看,它是一个没什么用的项目

为啥这么说呢? 第一,它面向的语言不是任何一种通用的 Lisp 方言(例如 Common Lisp,Scheme 或者 Closure 等等),而是作者自创的一种相对简单的 Lisp 方言 mal。 第二,这只是个教学/实验性质的解释器,它的功能和性能完全达不到实际应用于商业项目的要求。

那它吸引人的地方在哪呢? 第一,不用说,它用了74种语言来实现同一种语言的解释器。注意,不是74种语言共同编写一个解释器,而是用74种语言中的每种语言分别写了一遍这个解释器。 第二,更重要的是,这个项目可以教会你用任何一种足够强大的语言自己写一个 Lisp 解释器。这个就比较诱人了吧。

mal 项目使用的语言列表

Ada, GNU awk, Bash 4, BASIC (C64 & QBasic) , C, C++, C#, ChucK, Common Lisp, Clojure (Clojure & ClojureScript) , CoffeeScript, Crystal, D, Dart, Elixir, Elm, Emacs Lisp, Erlang, ES6 (ECMAScript 2015) , F#, Factor, Fantom, Forth, Go, Groovy, GNU Guile, GNU Smalltalk, Haskell, Haxe (Neko, Python, C++, & JS) , Hy, Io, Java, JavaScript (Demo) , Julia, Kotlin, LiveScript, Logo, Lua, GNU Make, mal itself, Matlab (GNU Octave & MATLAB) , miniMAL (Repo, Demo) , NASM, Nim, Object Pascal, Objective C, OCaml, Perl, Perl 6, PHP, Picolisp, PL/pgSQL (Postgres) , PL/SQL (Oracle) , Postscript, PowerShell, Python (2.X & 3.X) , RPython, R, Racket, Rexx, Ruby, Rust, Scala, Scheme (R7RS), Skew, Swift, Swift 3, Swift 4, Tcl, TypeScript, VHDL, Vimscript, Visual Basic.NET, WebAssembly (wasm) , Yorick,

mal 是怎样教你写一个解释器的呢?

mal 把使用任何语言写一个 mal 解释器的工作流程分解成11步,每一步中包含独立的目标、指导和测试。通过拆分任务,降低了整体难度。(如果这些还不够,mal 甚至还为每个步骤提供了伪代码,帮你”打小抄”。)

借助 mal 提供的帮助,我自己完成了 mal 解释器的 Objective-C 版本和 Swift 4 版本。建议你也来试一试 🙂 项目地址 项目指南的中文翻译

如果你用上面列表之外的任何一种语言实现了 mal 解释器,或者对已经存在的75种语言实现的任意一种写出了更优雅、更地道(更合理地利用语言特性,符合语言习惯)的版本,项目的发起者会把你的实现加入到项目中。 如果在项目中遇到困难,欢迎使用留言或者 Email 与我交流。

Search

    Table of Contents