# REPL
> Read-Eval-Print Loop (REPL) environment.
A Read-Eval-Print Loop (REPL) environment is an interactive programming environment which takes individual user inputs (e.g., single expressions), evaluates those inputs, and returns the result. Accordingly, a program written in a REPL environment is executed piecewise and sequentially.
REPL environments find common use in exploratory programming, prototyping, and debugging.
The REPL environment exposed here is available both as a standalone application and as a library which is embeddable in other libraries and applications.
## Usage
```javascript
var REPL = require( '@stdlib/repl' );
```
#### REPL( \[options] )
Returns a `REPL` instance.
```javascript
// Create a new REPL:
var repl = new REPL();
// ...
// Close the REPL:
repl.close();
```
The function accepts the following `options`:
- **input**: input (readable) stream. Default: [`stdin`][@stdlib/streams/node/stdin].
- **output**: output (writable) stream. Default: [`stdout`][@stdlib/streams/node/stdout].
- **sandbox**: boolean indicating whether to run a REPL in a sandboxed context. Default: `false`.
- **timeout**: number of milliseconds to execute a command before terminating execution. Default: `4294967295`.
- **isTTY**: boolean indicating whether the input and output streams should be treated like a TTY (terminal) and whether the REPL should use ANSI/VT100 escape codes when writing to the output stream.
- **inputPrompt**: input prompt. If the input prompt includes the character sequence `%d`, the input prompt includes line numbers. Default: `'In [%d]: '`.
- **outputPrompt**: output prompt. If the output prompt includes the character sequence `%d`, the output prompt includes line numbers. Default: `'Out[%d]: '`.
- **welcome**: welcome message.
- **padding**: number of empty lines between consecutive commands. Default: `1`.
- **themes**: table containing color themes for syntax highlighting.
- **load**: file path specifying a JavaScript file to load and evaluate line-by-line (e.g., a previous REPL history file).
- **save**: file path specifying where to save REPL command history.
- **log**: file path specifying where to save REPL commands and printed output.
- **quiet**: boolean indicating whether log information, confirmation messages, and other possible REPL diagnostics should be silenced. Default: `false`.
- **settings**: object specifying REPL settings.
The function supports specifying the following settings:
- **autoClosePairs**: boolean indicating whether to automatically insert matching brackets, parentheses, and quotes. Default: `true`.
- **autoDeletePairs**: boolean indicating whether to automatically delete adjacent matching brackets, parentheses, and quotes. Default: `true`.
- **autoPage**: boolean indicating whether to automatically page return values having a display size exceeding the visible screen. When streams are TTY, the default is `true`; otherwise, the default is `false`.
- **bracketedPaste**: boolean indicating whether to enable bracketed-paste mode. When streams are TTY, the default is `true`; otherwise, the default is `false`.
- **autoDisableBracketedPasteOnExit**: boolean indicating whether to automatically disable bracketed-paste upon exiting the REPL. When streams are TTY and bracketed paste is enabled, the default is `true`; otherwise, the default is `false`.
- **completionPreviews**: boolean indicating whether to display completion previews for auto-completion. When streams are TTY, the default is `true`; otherwise, the default is `false`.
- **syntaxHighlighting**: boolean indicating whether to enable syntax highlighting of entered input expressions. When streams are TTY, the default is `true`; otherwise, the default is `false`.
- **theme**: initial color theme for syntax highlighting. Default: `stdlib-ansi-basic`.
#### REPL.prototype.viewport()
Returns the REPL viewport.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// Query the REPL viewport:
var v = repl.viewport();
// Close the REPL:
repl.close();
```
#### REPL.prototype.createContext()
Returns a REPL context.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Return a new REPL context:
var ctx = repl.createContext();
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.resetContext()
Resets a REPL's execution context.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Reset the REPL context:
repl.resetContext();
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.clearHistory()
Clears a REPL's history.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Clear the REPL history:
repl.clearHistory();
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.clearUserDocs()
Clears user-defined documentation.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Clear user-defined documentation:
repl.clearUserDocs();
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.themes()
Returns a list of all available themes for syntax highlighting.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Fetch all available themes:
var themes = repl.themes();
// returns [...]
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.getTheme( name )
Returns a theme's color palette for syntax highlighting.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Add a user-defined theme:
repl.addTheme( 'myTheme', {
'keyword': 'red'
});
// Get a theme's color palette:
var theme = repl.getTheme( 'myTheme' );
// returns { 'keyword': 'red' }
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.addTheme( name, theme )
Adds a syntax highlighting theme.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Add a user-defined theme:
repl.addTheme( 'myTheme', {
'keyword': 'red',
'variable': 'green'
// ...
});
// ...
// Close the REPL:
repl.close();
```
The syntax-highlighter supports the following tokens and associated theme fields:
- **keyword**: keywords (e.g., `var`, `function`, `let`, `const`, `in`, and `class`).
- **control**: control flow keywords (e.g., `if`, `else`, `try`, `catch`, and `return`).
- **specialIdentifier**: special identifiers (e.g., `this` and `super`).
- **string**: string and template literals.
- **number**: numeric literals.
- **literal**: reserved literals (e.g., `true`, `false`, `null`, and `undefined`).
- **regexp**: regular expressions.
- **command**: built-in REPL commands.
- **function**: function identifiers.
- **object**: object identifiers.
- **variable**: literal identifiers.
- **name**: variable names.
- **comment**: line comments.
- **punctuation**: punctuation symbols (e.g., `;`, `[`, `{`, `,`, and `?`).
- **operator**: operator symbols (e.g., `+`, `-`, `*`, `=`, `++`, `>=`, and `&&`).
#### REPL.prototype.deleteTheme( name )
Deletes a specified theme from the syntax-highlighter.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Add a user-defined theme:
repl.addTheme( 'myTheme', {
'keyword': 'red',
'variable': 'green'
// ...
});
// Delete the added theme:
repl.deleteTheme( 'myTheme' );
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.renameTheme( oldName, newName )
Renames a specified theme in the syntax-highlighter.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Add a user-defined theme:
repl.addTheme( 'myTheme', {
'keyword': 'red',
'variable': 'green'
// ...
});
// Rename the added theme:
repl.renameTheme( 'myTheme', 'yourTheme' );
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.load( fpath, clbk )
Loads and evaluates a JavaScript file line-by-line.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Load and evaluate a file line-by-line:
repl.load( './path/to/file.js', done );
function done() {
// Close the REPL:
repl.close();
}
```
#### REPL.prototype.reset()
Resets a REPL.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Reset the REPL:
repl.reset();
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.clear()
Clears the entire REPL screen and scrollback history.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Clear the REPL:
repl.clear();
// ...
// Close the REPL:
repl.close();
```
This method is **only** applicable for TTY REPLs. In non-TTY REPLs, this method is a non-operation.
#### REPL.prototype.clearLine()
Clears the current line.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Clear the current line:
repl.clearLine();
// ...
// Close the REPL:
repl.close();
```
This method is **only** applicable for TTY REPLs. In non-TTY REPLs, this method is a non-operation.
#### REPL.prototype.clearCommand()
Clears the current REPL command buffer (i.e., clear any command which has been buffered but not yet executed).
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Clear the command buffer:
repl.clearCommand();
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.settings( \[name\[, value]] )
Returns REPL settings.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Retrieve REPL settings:
var o = repl.settings();
// ...
// Close the REPL:
repl.close();
```
To retrieve the current value for a specific setting, provide a `name` argument.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Retrieve current setting value:
var v = repl.settings( 'autoClosePairs' );
// ...
// Close the REPL:
repl.close();
```
To update a specific setting, provide a `value` argument.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Update setting value:
repl.settings( 'autoClosePairs', false );
// ...
// Close the REPL:
repl.close();
```
#### REPL.prototype.close()
Closes a REPL.
```javascript
var debug = require( '@stdlib/streams/node/debug-sink' );
// Create a new REPL:
var repl = new REPL({
'output': debug()
});
// ...
// Close the REPL:
repl.close();
```
* * *
### Commands
REPL instances support the following commands...
#### addTheme( name, theme )
Adds a syntax highlighting color theme.
```text
// Add color theme:
In [1]: addTheme( 'myTheme', { 'keyword': 'red' } )
// Check updated list of themes:
In [2]: themes()
Out[2]: [ 'stdlib-ansi-basic', 'myTheme' ]
```
#### alias2pkg( arg )
Returns the package name associated with a provided alias or class instance.
```text
In [1]: var v = alias2pkg( 'base.sin' )
Out[1]: '@stdlib/math/base/special/sin'
```
**Note**: only direct instances of documented built-in constructors are supported.
#### alias2related( arg )
Returns aliases related to a specified alias or class instance.
```text
In [1]: var v = alias2related( 'base.sin' )
Out[1]: [...]
```
**Note**: only direct instances of documented built-in constructors are supported.
#### ans
Result of the last successfully executed command.
```text
In [1]: identity( 3.14 )
Out[1]: 3.14
In [2]: ans
Out[2]: 3.14
```
#### assignfrom( workspace, variable )
Reads a value from a specified `workspace`.
```text
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14;
In [3]: workspace( 'barfoo' );
In [4]: var y = assignfrom( 'foobar', 'x' )
Out[4]: 3.14
```
#### assignin( workspace, variable, value )
Assigns a `value` to a `variable` in a specified `workspace`.
```text
In [1]: assignin( 'base', 'x', 3.14 );
In [2]: x
Out[2]: 3.14
```
#### citation()
Prints how to cite stdlib in publications.
```text
In [1]: citation()
```
#### clear()
Clears the entire REPL screen and scrollback history.
```text
In [1]: clear()
```
**Note**: this function is only applicable for TTY REPLs. In non-TTY REPLs, this function is a non-operation.
#### clearHistory()
Clears the REPL history.
```text
In [1]: clearHistory()
```
#### clearUserDocs( \[options] )
Deletes user-defined documentation.
```text
In [1]: clearUserDocs()
```
The function supports the following `options`:
- **include**: inclusion filter. May be either an array-like `object` or a regular expression.
- **exclude**: exclusion filter. May be either an array-like `object` or a regular expression.
- **filter**: filter type. This option is only applicable for array-like `object` filters. Must be one of the following values:
- `'alias'`: filter based on documentation alias. If a filter matches a documentation alias, the user-defined documentation is removed.
- `'value'`: filter based on object reference. If a filter matches an associated object reference, the user-defined documentation is removed.
- `'*'`: filter based on both documentation alias and object reference. If a filter matches either a documentation alias or an associated object reference, the user-defined documentation is removed.
Default: `'*'`.
```text
In [1]: clearUserDocs( { 'include': /^foo/ } )
```
#### clearvars( \[options] )
Deletes user-defined variables in the current workspace.
```text
In [1]: clearvars()
```
The function supports the following `options`:
- **include**: variable name inclusion filter. May be either an array-like `object` or a regular expression.
- **exclude**: variable name exclusion filter. May be either an array-like `object` or a regular expression.
```text
In [1]: clearvars( { 'include': /^foo/ } )
```
#### clearWorkspace( \[name, ]\[options] )
Deletes user-defined variables in a specified workspace.
```text
In [1]: clearWorkspace()
```
By default, the function clears user-defined variables in the current workspace. To clear user-defined variables in a different workspace, provide a workspace `name`.
```text
// Create a new workspace:
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14;
// Switch to another workspace:
In [3]: workspace( 'barfoo' );
In [4]: typeof x
Out[4]: 'undefined'
// List the variables in the previous workspace:
In [5]: varsWorkspace( 'foobar' )
Out[5]: [ 'x' ]
// Delete the variables in the previous workspace:
In [6]: clearWorkspace( 'foobar' );
In [7]: varsWorkspace( 'foobar' )
Out[7]: []
// Navigate to the previous workspace:
In [8]: workspace( 'foobar' );
// Confirm that the variables were deleted:
In [9]: x
Error: x is not defined
```
The function supports the following `options`:
- **include**: variable name inclusion filter. May be either an array-like `object` or a regular expression.
- **exclude**: variable name exclusion filter. May be either an array-like `object` or a regular expression.
```text
In [1]: clearWorkspace( 'foobar', { 'include': /^x/ } );
```
#### contributors()
Prints a list of stdlib contributors.
```text
In [1]: contributors()
```
#### copyright()
Prints copyright information.
```text
In [1]: copyright()
```
#### credits()
Prints credits.
```text
In [1]: credits()
```
#### currentWorkspace
Returns the name of the current workspace.
```text
In [1]: currentWorkspace
Out[1]: 'base'
```
#### deleteTheme( name )
Deletes a syntax highlighting color theme.
```text
// Add a color theme:
In [1]: addTheme( 'myTheme', { 'keyword': 'red' } )
// Check list of themes:
In [2]: themes()
Out[2]: [ 'stdlib-ansi-basic', 'myTheme' ]
// Delete the added theme:
In [3]: deleteTheme( 'myTheme' )
// Check updated list of themes:
In [4]: themes()
Out[4]: [ 'stdlib-ansi-basic' ]
```
#### deeprerequire( id )
Re-imports a module, JSON, or local file and all of its associated module dependencies.
```text
In [1]: var foo = require( './foo.js' );
// Modify `./foo.js` and/or its module dependencies...
// Re-import the module:
In [2]: foo = deeprerequire( './foo.js' );
```
Modules can be imported from `node_modules`. Local modules and JSON files can be imported using a relative path (e.g., `'./foo.js'`, `'./../bar.json'`, etc) that will be resolved against the current working directory.
#### deleteWorkspace( \[name] )
Deletes a workspace.
```text
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14;
In [3]: workspace( 'barfoo' );
In [4]: workspaces()
Out[4]: [ 'base', 'foobar', 'barfoo' ]
In [5]: deleteWorkspace( 'foobar' );
In [6]: workspaces()
Out[6]: [ 'base', 'barfoo' ]
```
If not provided an argument, the REPL deletes the current workspace and switches to the `'base'` workspace.
```text
In [1]: workspace( 'foobar' );
In [2]: currentWorkspace
Out[2]: 'foobar'
In [3]: deleteWorkspace();
In [4]: workspaces()
Out[4]: [ 'base' ]
In [5]: currentWorkspace
Out[5]: 'base'
```
**Note**: the `'base'` workspace **cannot** be deleted.
#### donate()
Prints donation information.
```text
In [1]: donate()
```
#### evalin( workspace, expression )
Evaluates an `expression` in a specified `workspace`.
```text
// Create a workspace:
In [1]: workspace( 'foobar' );
// Create and switch to another workspace:
In [2]: workspace( 'barfoo' );
// Attempt to evaluate an expression in the first workspace:
In [3]: evalin( 'foobar', 'var x = 3.14;' );
// Check that nothing has changed in the current workspace:
In [4]: x
Error: x is not defined
// Switch to the first workspace:
In [5]: workspace( 'foobar' );
// Check that the expression was successfully evaluated:
In [6]: x
Out[6]: 3.14
```
#### example( arg )
Runs examples for a specified alias, property, or class instance.
```text
In [1]: example( base.sin )
```
**Note**: only direct instances of documented built-in constructors are supported.
#### getTheme( \[name] )
Returns a syntax highlighting color theme.
```text
// Add a color theme:
In [1]: addTheme( 'myTheme', { 'keyword': 'red' } )
// Get the color theme:
In [2]: getTheme( 'myTheme' )
Out[2]: { 'keyword': 'red' }
```
**Note**: if no theme name is provided, the current theme is returned.
#### help( \[arg] )
Prints help text.
```text
In [1]: help()
```
To print help text for an alias,
```text
In [1]: help( 'base.sin' )
In [2]: help( base.sin )
```
To print help text for a property,
```text
In [1]: help( random.streams.randu.factory )
```
To print help text for a class instance,
```text
In [1]: var x = new Float64Array( 10 );
In [2]: help( x )
```
**Note**: only direct instances of documented built-in constructors are supported.
#### info( arg )
Prints abbreviated help text for a provided alias, property, or class instance.
```text
In [1]: info( base.sin )
In [2]: info( 'base.sin' )
```
**Note**: only direct instances of documented built-in constructors are supported.
#### isKeyword( keyword )
Returns a `boolean` indicating whether a string is a reserved keyword in the REPL environment.
```text
In [1]: isKeyword( 'base.sin' )
Out[1]: true
```
#### license()
Prints license information.
```text
In [1]: license()
```
#### load( fpath )
Loads and evaluates a JavaScript file, such as a REPL history file, line-by-line.
```text
In [1]: load( './path/to/file.js' )
```
#### loadWorkspace( name\[, options] )
Loads variables from a specified workspace into the current workspace.
```text
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14;
In [3]: workspace( 'barfoo' );
In [4]: typeof x
Out[4]: 'undefined'
In [5]: loadWorkspace( 'foobar' );
In [6]: x
Out[6]: 3.14
```
The function supports the following `options`:
- **include**: variable name inclusion filter. May be either an array-like `object` or a regular expression.
- **exclude**: variable name exclusion filter. May be either an array-like `object` or a regular expression.
- **override**: `boolean` indicating whether to override existing workspace variables. Default: `true`.
```text
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14, y = 6.28;
In [3]: workspace( 'barfoo' );
In [4]: typeof x
Out[4]: 'undefined'
In [5]: loadWorkspace( 'foobar', { 'include': /^x/ } );
In [6]: x
Out[6]: 3.14
In [7]: typeof y
Out[7]: 'undefined'
```
#### logStart( fpath )
Starts logging commands and printed output to a specified file path.
```text
// TODO
```
#### logStop( id )
Stops logging commands and printed output to a file path associated with a specified record identifier.
```text
// TODO
```
#### presentationStart( \[text, ]\[options] )
Starts a REPL [presentation][@stdlib/repl/presentation].
```text
In [1]: var id = presentationStart( 'beep\n---\nboop\n' );
```
The function accepts the following `options`:
- **borderTop**: top border character sequence. Default: `'*'`.
- **borderBottom**: bottom border character sequence. Default: `'*'`.
- **borderLeft**: left border character sequence. Default: `'* '`.
- **borderRight**: right border character sequence. Default: `' *'`.
- **counter**: slide counter. Can either be `true`, `false`, or `'progress'`. Default: `false`.
- **width**: [presentation][@stdlib/repl/presentation] width. If `null`, the [presentation][@stdlib/repl/presentation] width is either computed based on the screen size (if a REPL output stream is TTY) or set to `80` characters. Default: `null`.
- **height**: [presentation][@stdlib/repl/presentation] height. If `null`, the [presentation][@stdlib/repl/presentation] height is either computed based on the screen size (if a REPL output stream is TTY) or set to `25` rows. Default: `null`.
- **workspace**: REPL workspace name. A [presentation][@stdlib/repl/presentation] adds commands to the specified workspace, thus allowing [presentation][@stdlib/repl/presentation] navigation and interaction. Default: `'presentation-'`, where `n` is an assigned [presentation][@stdlib/repl/presentation] identifier.
- **load**: file path specifying a [presentation][@stdlib/repl/presentation] file to load. If presentation `text` is provided, this option is **ignored**. Otherwise, this option is **required**.
- **watch**: `boolean` indicating whether to watch a [presentation][@stdlib/repl/presentation] source file for changes. This option is only applicable if not provided presentation `text` and the `options` object specifies a presentation file to load. Default: `false`.
- **autoClear**: `boolean` indicating whether to automatically clear the screen before writing a rendered slide to the REPL. Default: `true`.
- **loop**: `boolean` indicating whether to "loop" a presentation. Default: `false`.
A few notes:
- When not provided presentation `text`, an options argument **must** specify a presentation file to load.
- If a specified workspace already exists, the workspace is silently cleared and a new [presentation][@stdlib/repl/presentation] bound. In order to preserve an existing workspace, specify an alternative presentation workspace name.
#### presentationStop( \[id] )
Stops a REPL [presentation][@stdlib/repl/presentation].
```text
In [1]: var id = presentationStart( 'beep\n---\nboop\n' );
In [2]: presentationStop();
```
A few notes:
- If provided a presentation identifier, the corresponding [presentation][@stdlib/repl/presentation] is stopped. Otherwise, assuming the function is invoked in a presentation workspace, the current [presentation][@stdlib/repl/presentation] is stopped.
- When stopping a REPL [presentation][@stdlib/repl/presentation], the presentation's REPL workspace is both **cleared** and **deleted**.
#### quit()
Exits the REPL.
```text
In [1]: quit()
```
#### renameTheme( oldName, newName )
Renames a syntax highlighting color theme.
```text
// Add a color theme:
In [1]: addTheme( 'myTheme', { 'keyword': 'red' } )
// Check list of themes:
In [2]: themes()
Out[2]: [ 'stdlib-ansi-basic', 'myTheme' ]
// Rename the added theme:
In [3]: getTheme( 'myTheme', 'yourTheme' )
// Check updated list of themes:
In [4]: themes()
Out[4]: [ 'stdlib-ansi-basic', 'yourTheme' ]
```
#### renameWorkspace( oldName, newName )
Renames a workspace.
```text
// Create a new workspace:
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14;
// List current workspaces:
In [3]: workspaces()
Out[3]: [ 'base', 'foobar' ]
// Switch to another workspace:
In [4]: workspace( 'barfoo' );
// List current workspaces:
In [5]: workspaces()
Out[5]: [ 'base', 'foobar', 'barfoo' ]
// Rename the first workspace:
In [6]: renameWorkspace( 'foobar', 'beepboop' );
// Check the updated list of workspaces:
In [7]: workspaces()
Out[7]: [ 'base', 'barfoo', 'beepboop' ]
// Switch to the renamed workspace:
In [8]: workspace( 'beepboop' );
// Confirm that workspace contains previously defined variables:
In [9]: x
Out[9]: 3.14
```
**Note**: the new workspace name must **not** already exist. The only exception is when the old name and the new name are the same; in which case, invoking this command is a non-operation.
**Note**: as a `'base'` workspace must **always** exist, when renaming the `'base'` workspace, variables from the `'base'` workspace are simply copied to a new workspace and the `'base'` workspace cleared of user-defined variables.
#### require( id )
Imports a module, JSON, or local file.
```text
In [1]: var crypto = require( 'crypto' );
```
Modules can be imported from `node_modules`. Local modules and JSON files can be imported using a relative path (e.g., `'./foo.js'`, `'./../bar.json'`, etc) that will be resolved against the current working directory.
#### rerequire( id )
Re-imports a module, JSON, or local file.
```text
In [1]: var foo = require( './foo.js' );
// Modify `./foo.js`...
// Re-import the module:
In [2]: foo = rerequire( './foo.js' );
```
Modules can be imported from `node_modules`. Local modules and JSON files can be imported using a relative path (e.g., `'./foo.js'`, `'./../bar.json'`, etc) that will be resolved against the current working directory.
#### rerun( \[arg] )
Reruns previous commands.
```text
In [1]: 1+1
Out[1]: 2
In [2]: rerun()
```
By default, the command re-executes the previous command. If provided an `integer`, the previous `n` commands are re-executed.
```text
In [1]: 1+1
Out[1]: 2
In [2]: 2+2
Out[2]: 4
In [3]: rerun( 2 )
```
If provided a regular expression, the most recent command matching the regular expression is rerun.
```text
In [1]: var x = base.sin( 3.14 );
In [2]: 1+1
Out[2]: 2
In [3]: rerun( /base\.sin/ )
```
If provided an `array` of command identifiers, the command corresponding to each identifier is rerun.
```text
In [1]: 1+1
Out[1]: 2
In [2]: 2+2
Out[2]: 4
In [3]: 3+3
Out[3]: 6
In [4]: rerun( [ 1, 3 ] )
```
If provided a subsequence `string`, the command corresponding to each resolved command identifier is rerun.
```text
In [1]: 1+1
Out[1]: 2
In [2]: 2+2
Out[2]: 4
In [3]: 3+3
Out[3]: 6
In [4]: rerun( '1:3:2' )
```
**WARNING**: be careful when re-evaluating previously executed `rerun` commands, as this can lead to infinite execution loops.
#### reset()
Resets the REPL.
```text
In [1]: reset()
```
#### save( fpath )
Saves previous commands to a specified file path.
```text
// TODO
```
#### saveStart( fpath )
Starts saving commands to a specified file path.
```text
// TODO
```
#### saveStop( id )
Stops saving commands to a file path associated with a specified record identifier.
```text
// TODO
```
#### settings( \[name\[, value]] )
Displays REPL settings.
```text
In [1]: settings()
```
To retrieve the current value for a specific setting, provide a `name` argument.
```text
In [1]: settings( 'autoClosePairs' )
```
To update a specific setting, provide a `value` argument.
```text
In [1]: settings( 'autoClosePairs', false )
```
#### themes()
Returns a list of all available syntax highlighting color themes.
```text
// Add a color theme:
In [1]: addTheme( 'myTheme', { 'keyword': 'red' } )
// Check list of themes:
In [2]: themes()
Out[2]: [ 'stdlib-ansi-basic', 'myTheme' ]
```
#### tutorial( \[name, \[options]] )
Starts a tutorial.
```text
In [1]: var id = tutorial( 'repl' );
```
The function accepts the following `options`:
- **borderTop**: top border character sequence. Default: `'*'`.
- **borderBottom**: bottom border character sequence. Default: `'*'`.
- **borderLeft**: left border character sequence. Default: `'* '`.
- **borderRight**: right border character sequence. Default: `' *'`.
- **counter**: slide counter. Can either be `true`, `false`, or `'progress'`. Default: `progress`.
- **workspace**: REPL workspace name. A tutorial [presentation][@stdlib/repl/presentation] adds commands to the specified workspace, thus allowing tutorial navigation and interaction. Default: `'tutorial--'`, where `name` is the tutorial `name` and `n` is an assigned tutorial [presentation][@stdlib/repl/presentation] identifier.
- **autoClear**: `boolean` indicating whether to automatically clear the screen before writing a rendered tutorial slide to the REPL. Default: `true`.
A few notes:
- When not provided a tutorial `name`, the function prints a list of available tutorials.
- If a specified workspace already exists, the workspace is silently cleared and a new tutorial [presentation][@stdlib/repl/presentation] bound. In order to preserve an existing workspace, specify an alternative tutorial workspace name.
#### userDoc( alias, \[ref,] doc )
Adds user-defined documentation.
```text
In [1]: function foo() {};
In [2]: userDoc( 'foo', foo, '\nfoo()\n Foo bar.\n' );
In [3]: help( foo )
```
If user-defined documentation already exists for the provided alias, the current documentation is overwritten.
```text
In [1]: function foo() {};
In [2]: userDoc( 'foo', foo, '\nfoo()\n Foo bar.\n' );
In [3]: help( foo )
foo()
Foo bar.
In [4]: userDoc( 'foo', foo, '\nfoo()\n Beep boop.\n' );
In [5]: help( foo )
foo()
Beep boop.
```
#### vars( \[options] )
Returns a list of variable names in the current workspace.
```text
In [1]: var x = 3.14;
In [2]: vars()
Out[2]: [ 'x' ]
```
The function supports the following `options`:
- **include**: regular expression variable name inclusion filter.
- **exclude**: regular expression variable name exclusion filter.
- **types**: array-like `object` containing variable type inclusion filter(s).
- **details**: `boolean` indicating whether to include additional variable details, such as variable type, contents, etc. Default: `false`.
```text
In [1]: var x = 3.14;
In [2]: vars( { 'details': true } )
```
#### varsWorkspace( \[name, ]\[options] )
Returns a list of variable names in a specified workspace.
```text
In [1]: var x = 3.14;
// List variable names in the current workspace:
In [2]: varsWorkspace()
Out[2]: [ 'x' ]
In [3]: workspace( 'foo' );
In [4]: varsWorkspace( 'base' )
Out[4]: [ 'x' ]
```
The function supports the following `options`:
- **include**: regular expression variable name inclusion filter.
- **exclude**: regular expression variable name exclusion filter.
- **types**: array-like `object` containing variable type inclusion filter(s).
- **details**: `boolean` indicating whether to include additional variable details, such as variable type, contents, etc. Default: `false`.
```text
In [1]: var x = 3.14;
In [2]: workspace( 'foo' );
In [3]: varsWorkspace( 'base', { 'details': true } )
```
#### workspace( name )
Switches to a specified workspace.
```text
In [1]: workspace( 'foobar' );
In [2]: var x = 3.14;
In [3]: workspace( 'beepboop' );
In [4]: x
Error: x is not defined
In [5]: workspace( 'foobar' );
In [6]: x
Out[6]: 3.14
```
If a workspace with the specified `name` does not exist, the workspace is created.
#### workspaces( \[options] )
Returns a list of workspace names.
```text
In [1]: workspaces()
Out[1]: [ 'base' ]
```
The function supports the following `options`:
- **include**: regular expression workspace name inclusion filter.
- **exclude**: regular expression workspace name exclusion filter.
- **details**: `boolean` indicating whether to include additional workspace details, such as variable names, types, contents, etc. Default: `false`.
```text
In [1]: workspaces( { 'details': true } )
```
* * *
## Examples
```javascript
var join = require( 'path' ).join;
var REPL = require( '@stdlib/repl' );
function onExit() {
console.log( '' );
console.log( 'REPL closed.' );
}
// Create a new REPL:
var repl = new REPL();
repl.on( 'exit', onExit );
// Load a history file:
repl.load( join( __dirname, 'examples', 'history.txt' ), done );
function done() {
// Close the REPL:
repl.close();
}
```
* * *
## CLI
### Usage
```text
Usage: stdlib-repl [options]
Options:
-h, --help Print this message.
-V, --version Print the package version.
--welcome Welcome message.
--input-prompt Input prompt. Default: 'In [%d]: '.
--output-prompt Output prompt. Default: 'Out[%d]: '.
--padding Empty lines between commands. Default: 1.
--load JavaScript file to evaluate line-by-line.
--save File to save REPL command history.
--logfile File to log REPL commands and printed output.
--timeout Milliseconds before terminating a command.
--quiet Disable printing of REPL logs and diagnostics.
```
### Examples
```bash
$ stdlib-repl
```
[@stdlib/streams/node/stdin]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/streams/node/stdin
[@stdlib/streams/node/stdout]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/streams/node/stdout
[@stdlib/repl/presentation]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/repl/presentation