如何从CoffeeScript脚本中启动CoffeeScript repl?

时间:2012-10-10 03:59:15

标签: javascript node.js coffeescript read-eval-print-loop

如果我这样做

repl = require 'repl'

repl.start {useGlobal: true}

它启动一个Node repl。我该如何启动CoffeeScript repl?

由于

2 个答案:

答案 0 :(得分:5)

我认为coffee-script模块不会导出要以编程方式使用的REPL功能,就像Node repl模块那样。但CoffeeScript有一个repl.coffee文件可以使用,即使它没有在主coffee-script模块中导出。以a hint from command.coffee(运行coffee命令时执行的文件)为例,我们可以看到REPL只需要repl文件即可。因此,运行此脚本应启动CoffeeScript REPL:

require 'coffee-script/lib/coffee-script/repl'

然而,这种方法非常hacky 。最重要的缺陷是它在很大程度上取决于coffee-script模块在​​内部的工作方式以及它的组织方式。没有什么可以阻止repl.coffee文件从coffee-script/lib/coffee-script移动,或改变其工作方式。

更好的方法可能是在没有参数的情况下调用coffee命令,就像命令行中的那样,来自Node:

{spawn} = require 'child_process'
spawn 'coffee', [], stdio: 'inherit'

stdio: 'inherit' option使得生成的命令从stdin读取并写入当前进程的stdout。

答案 1 :(得分:5)

Nesh是一个尝试使这更容易和可扩展的项目:

http://danielgtaylor.github.com/nesh/

它提供了一种嵌入REPL的方法,支持多种语言,如CoffeeScript,并提供异步插件架构,支持在启动时在REPL的上下文中执行代码,等等。例如:

nesh = require 'nesh'

nesh.loadLanguage 'coffee'

nesh.start (err, repl) ->
    nesh.log.error err if err

它还支持一系列带有默认插件的选项,并且还提供了一些内置的便利功能:

opts =
    welcome: 'Welcome to my interpreter!'
    prompt: '> '
    evalData: CoffeeScript.compile 'hello = (name="world") -> "Hello, #{world}!"', {bare: true}

nesh.start opts, (err, repl) ->
    nesh.log.error err if err