Skip to content

dolymood/lisp.js

Repository files navigation

lisp.js

一个JavaScript版lisp解析器。

参考Peter Norvig的 How to Write a (Lisp) Interpreter (in Python)

文件wangjianbo--lisp解析器--test.html和guanyuxin--Lisp词法分析.html是朋友所写。

支持的Scheme子集的语法和语义

Scheme的优美之处就在于我们只需要六种特殊形式,以及另外的三种语法构造——变量、常量和过程调用:

形式 (Form) 语法 语义和示例
变量引用 var 一个符号,被解释为一个变量名;其值就是这个变量的值。
示例: x
常量字面值 number 数字的求值结果为其本身
示例: 12 或者-3.45e+6
引用 (quote exp) 返回exp的字面值;不对它进行求值。
示例:(quote (a b c)) ⇒ (a b c)
条件测试 (if test conseq alt) test进行求值;如果结果为真,那么对conseq进行求值并返回结果;否则对alt求值并返回结果。
示例:(if (< 10 20) (+ 1 1) (+ 3 3)) ⇒ 2
赋值 (set! var exp) exp进行求值并将结果赋给varvar必须已经进行过定义 (使用define进行定义或者作为一个封闭过程的参数)。
示例:(set! x2 (* x x))
定义 (define var exp) 在最内层环境 (environment) 中定义一个新的变量并将对exp表达式求值所得的结果赋给该变量。
示例:(define r 3) 或者 (define square (lambda (x) (* x x)))
过程 (lambda (var…) exp) 创建一个过程,其参数名字为var…,过程体为相应的表达式。
示例:(lambda (r) (* 3.141592653 (* r r)))
(表达式) 序列 (begin exp…) 按从左到右的顺序对表达式进行求值,并返回最终的结果。
示例:(begin (set! x 1) (set! x (+ x 1)) (* x 2)) ⇒ 4
过程调用 (proc exp…) 如果proc是除了if, set!, define, lambda, begin,或者quote之外的其它符号的话,那么它会被视作一个过程。它的求值规则如下:所有的表达式exp都将被求值,然后这些求值结果作为过程的实际参数来调用该相应的过程。
示例:(square 12) ⇒ 144

About

JS版lisp解析器

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published