一个兼容多种语言的浏览器 REPL 沙盒。javascript
支持的浏览器html
curl http://npmjs.org/install.sh | sh
java
使用 npm 安装:sudo npm install -g coffee-script
node
git clone git://github.com/replit/jsrepl.git
python
git submodule update --init --recursive
git
cake bake
github
html<script src="jsrepl.js" id="jsrepl-script"></script>
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
以中止超时的重复触发。它会加载一个语言解释器,并带有三个参数:
* 字符串 lang_name:须要加载的语言名。
* 方法 callback:回调函数,当语言成功加载后会被调用。
* 布尔值 worker_friendly (可选):JSREPL 默认会尝试加载一个解释器到 Web Workers,这个参数会决定解释器是加载到 Worker(true) 仍是加载到一个 iframe(false)。数据库
例子:npm
coffeescriptjsrepl.loadLanguage('python', function () { alert('Python loaded'); });
在当前已加载的解释器中执行一条程序。带有一个参数:数组
javascriptjsrepl.eval('1+1');
返回该语言相应的配置对象。带有一个参数:
给定一条命令,决定是否准备好执行。由于有些状况是会致使暂时不许备执行的,好比缺乏右括号。
true
,在命令未完整时返回 false
。向一个或多个事件绑定一个监听器。带有两个参数:
解除某事件的一个或所有的监听器的绑定。带有两个参数:
向一个或多个事件绑定一个只执行一次的监听器。带有两个参数:
当当前的语言解释器请求输入时会被触发。参数:
当前的语言解释器每次向标准输出进行输出时都会被触发。参数:
当语言解释器有最终返回值时会被触发。参数:
当 JSREPL 在加载语言解释器时的进度百分比有变化时会被触发,用于报告进度。参数:
若是 JSREPL 在实例化时选择了 timeout
,当正在运行的程序在限定时间内未调用指定的回调函数(见 实例化 JSREPL),那么将会触发此事件。
当语言已经被加载完成并准备执行时,将会触发此事件。
编译时使用 Emscripten 的语言解释器指望输入的是一个阻塞式的调用(同步),要使之变成阻塞式调用的惟一方法是在浏览器里用 window.prompt
提示。虽然不理想,但它是可行的。然而,这种方法将会使咱们失去在 Web Workers 中加载解释器的能力(由于 Workers 没有使用对话框)。
在 Workers 中加载解释器会有不少好处,包括当解释器初始化或工做时不阻塞主 UI 线程,以及拥有捕获无限循环的能力(见 timeout 事件)。尽管有这些优点,但为了可以输入,直到目前为止咱们依然避免使用 Workers。因此咱们加载阻塞式调用时应该使用 iframe 而不是 Worker。不过,在当前 Firefox 和 Chrome 的版本中打破了咱们这个方法,由于咱们不再能作同步的二进制 XHR 操做了(好比去读取库文件)。
在基于 Webkit 的浏览器中,咱们能够利用非标准的 Web SQL 数据库在主线程和 worker 线程之间共享资源。例如它们提供的同步机制,使它能够访问主页面线程和 Worker(见 repl.coffee 和 sandbox.js)。
遗憾,咱们不能在 Firefox 进行一样的处理,由于它没有实现 Web SQL,并且仍然不支持标准的浏览器端数据库(IndexedDB)同步 API。相反,咱们能够使用 XHR 在 Worker 和主线程之间进行同步通信,而咱们的服务器就是自然的代理。这里有一个样例服务器安装在 repl.it static server 。
jsREPL 在 MIT 许可下使用。jsREPL 的开发者对语言解释器和修改过的 jsREPL 版本拥有本身的许可证,能够在它们的 extern/{语言名}
文件夹或子模块下找到。