Coder Social home page Coder Social logo

hulang1024 / scheme.js Goto Github PK

View Code? Open in Web Editor NEW
58.0 6.0 6.0 1.24 MB

Scheme语言解释器的JavaScript语言实现

License: BSD 3-Clause "New" or "Revised" License

HTML 0.27% JavaScript 97.10% Scheme 0.37% CSS 2.18% Shell 0.01% Python 0.07%
javascript programing-language interpreter lisp scheme

scheme.js's Introduction

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可以画出序对的盒子指针表示方式,帮你理解序对的更形象的方式。
    (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))
    (cons 1 2) (cons (cons 1 2) (cons 3 4)) (cons (cons 1(cons 2 3)) 4)
  • ajax-load
    (ajax-load "tests/xyz.scm" (lambda () (alert 'onload)))
  • 基础语言JavaScript的能力

嵌入到HTML的方法

  1. 将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>
  2. 在所有scheme代码之后,引入broswer-loader.js和scm.js:

    <script src="../src/browser-loader.js"></script>
    <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 :)。

更多

scheme.js's People

Contributors

hulang1024 avatar soulomoon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

scheme.js's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.