【问题标题】:How do I start a CoffeeScript repl from within a CoffeeScript script?如何从 CoffeeScript 脚本中启动 CoffeeScript repl?
【发布时间】:2012-09-30 11:25:02
【问题描述】:

如果我这样做

repl = require 'repl'

repl.start {useGlobal: true}

它启动一个节点 repl。如何改为启动 CoffeeScript repl?

谢谢

【问题讨论】:

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


【解决方案1】:

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

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

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

一种更好的方法可能是不带参数调用coffee 命令,就像从命令行从 Node 执行的操作一样:

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

stdio: 'inherit' option 使生成的命令从标准输入读取并写入当前进程的标准输出。

【讨论】:

  • 谢谢!我想我仍然需要该文件,因为我试图允许访问当前的流程变量。
  • @Nick,我很高兴它有帮助:)。我的理解是stdio: 'inherit' 只是让生成的进程使用与生成它的进程相同的标准输入和标准输出,但它将是一个新进程(例如 process.pid 会有所不同)。如果我的答案不是您想要的,也许您可​​以通过解释您尝试使用 REPL 本身来完成什么来扩展问题。
  • 第二种方法会丢失所有当前环境(即变量),因此几乎没有意义:/
  • 我想我宁愿写一个函数,将coffeescript编译为javascript,并将输出传递给eval语句。然后我可以在 javascript repl 中为(至少)单行咖啡脚本代码 sn-ps 运行它。
  • 我之前尝试过@epidemian 的方法,如下所示:添加需要(例如coffeeRepl = require 'coffee-script/lib/coffee-script/repl',通过coffee --nodejs debug 运行node.js,在我的coffeescript 代码中添加debugger 语句,当调试器停在那里,首先通过repl 调用node.js javascript repl ...但随后通过coffeeRepl.start() 从javascript repl 天真地调用coffeescript repl 立即回退到javascript repl,而无需等待输入...也许coffeescript repl 调用应该有所不同才能正常工作(?)
【解决方案2】:

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

【讨论】:

  • 很高兴在这里见到你,丹尼尔。现在我明白了 Coffee REPL 增强的动机来自于 =D
  • 在第一次尝试时,看起来当 nesh REPL 使用此答案的第一个代码 sn-p 启动其 REPL 时,它没有附加任何运行上下文(在 node.js 中)。有什么东西可以让它在它从哪里启动的上下文中启动?
  • @matt 有一个针对 nesh 的修复程序已准备就绪,但它正在等待上游 CoffeeScript 发布。见这里:github.com/danielgtaylor/nesh/issues/4#issuecomment-22157603
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2013-09-20
  • 2011-06-13
  • 2011-09-06
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多