function onCommand( workspace, expression ) {
		var script;
		var opts;
		var err;
		var FLG;
		var ws;
		if ( !isString( workspace ) ) {
			err = new TypeError( format( 'invalid argument. First argument must be a string. Value: `%s`.', workspace ) );
			debug( 'Error: %s', err.message );
			repl._ostream.write( 'Error: '+err.message+'\n' );
			return;
		}
		if ( !isString( expression ) ) {
			err = new TypeError( format( 'invalid argument. Second argument must be a string. Value: `%s`.', workspace ) );
			debug( 'Error: %s', err.message );
			repl._ostream.write( 'Error: '+err.message+'\n' );
			return;
		}
		if ( !hasOwnProp( repl._workspaces, workspace ) ) {
			err = new Error( format( 'invalid argument. Unrecognized workspace name. Value: `%s`.', workspace ) );
			debug( 'Error: %s', err.message );
			repl._ostream.write( 'Error: '+err.message+'\n' );
			return;
		}
		if ( RE_WHITESPACE.test( expression ) ) {
			debug( 'Expression only consists of whitespace. Nothing to evaluate.' );
			return;
		}
		// Cache the name of the current workspace:
		ws = repl._currentWorkspace;

		// Temporarily silence logging:
		FLG = repl._quiet;
		repl._quiet = true;

		// Switch to the target workspace:
		repl._context.workspace( workspace );

		// Try evaluating the expression...
		opts = {
			'filename': '<repl>',
			'lineOffset': 0
		};
		try {
			// FIXME: this needs to follow the same logic as `process_line`, such as code wrapping, asynchronous execution, and handling top-level `await`!!!
			script = new vm.Script( expression, opts );
		} catch ( error ) {
			debug( 'Error: %s', error.message );
			repl._ostream.write( 'Error: '+error.message+'\n' );
			repl._context.workspace( ws );
			repl._quiet = FLG;
			return;
		}
		// Set the (non-standard) properties on the `RegExp` expression object to the cached matches:
		restoreRegExpMatches( repl._regexp );

		opts = {
			'timeout': repl._timeout,
			'displayErrors': false,
			'breakOnSigint': true // Note: only applies for Node.js versions >=6.3.0
		};

		// FIXME: we need to follow similar logic as `drain.js`, such as SIGINT handling!!!
		try {
			script.runInContext( repl._context, opts );
			repl._ostream.write( 'Successfully evaluated expression.\n' );
		} catch ( error ) {
			debug( 'Error: %s', error.message );
			repl._ostream.write( 'Error: '+error.message+'\n' );
		}
		updateRegExpCache( repl._regexp );

		// Return to the previous workspace:
		repl._context.workspace( ws );

		// Re-enable logging (if enabled):
		repl._quiet = FLG;
	}
Evaluates an expression in a specified workspace.

@private
@param {string} workspace - workspace name
@param {string} expression - expression to evaluate
@returns {void}