一个兼容多种言语的浏览器 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
javascript
var 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/{言语名}
文件夹或子模块下找到。