Scheme语言解释器的JavaScript语言粗略实现
Scheme)编程语言的JavaScript实现。
IDE: https://hulang1024.github.io/scheme.js/ide/
欢迎访问我的另一个C的实现:https://github.com/hulang1024/scheme。scheme.js将低优先级或停止维护。
目前的支持:
<variable>
let
quote
,'
(operator operand ...)
lambda
arguments
和callee
define
set!
begin
if
,cond
,case
,when
,unless
,and
,or
let
,do
,while
,for
标准过程
eqv?
,eq?
,equal?
number?
,=
,<
,<
,>
,<=
,>=
,+
,*
,-
,/
,zero?
,positive?
,negative?
,odd?
,even?
,abs
,remainder
,number->string
,string->number
integer?
real?
boolean?
,not
pair?
,cons
,car
,cdr
,set-car!
,set-cdr!
,caar
,cadr
...
cdddar
,cddddr
(car
和cdr
的组合,定义到第四层),null?
,list?
,list
,length
,append
,reverse
,list-tail
,list-ref
,memq
,memv
symbol?
,symbol->string
,string->symbol
,symbol->string-ci
char?
,char=?
,char-upper-case?
,char-lower-case?
,char-upcase
,char-downcase
string?
,make-string
,string
,string-length
,string-ref
,string-set!
,string=?
,string-ci=?
,substring
,string-append
,string->list
,list->string
,string-copy
,string-fill!
procedure?
,apply
,map
,for-each
,void
,void?
eval
,interaction-environment
,expand
read
,write
,newline
,display
,error
注释
单行注释:;line comment
draw-box-pointer
draw-box-pointer
可以画出序对的盒子指针表示方式,帮你理解序对的更形象的方式。
(draw-box-pointer (cons 1 2))
(draw-box-pointer (cons
(cons 1 2)
(cons 3 4)))
(draw-box-pointer (cons (cons 1
(cons 2 3))
4))
ajax-load
(ajax-load "tests/xyz.scm" (lambda () (alert 'onload)))
将Scheme代码放在script
标签中,该标签具有两个属性: type="text/scm"
和ignore
。type
属性是必须的,其值"text/scm"
是我们自定义的,它表示内容是Scheme而非JavaScript代码;ignore
属性是可选的,如果存在该属性,则其标签中的Scheme代码不会被自动执行。
下面是例子:
<script type="text/scm">
(alert "hello scheme")
</script>
<script type="text/scm">
(define gn 3)
</script>
<script type="text/scm" ignore>
(set! gn (+ gn 1)
</script>
<script type="text/scm">
(set! gn (+ gn 1)
</script>
<script type="text/scm">
(alert gn)
(define (factorial n)
(if (< n 2)
n
(* n (callee (- n 1)))))
(define n (prompt "input n"))
(alert (string-append "!" n (string #\=)
(number->string (factorial (string->number n)))))
</script>
在所有scheme代码之后,引入broswer-loader.js和scm.js:
<script src="../src/browser-loader.js"></script>
<script src="../src/scm.js"></script>
上面的例子程序运行会弹出 hello scheme 和 4 。
这个是什么?
是为了学习编程语言而编写的,一般Scheme
程序员都能实现的,Scheme语言的可用的解释器,
虽然提供了很多语言能力,但是实现起来(基础特性)很简单,现在只是个玩具,但是从中可以学到很多。
另外,ide是该scheme解释器的小IDE,用它可以编写和运行scheme代码。
它怎么工作的?
请阅读源代码。
为什么用JS
编程?
因为用JS
写更简洁,只需关注解释器的高层逻辑。如果用C
写,意味着要更严肃些并且考虑更多,以后会考虑用C。
还没有实现Scheme的高级特性?
第一级继续call/cc、宏、模式匹配,FFI lib等,这些我还不知道怎么实现,欢迎pull request :)。