今晨,在微博上看到这样一个项目:
好奇心满满的笔者不禁点击链接进入它的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解释器
发布评论