JSREPL README.md 中文翻译

一个兼容多种言语的浏览器 REPL 沙盒。

当前支撑的言语

  • Javascript 系列
    • Javascript
    • CoffeeScript
    • Kaffeine
    • Move
    • Traceur (JavaScript.next)
  • Esoteric
    • Bloop
    • Brainfuck
    • LOLCODE
    • Unlambda
    • Emoticon
  • Classic
    • Quick Basic
    • Forth
  • Serious
    • Scheme
    • Lua
    • Python
    • Ruby (beta)

支撑的浏览器

  • IE 9-10
  • Chrome 10+
  • Safari 5
  • Firefox 3.6+
  • Opera 11+
  • iOS 5 Safari

最先

竖立 JSREPL

竖立依靠

node.js
npm

curl http://npmjs.org/install.sh | sh

CoffeeScript

运用 npm 装置:sudo npm install -g coffee-script

猎取源码

克隆堆栈 (cloning the repository)

git clone git://github.com/replit/jsrepl.git

源码依靠

git submodule update --init --recursive

举行 Bake 操纵

cake bake

引入 JSREPL

html<script src="jsrepl.js" id="jsrepl-script"></script>

实例化 JSREPL

javascriptvar jsrepl = new JSREPL({  
  input: inputCallback,  
  output: outputCallback,  
  result: resultCallback,  
  error: errorCallback,  
  progress: progressCallback,  
  timeout: {  
    time: 30000,  
    callback: timeoutCallback  
  }
});
  • inputCallback:一个回调函数,当言语诠释器在要求用户输入时会被挪用。
  • outputCallback:一个可选的回调函数,当引擎须要将输出发送到规范输出时会被挪用。
  • resultCallback:一个可选的回调函数, 当诠释器胜利地实行(evaluated)一条顺序并发生效果时会被挪用。
  • errorCallback:一个可选的函数,假如一条顺序在被实行(evaluated)的过程当中发生毛病时会被挪用。
  • progress:一个可选的函数,当加载一种言语时会被不停挪用,用来显现进度条百分值。
  • timeout:为顺序运转设置一个超时价。
    • time:等待时间(毫秒)。
    • callback:超时后会挪用的回调函数。这个回调必需处置惩罚渣滓接纳体系(比方说挪用 jsrepl.loadLanguage 之类的)。必需返回 true 以住手超时的反复触发。

API

JSREPL::loadLanguage

它会加载一个言语诠释器,并带有三个参数:
* 字符串 lang_name:须要加载的言语名。
* 要领 callback:回调函数,当言语胜利加载后会被挪用。
* 布尔值 worker_friendly (可选):JSREPL 默许会尝试加载一个诠释器到 Web Workers,这个参数会决议诠释器是加载到 Worker(true) 照样加载到一个 iframe(false)。

例子:

coffeescript  jsrepl.loadLanguage('python', function () {  
    alert('Python loaded');  
  });

JSREPL::eval

在当前已加载的诠释器中实行一条顺序。带有一个参数:

  • 字符串 command:须要实行的顺序字符串。
    例子:
javascript    jsrepl.eval('1+1');  

JSREPL::getLangConfig

返回该言语响应的设置对象。带有一个参数:

  • 字符串 lang_name:须要返回设置对象的言语。默许为当前言语名。

JSREPL::checkLineEnd

给定一条敕令,决议是不是预备好实行。由于有些状况是会致使临时不预备实行的,比方缺乏右括号。

  • 字符串 command:字符串,一条顺序。
  • 要领 callback:回调函数,该回调函数会在敕令(command)预备好实行时返回 true,在敕令未完全时返回 false

JSREPL::on

向一个或多个事宜绑定一个监听器。带有两个参数:

  • 字符串 | 数组 event_type:事宜范例,示意须要监听的事宜。
  • 要领 callback:回调函数,事宜被触发时将会被挪用。挪用时会带有事宜供应的若干个参数。

JSREPL::off

消除某事宜的一个或悉数的监听器的绑定。带有两个参数:

  • 字符串 | 数组 event_type:事宜范例,示意须要解绑要领的事宜。
  • 要领 callback:回调函数,供应须要解绑的要领。假如不供应将会消除一切要领。

JSREPL::once

向一个或多个事宜绑定一个只实行一次的监听器。带有两个参数:

  • 字符串 | 数组 event_type:事宜范例,示意须要监听的事宜。
  • 要领 callback:回调函数,事宜被触发时将会被挪用。挪用时会带有事宜供应的若干个参数。

事宜

input (输入)

当当前的言语诠释器要求输入时会被触发。参数:

  • 要领 callback:回调函数,顺序会一连实行这个回调函数。挪用时必需带有用户输入的字符串。注重,这个回调函数只能被一个监听器挪用。

output (输出)

当前的言语诠释器每次向规范输出举行输出时都会被触发。参数:

  • 字符串 data:数据,即输出的字符串。

result (返回)

当言语诠释器有终究返回值时会被触发。参数:

  • 字符串 data:数据,字符串的情势的终究返回值。

progress (进度)

当 JSREPL 在加载言语诠释器时的进度百分比有变化时会被触发,用于报告进度。参数:

  • 浮点型 percentage:百分比,示意加载了若干文件。

timeout (超时)

假如 JSREPL 在实例化时挑选了 timeout ,当正在运转的顺序在限制时间内未挪用指定的回调函数(见 实例化 JSREPL),那末将会触发此事宜。

ready (已预备好)

当言语已被加载完成并预备实行时,将会触发此事宜。

一些规范输入的 hack

题目

编译时运用 Emscripten 的言语诠释器希冀输入的是一个壅塞式的挪用(同步),要使之变成壅塞式挪用的唯一要领是在浏览器里用 window.prompt 提醒。虽然不抱负,但它是可行的。但是,这类要领将会使我们落空在 Web Workers 中加载诠释器的才能(由于 Workers 没有运用对话框)。

在 Workers 中加载诠释器会有许多优点,包含当诠释器初始化或事情时不壅塞主 UI 线程,以及具有捕捉无穷轮回的才能(见 timeout 事宜)。只管有这些上风,但为了能够输入,直到目前为止我们依旧防止运用 Workers。所以我们加载壅塞式挪用时应当运用 iframe 而不是 Worker。不过,在当前 Firefox 和 Chrome 的版本中打破了我们这个要领,由于我们不再能做同步的二进制 XHR 操纵了(比方去读取库文件)。

解决方案

Webkit 浏览器

在基于 Webkit 的浏览器中,我们能够应用非规范的 Web SQL 数据库在主线程和 worker 线程之间共享资源。比方它们供应的同步机制,使它能够接见主页面线程和 Worker(见 repl.coffee 和 sandbox.js)。

Firefox

遗憾,我们不能在 Firefox 举行一样的处置惩罚,由于它没有完成 Web SQL,而且依然不支撑规范的浏览器端数据库(IndexedDB)同步 API。相反,我们能够运用 XHR 在 Worker 和主线程之间举行同步通信,而我们的服务器就是自然的代办。这里有一个样例服务器装置在 repl.it static server

允许

jsREPL 在 MIT 允许下运用。jsREPL 的开发者对言语诠释器和修悛改的 jsREPL 版本具有本身的允许证,能够在它们的 extern/{言语名} 文件夹或子模块下找到。

    原文作者:JasinYip
    原文地址: https://segmentfault.com/a/1190000002430461
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞