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 :)。