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

Nic*_*ick 4 javascript node.js coffeescript read-eval-print-loop

如果我做

repl = require 'repl'

repl.start {useGlobal: true}
Run Code Online (Sandbox Code Playgroud)

它启动一个Node repl.如何启动CoffeeScript repl呢?

谢谢

epi*_*ian 5

我认为该coffee-script模块不会导出REPL功能以便以编程方式使用,就像Node repl模块一样.但CoffeeScript有一个repl.coffee可以使用的文件,即使它没有在主coffee-script模块中导出.以一个暗示从command.coffee(这是执行的时候,你运行该文件coffee的命令),我们可以看到REPL通过要求工作只是repl文件.因此,运行此脚本应启动CoffeeScript REPL:

require 'coffee-script/lib/coffee-script/repl'
Run Code Online (Sandbox Code Playgroud)

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

一个更好的方法可能是调用coffee没有参数的命令,就像从命令行那样,从Node 调用:

{spawn} = require 'child_process'
spawn 'coffee', [], stdio: 'inherit'
Run Code Online (Sandbox Code Playgroud)

stdio: 'inherit'选项使生成的命令从stdin读取并写入当前进程的stdout.


Dan*_*iel 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
Run Code Online (Sandbox Code Playgroud)

它还支持一组带有默认插件的选项,并且还公开了一些内置的便利功能:

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
Run Code Online (Sandbox Code Playgroud)