今晨,在微博上看到这样一个项目:

好奇心满满的笔者不禁点击链接进入它的GitHub主页研究了起来。

这个名为mal的Make a Lisp项目,截止目前收获了2466个star,主要贡献者Joel Martin(@bus_kanaka),现任ViaSat (前LonoCloud)Principal Engineer。在mal的README.md中,如此表述:

mal是一个受Clojure启发的Lisp解释器,使用到了 56 种语言,分别为:

Ada、GNU awk、Bash shell、C、C++、C#、Clojure、CoffeeScript、Crystal、D、Elixir、Emacs Lisp、Erlang、ES6 (ECMAScript 6 / ECMAScript 2015)、F#、Factor、Forth、Go、Groovy、GNU Guile、Haskell、Haxe、Io、Java、JavaScript (Online Demo)、Julia、Kotlin、Logo、Lua、GNU Make、mal itself、MATLAB、miniMAL、Nim、Object Pascal、Objective-C、OCaml、Perl、Perl 6、PHP、PL/pgSQL (Postgres)、PL/SQL (Oracle)、 Postscript、Python、RPython、R、Racket、Ruby、Rust、Scala、Swift、Swift 3、Tcl、VHDL、Vimscript、Visual Basic.NET

看到这里,笔者不禁产生了「我和我的小伙伴们都惊呆了」的感觉。

mal的每一次的实现都会被分割成11个独立的步骤,分别为:

  • step0_repl
  • step1_read_print
  • step2_eval
  • step3_env
  • step4_if_fn_do
  • step5_tco
  • step6_file
  • step7_quote
  • step8_macros
  • step9_try
  • stepA_mal

详情可参阅make-a-lisp process guide。

关于具体的实现,README.md中是这样介绍的:“最简单的方式是使用Docker,每次的实现都会有一个基于语言依赖预构建的Docker图像。”

各种语言实现举例,进入GitHub主页可查看全部:

Ada

make
./stepX_YYY

C

cd c
make
./stepX_YYY

C++

cd cpp
make
    # OR
make CXX=clang++-3.5
./stepX_YYY

C#

cd cs
make
mono ./stepX_YYY.exe

Haxe

cd 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

Java 1.7

cd 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"

JavaScript/Node

cd js
npm update
node stepX_YYY.js

Objective-C

cd objc
make
./stepX_YYY

Swift 3

cd swift3
make
./stepX_YYY

免责声明:笔者的编程功底并不好,也在不断的学习中,欢迎各位大牛交流指导。欢迎关注公众号mobilehub,一起学习,共同进步。

更多推荐

56种语言编写一个Lisp解释器