Scheme编程语言的JavaScript实现。
IDE: https://hulang1024.github.io/scheme.js/ide/
欢迎访问我的另一个C的实现:https://github.com/hulang1024/scheme。scheme.js将低优先级或停止维护。
目前的支持:
-
变量引用:
<variable> -
局部变量:
let -
常量引用:
quote,' -
过程调用:
(operator operand ...) -
过程:
lambda- 支持固定数量参数, 任意数量参数和n个或更多不定数量参数
- 抄录了JavaScript语言中的隐含参数
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)))
- 基础语言JavaScript的能力
-
将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 :)。