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> console.log "#{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'
    readline     = require 'readline'

¶

Start by opening up stdio.

    stdio = process.openStdin()

¶

Log an error.

    error = (err) ->
      stdio.write (err.stack or err.toString()) + '\n\n'

¶

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.eval buffer.toString(), bare: on, globals: on, fileName: 'repl'
        console.log val if val isnt undefined
      catch err
        error err
      repl.prompt()

¶

Make sure that uncaught exceptions don't kill the REPL.

    process.on 'uncaughtException', error

¶

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()