Jump To …
browser.coffee cake.coffee coffee-script.coffee command.coffee grammar.coffee helpers.coffee index.coffee lexer.coffee nodes.coffee optparse.coffee repl.coffee rewriter.coffee scope.coffee

# repl.coffee

#

A very simple Read-Eval-Print-Loop. Compiles one line at a time to JavaScript and evaluates it. Good for simple tests, or poking around the Node.js API. Using it looks like this:

    coffee> puts "#{num} bottles of beer" for num in [99..1]

#

Require the coffee-script module to get access to the compiler.

    CoffeeScript = require './coffee-script'
    helpers      = require('./helpers').helpers
    readline     = require 'readline'

#

Start by opening up stdio.

    stdio = process.openStdin()

#

Quick alias for quitting the REPL.

    helpers.extend global, quit: -> process.exit(0)

#

The main REPL function. run is called every time a line of code is entered. Attempt to evaluate the command. If there's an exception, print it out instead of exiting.

    run = (buffer) ->
      try
        val = CoffeeScript.run buffer.toString(), noWrap: true, globals: true, fileName: 'repl'
        puts inspect val if val isnt undefined
      catch err
        puts err.stack or err.toString()
      repl.prompt()

#

Create the REPL by listening to stdin.

    repl = readline.createInterface stdio
    repl.setPrompt 'coffee> '
    stdio.on 'data',   (buffer) -> repl.write buffer
    repl.on  'close',  -> stdio.destroy()
    repl.on  'line',   run
    repl.prompt()