项目作者: hulang1024

项目描述 :
Scheme语言解释器的JavaScript语言粗略实现
高级语言: JavaScript
项目地址: git://github.com/hulang1024/scheme.js.git
创建时间: 2017-01-17T13:37:57Z
项目社区:https://github.com/hulang1024/scheme.js

开源协议:BSD 3-Clause "New" or "Revised" License

关键词:
interpreter javascript lisp programing-language scheme

下载


scheme.js

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语言中的隐含参数argumentscallee
  • 静态(词法)作用域
  • 闭包
  • 动态类型
  • 第一级函数
  • 传值调用
  • 定义: 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
      1. 整数: integer?
      2. 实数: real?
    • 其它数据类型
      1. 布尔
        boolean?,not
      2. 序对和表
        pair?,cons,car,cdr,set-car!,set-cdr!,
        caar,cadr ... cdddar,cddddr (carcdr的组合,定义到第四层),
        null?,list?,list,length,append,reverse,list-tail,list-ref,memq,memv
      3. 符号
        symbol?,symbol->string,string->symbol,symbol->string-ci
      4. 字符
        char?,char=?,char-upper-case?,char-lower-case?,char-upcase,char-downcase
      5. 字符串
        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可以画出序对的盒子指针表示方式,帮你理解序对的更形象的方式。
    1. (draw-box-pointer (cons 1 2))
    2. (draw-box-pointer (cons
    3. (cons 1 2)
    4. (cons 3 4)))
    5. (draw-box-pointer (cons (cons 1
    6. (cons 2 3))
    7. 4))
    (cons 1 2)
    (cons (cons 1 2) (cons 3 4))
    (cons (cons 1(cons 2 3)) 4)
  • ajax-load
    1. (ajax-load "tests/xyz.scm" (lambda () (alert 'onload)))
  • 基础语言JavaScript的能力

嵌入到HTML的方法

  1. 将Scheme代码放在script标签中,该标签具有两个属性: type="text/scm"ignore
    type属性是必须的,其值"text/scm"是我们自定义的,它表示内容是Scheme而非JavaScript代码;
    ignore属性是可选的,如果存在该属性,则其标签中的Scheme代码不会被自动执行。
    下面是例子:

    1. <script type="text/scm">
    2. (alert "hello scheme")
    3. </script>
    4. <script type="text/scm">
    5. (define gn 3)
    6. </script>
    7. <script type="text/scm" ignore>
    8. (set! gn (+ gn 1)
    9. </script>
    10. <script type="text/scm">
    11. (set! gn (+ gn 1)
    12. </script>
    13. <script type="text/scm">
    14. (alert gn)
    15. (define (factorial n)
    16. (if (< n 2)
    17. n
    18. (* n (callee (- n 1)))))
    19. (define n (prompt "input n"))
    20. (alert (string-append "!" n (string #\=)
    21. (number->string (factorial (string->number n)))))
    22. </script>
  2. 在所有scheme代码之后,引入broswer-loader.js和scm.js:

    1. <script src="../src/browser-loader.js"></script>
    2. <script src="../src/scm.js"></script>
  3. 上面的例子程序运行会弹出 hello scheme 和 4 。

F.A.Q

  • 这个是什么?
    是为了学习编程语言而编写的,一般Scheme程序员都能实现的,Scheme语言的可用的解释器,
    虽然提供了很多语言能力,但是实现起来(基础特性)很简单,现在只是个玩具,但是从中可以学到很多。
    另外,ide是该scheme解释器的小IDE,用它可以编写和运行scheme代码。

  • 它怎么工作的?
    请阅读源代码。

  • 为什么用JS编程?
    因为用JS写更简洁,只需关注解释器的高层逻辑。如果用C写,意味着要更严肃些并且考虑更多,以后会考虑用C。

  • 还没有实现Scheme的高级特性?
    第一级继续call/cc、宏、模式匹配,FFI lib等,这些我还不知道怎么实现,欢迎pull request :)。

更多