kei-lisp 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/cli.cjs +211 -4
- package/dist/index.cjs +210 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +96 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.js +210 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#intern","#generateNumber"],"sources":["../src/runtime/Table/index.ts","../src/value/InterpretedSymbol/index.ts","../src/value/Loop/index.ts","../src/parser/IntStream/index.ts","../src/errors/KeiLispError/index.ts","../src/errors/ParseError/index.ts","../src/parser/NextState/index.ts","../src/parser/Parser/index.ts","../src/value/Cons/index.ts","../src/errors/EvalError/index.ts","../src/constants/index.ts","../src/runtime/Applier/index.ts","../src/errors/ExitError/index.ts","../src/runtime/StreamManager/index.ts","../src/runtime/Evaluator/index.ts","../src/interpreter/LispInterpreter/index.ts","../src/interpreter/Repl/index.ts"],"sourcesContent":["import { Cons } from '../../value/Cons/index.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Class that manages bindings of interpreted symbols.\n * @author Keisuke Ikeda\n * @this {Table}\n */\nexport class Table extends Map<unknown, LispValue> {\n /**\n * The enclosing (parent) environment, or null when this is the root.\n */\n source: Table | null;\n /**\n * Whether this environment is the root of its chain.\n */\n root: boolean;\n\n /**\n * Constructor.\n * @constructor\n * @param aTable the environment in which this environment was created\n */\n constructor(aTable: Table | null = null) {\n super();\n this.source = aTable;\n this.root = aTable == null;\n }\n\n /**\n * Clones this Table and returns the clone.\n * @return the cloned Table\n */\n clone(): Table {\n const aTable = new Table(this);\n for (const key of this.keys()) {\n const value = Cons.cloneValue(this.get(key));\n if (value == null) {\n throw new Error('RuntimeException!');\n }\n aTable.set(key, value);\n }\n\n return aTable;\n }\n\n /**\n * Returns whether anything is bound to the given property (key).\n * @param aSymbol the symbol to look up\n * @return true if a binding exists in this scope or any enclosing scope\n */\n override has(aSymbol: unknown): boolean {\n if (super.has(aSymbol)) {\n return true;\n }\n if (this.isRoot()) {\n return false;\n }\n\n // source is guaranteed non-null when isRoot=false (the constructor sets root=true iff aTable is null).\n return (this.source as Table).has(aSymbol);\n }\n\n /**\n * Returns whether this instance equals the given object.\n * @param anObject the object to compare against\n * @return true when the underlying Map.equals would return true\n */\n equals(anObject: unknown): boolean {\n // Kept for interface uniformity with Cons.equals / InterpretedSymbol.equals.\n // Delegates to Map.prototype.equals which does not exist in JS (throws TypeError).\n return (Map.prototype as unknown as { equals(o: unknown): boolean }).equals(anObject);\n }\n\n /**\n * Returns the value bound to the given interpreted symbol, walking up the scope chain.\n * @param aSymbol the symbol to look up\n * @return the bound value, or null when no binding exists\n */\n override get(aSymbol: unknown): LispValue {\n if (super.has(aSymbol)) {\n return super.get(aSymbol) as LispValue;\n }\n if (this.isRoot()) {\n return null;\n }\n\n // source is guaranteed non-null when isRoot=false.\n return (this.source as Table).get(aSymbol);\n }\n\n /**\n * Returns whether this instance is the root of the environment chain.\n * @return true if this is the root environment\n */\n isRoot(): boolean {\n return this.root;\n }\n\n /**\n * Reassigns the symbol bound in the innermost scope (equivalent to Common Lisp's setq). If a binding exists in the current scope, update it and return; otherwise recurse into the parent scope.\n * @param aSymbol the symbol to update\n * @param anObject the new bound value\n * @return the new bound value, or null when no enclosing scope has a binding\n */\n setIfExist(aSymbol: unknown, anObject: LispValue): LispValue {\n if (super.has(aSymbol)) {\n this.set(aSymbol, anObject);\n return anObject;\n }\n if (this.isRoot()) {\n return null;\n }\n return (this.source as Table).setIfExist(aSymbol, anObject);\n }\n\n /**\n * Sets whether this instance is the root of its environment chain.\n * @param aBoolean the new root flag\n * @return null\n */\n setRoot(aBoolean: boolean): null {\n this.root = aBoolean;\n return null;\n }\n\n /**\n * Sets the parent environment.\n * @param aTable the new parent environment (or null)\n * @return null\n */\n setSource(aTable: Table | null): null {\n this.source = aTable;\n return null;\n }\n\n /**\n * Returns a formatted string representation of this instance.\n * @return the formatted string\n */\n override toString(): string {\n return '#<Environment>';\n }\n}\n","import { Table } from '../../runtime/Table/index.js';\n\n/**\n * @class\n * @classdesc Interpreted symbol with uniqueness, where each printed name maps to a single canonical instance (identity equals equality). A class that mimics canonical strings, distinct from JS's standard Symbol.\n * @author Keisuke Ikeda\n * @this {InterpretedSymbol}\n */\nexport class InterpretedSymbol extends Object {\n /**\n * Table that stores InterpretedSymbol instances (lazily initialized to avoid a circular dependency).\n */\n static #intern: Table | null = null;\n /**\n * Lazy accessor for the intern table that holds every InterpretedSymbol instance.\n * @return the intern Table (created on first access)\n */\n static get table(): Table {\n this.#intern ??= new Table();\n return this.#intern;\n }\n\n /**\n * The printed name of this symbol.\n */\n name: string;\n\n /**\n * Constructor.\n * @constructor\n * @param name printed name\n */\n constructor(name: string = 'null') {\n super();\n this.name = name;\n }\n\n /**\n * Compares this interpreted symbol with the given one by printed name.\n * @param aSymbol the symbol to compare against\n * @return the difference in string length\n */\n compareTo(aSymbol: InterpretedSymbol): number {\n const left = this.name.codePointAt(0) ?? 0;\n const right = aSymbol.name.codePointAt(0) ?? 0;\n let aNumber = left < right ? aSymbol.name.length - left : left - aSymbol.name.length;\n aNumber = left === right ? 0 : aNumber;\n\n return aNumber;\n }\n\n /**\n * Returns whether this symbol equals the given object.\n * @param anObject the object to compare against\n * @return true when identity-equal (since intern guarantees uniqueness)\n */\n equals(anObject: unknown): boolean {\n return this === anObject;\n }\n\n /**\n * Returns the same interpreted symbol for a given printed name.\n * @param aString printed name\n * @return the canonical InterpretedSymbol for that name\n */\n static of(aString: string): InterpretedSymbol {\n let aSymbol = this.table.get(aString) as InterpretedSymbol | null;\n\n if (aSymbol == null) {\n aSymbol = new InterpretedSymbol(aString);\n this.table.set(aString, aSymbol);\n }\n\n return aSymbol;\n }\n\n /**\n * Returns the string representation of this symbol.\n * @return the printed name\n */\n override toString(): string {\n return this.name;\n }\n}\n","import type { Cons } from '../Cons/index.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Iterator class for Cons.\n * @author Keisuke Ikeda\n * @this {Loop}\n */\nexport class Loop extends Object {\n /**\n * The Cons being iterated over.\n */\n aCons: Cons;\n /**\n * The number of elements in the underlying Cons (computed once at construction time).\n */\n length: number;\n /**\n * The 1-based index of the next element to return.\n */\n index: number;\n\n /**\n * Constructor.\n * @constructor\n * @param aCons the Cons to iterate over\n */\n constructor(aCons: Cons) {\n super();\n this.aCons = aCons;\n this.length = aCons.length();\n this.index = 1;\n }\n\n /**\n * Returns this instance so it can be used as its own iterator.\n * @return this Loop instance\n */\n iterator(): this {\n return this;\n }\n\n /**\n * Returns whether a next element exists.\n * @return true if there is at least one more element\n */\n hasNext(): boolean {\n return this.index <= this.length;\n }\n\n /**\n * Returns the next element and advances the cursor.\n * @return the element at the current index\n */\n next(): LispValue {\n const anObject = this.aCons.nth(this.index);\n this.remove();\n\n return anObject;\n }\n\n /**\n * Implementation of the iterable protocol. Enables iteration with for...of and similar constructs.\n * @return an iterator over the Cons elements\n */\n [Symbol.iterator](): Iterator<LispValue> {\n return {\n next: (): IteratorResult<LispValue> => {\n if (this.index <= this.length) {\n const nextValue = this.aCons.nth(this.index);\n this.remove();\n return { value: nextValue, done: false };\n }\n return { done: true } as IteratorResult<LispValue>;\n },\n };\n }\n\n /**\n * Implementation of the async iterable protocol. Enables iteration with for await...of and similar constructs.\n * @return an async iterator over the Cons elements\n */\n [Symbol.asyncIterator](): AsyncIterator<LispValue> {\n return {\n next: (): Promise<IteratorResult<LispValue>> => {\n if (this.index <= this.length) {\n const nextValue = this.aCons.nth(this.index);\n this.remove();\n return Promise.resolve({ value: nextValue, done: false });\n }\n return Promise.resolve({ done: true } as IteratorResult<LispValue>);\n },\n };\n }\n\n /**\n * Advances the cursor to the next element.\n * @return null\n */\n remove(): null {\n this.index++;\n return null;\n }\n}\n","/**\n * @class\n * @classdesc Class that mimics Java's IntStream.\n * @author Keisuke Ikeda\n * @this {IntStream}\n */\nexport class IntStream extends Object {\n /**\n * Builds and returns an array of consecutive integers from start to afterEnd (exclusive).\n * @param start the first integer (inclusive)\n * @param afterEnd the integer one past the last value to include\n * @return the array of integers in [start, afterEnd)\n */\n static range(start: number, afterEnd: number): number[] {\n const end = afterEnd - 1;\n return this.rangeClosed(start, end);\n }\n\n /**\n * Builds and returns an array of consecutive integers from start to end (inclusive).\n * @param start the first integer (inclusive)\n * @param end the last integer (inclusive)\n * @return the array of integers in [start, end]\n */\n static rangeClosed(start: number, end: number): number[] {\n const range = end - start + 1;\n return Array.from({ length: range }, () => start++);\n }\n}\n","/**\n * @class\n * @classdesc Base class for all errors raised by kei-lisp during parsing or evaluation. Catch this to handle any Lisp-level failure without intercepting an unrelated runtime error or an `ExitError` (which signals a graceful `(exit)` and is intentionally not a subclass).\n * @author Keisuke Ikeda\n * @this {KeiLispError}\n */\nexport class KeiLispError extends Error {\n /**\n * Constructor.\n * @constructor\n * @param message human-readable diagnostic message\n */\n constructor(message: string) {\n super(message);\n this.name = 'KeiLispError';\n }\n}\n","import { KeiLispError } from '../KeiLispError/index.js';\n\n/**\n * @class\n * @classdesc Error raised when the parser cannot turn a source string into an AST. Subclass of `KeiLispError`.\n * @author Keisuke Ikeda\n * @this {ParseError}\n */\nexport class ParseError extends KeiLispError {\n /**\n * Constructor.\n * @constructor\n * @param message human-readable diagnostic message\n */\n constructor(message: string) {\n super(message);\n this.name = 'ParseError';\n }\n}\n","import { ParseError } from '../../errors/ParseError/index.js';\nimport type { Parser } from '../Parser/index.js';\n\n/**\n * @class\n * @classdesc Class that holds the next state.\n * @author Keisuke Ikeda\n * @this {NextState}\n */\nexport class NextState extends Object {\n /**\n * The parser whose method will be invoked. Set on each call to `next`.\n */\n automaton: Parser | null = null;\n /**\n * The fallback state number returned when no method is configured (or as the initial value).\n */\n nextState: number | null;\n /**\n * Cached reference to the resolved method (kept as `unknown` because lookup happens by name).\n */\n method: unknown;\n /**\n * The name of the parser method to invoke, or null if only `nextState` should be returned.\n */\n methodName: string | null;\n\n /**\n * Constructor.\n * @constructor\n * @param aNumber the fallback state number (or null)\n * @param aString the parser method name to invoke (or null)\n */\n constructor(aNumber: number | null, aString: string | null) {\n super();\n this.nextState = aNumber;\n this.method = null;\n this.methodName = aString;\n }\n\n /**\n * Invokes the method corresponding to the input character and returns the resulting token number.\n * @param anAutomaton the parser to invoke the method on\n * @return the next state number\n */\n next(anAutomaton: Parser): number {\n this.automaton = anAutomaton;\n if (this.methodName == null) {\n return Number(this.nextState);\n }\n if (this.method == null) {\n try {\n this.method = (this.automaton as unknown as Record<string, unknown>)[this.methodName];\n } catch {\n throw new ParseError('Not Found Method: ' + this.methodName);\n }\n }\n\n let aNumber = -1;\n try {\n if (this.nextState != null) {\n aNumber = this.nextState;\n }\n const anObject = (this.automaton as unknown as Record<string, () => unknown>)[\n this.methodName\n ]();\n if (anObject != null) {\n aNumber = Number(anObject);\n }\n } catch (error) {\n // Preserve Lisp-domain parse errors; wrap anything else (e.g. TypeError from\n // a malformed grammar table) as a ParseError so library users see the same family.\n if (error instanceof ParseError) throw error;\n throw new ParseError(`Not Invoke Method: ${this.methodName}`);\n }\n\n return aNumber;\n }\n}\n","import { Cons } from '../../value/Cons/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport { IntStream } from '../IntStream/index.js';\nimport { NextState } from '../NextState/index.js';\nimport { ParseError } from '../../errors/ParseError/index.js';\nimport type { LispValue } from '../../types/index.js';\n\nconst PEEKCOUNT = 10;\nconst SYNTAX_ERROR = 'Syntax Error!';\n\n/**\n * @class\n * @classdesc Class that performs parsing (syntactic analysis).\n * @author Keisuke Ikeda\n * @this {Parser}\n */\nexport class Parser extends Object {\n /**\n * Iterator over the input source characters.\n */\n stream: Iterator<string>;\n /**\n * The most recently produced parse token (a value or sub-Cons).\n */\n token: LispValue;\n /**\n * The accumulator for the current literal being read (number, symbol, string).\n */\n tokenString: string;\n /**\n * The state transition table: current state -> (input code point string -> NextState).\n */\n states: Map<number, Map<string, NextState>>;\n /**\n * The current automaton state number.\n */\n state: number;\n /**\n * The look-ahead buffer of characters (size `PEEKCOUNT + 1`).\n */\n nexts: Array<string | null>;\n\n /**\n * Constructor.\n * @constructor\n * @param aString the string to parse\n */\n constructor(aString: string) {\n super();\n this.stream = aString[Symbol.iterator]();\n this.token = null;\n this.tokenString = '';\n this.states = new Map();\n this.state = 0;\n this.nexts = Array.from({ length: PEEKCOUNT + 1 }, (): string | null => null);\n this.initializeStateTransitionTable();\n let count = 0;\n while (count++ < PEEKCOUNT) {\n this.nextChar();\n }\n }\n\n /**\n * Returns whether this is the last element.\n * @return true if there are no more characters to read\n */\n atEnd(): boolean {\n return this.peekChar() == null;\n }\n\n /**\n * Concatenates the current character into the token string.\n * @return null\n */\n concatCharacter(): null {\n this.tokenString = this.tokenString.concat(String(this.nexts[0]));\n return null;\n }\n\n /**\n * Parses a single character of the input string.\n * @param aCharacter the character to feed into the automaton; defaults to the next character\n * @return the token produced so far (may be null if still accumulating)\n */\n input(aCharacter: string | null = this.nextChar()): LispValue {\n // Following the original: throws TypeError on .has when inputs is undefined.\n const inputs = this.states.get(this.state) as Map<string, NextState>;\n\n // Following the original: throws TypeError on codePointAt when aCharacter is null.\n const codePoint = (aCharacter as string).codePointAt(0) ?? 0;\n const aNumber = inputs.has(String(codePoint))\n ? (inputs.get(String(codePoint)) as NextState).next(this)\n : (inputs.get(String(128)) as NextState).next(this);\n\n if (aNumber < 0) {\n throw new ParseError(SYNTAX_ERROR);\n }\n this.state = aNumber;\n\n return this.token;\n }\n\n /**\n * Returns the next character to be parsed from the input string.\n * @return the next character, or null at end of input\n */\n nextChar(): string | null {\n let aCharacter: string | null = null;\n try {\n const aNumber = (this.stream.next().value as string | undefined)?.codePointAt(0) ?? -1;\n if (aNumber >= 0) {\n aCharacter = String.fromCodePoint(aNumber);\n }\n } catch {\n throw new ParseError('Read Error!');\n }\n\n let count = 0;\n while (count < PEEKCOUNT) {\n this.nexts[count] = this.nexts[count + 1];\n count++;\n }\n this.nexts[count] = aCharacter;\n\n return this.nexts[0];\n }\n\n /**\n * Determines and returns the next token.\n * @return the next parsed token\n */\n nextToken(): LispValue {\n this.token = null;\n let token: LispValue = null;\n\n while (!this.atEnd()) {\n if (this.state === 0 && token != null) {\n break;\n }\n token = this.input();\n }\n if (this.atEnd() && this.state !== 0) {\n throw new ParseError(SYNTAX_ERROR);\n }\n this.tokenString = '';\n\n return token;\n }\n\n /**\n * Instantiates and returns a NextState.\n * @param aNumber the fallback state number (or null)\n * @param aString the parser method name (or null)\n * @return the new NextState\n */\n nextState(aNumber: number | null, aString: string | null): NextState {\n return new NextState(aNumber, aString);\n }\n\n /**\n * Parses the given string and returns the result.\n * @param aString the source string\n * @return the parsed value\n */\n static parse(aString: string): LispValue {\n return new Parser(aString).nextToken();\n }\n\n /**\n * Returns the next character if one exists.\n * @param aNumber 1-based offset into the look-ahead buffer\n * @return the character at that offset, or null if not present\n */\n peekChar(aNumber: number = 1): string | null {\n if (aNumber > this.nexts.length) {\n throw new ParseError('Read Error!');\n }\n return this.nexts[aNumber];\n }\n\n /**\n * Concatenates characters; invoked from NextState.\n * @return null\n */\n concat(): null {\n this.concatCharacter();\n return null;\n }\n\n /**\n * Concatenates the current character after translating common escape sequences\n * (`\\n`, `\\t`, `\\r`, `\\\\`, `\\\"`) into their actual characters. Invoked from NextState\n * inside a string literal after a backslash. Unknown escapes pass through as the\n * literal character (e.g. `\\x` becomes `x`).\n * @return null\n */\n escapeConcat(): null {\n const c = String(this.nexts[0]);\n const map: Record<string, string> = {\n n: '\\n',\n t: '\\t',\n r: '\\r',\n '\\\\': '\\\\',\n '\"': '\"',\n };\n this.tokenString = this.tokenString.concat(map[c] ?? c);\n return null;\n }\n\n /**\n * Returns the token number for a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return the next state number (3, or 0 when the literal is complete)\n */\n doubleToken(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToDouble();\n return 0;\n }\n\n return 3;\n }\n\n /**\n * Returns the token number for a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return the next state number (5, or 0 when the literal is complete)\n */\n doubleTokenAUX(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToDouble();\n return 0;\n }\n\n return 5;\n }\n\n /**\n * Returns the token number for a Number-type (integer: pseudo-Integer); invoked from NextState.\n * @return the next state number (2, or 0 when the literal is complete)\n */\n integerToken(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToInteger();\n return 0;\n }\n\n return 2;\n }\n\n /**\n * Converts the token into a list (Cons) and returns the token number for a list (Cons); invoked from NextState.\n * @return 0\n */\n parseList(): number {\n this.skippingSpaces();\n if (this.rightParen()) {\n this.nextChar();\n this.token = Cons.nil;\n } else {\n this.token = this.parseListAUX();\n }\n\n return 0;\n }\n\n /**\n * Helper that converts the token into a list (Cons); invoked from NextState.\n * @return the parsed Cons (or its cdr in dotted-pair form)\n */\n parseListAUX(): LispValue {\n this.skippingSpaces();\n if (this.peekChar() === ';') {\n while (this.peekChar() !== '\\n' && this.peekChar() != null) {\n this.nextChar();\n }\n this.nextChar();\n this.skippingSpaces();\n }\n if (this.rightParen()) {\n this.nextChar();\n return Cons.nil;\n } else if (this.peekChar() === '.') {\n this.nextChar();\n this.state = 0;\n const cdr = this.nextToken();\n this.skippingSpaces();\n if (!this.rightParen()) {\n throw new ParseError(SYNTAX_ERROR);\n }\n this.nextChar();\n\n return cdr;\n } else {\n this.state = 0;\n return new Cons(this.nextToken(), this.parseListAUX());\n }\n }\n\n /**\n * Recognizes a quote, wraps the token into a list (Cons), and returns the token number; invoked from NextState.\n * @return 0\n */\n quote(): number {\n const anObject = new Cons(this.nextToken(), Cons.nil);\n this.token = new Cons(InterpretedSymbol.of('quote'), anObject);\n\n return 0;\n }\n\n /**\n * Returns the token number for a quote or for a 0-origin String-type (pseudo-Character); invoked from NextState.\n * @return the next state number\n */\n quoteOrChar(): number {\n let aNumber = this.peekChar() === '\\\\' ? 3 : 2;\n aNumber = this.peekChar(aNumber) === \"'\" ? 11 : this.quote();\n\n return aNumber;\n }\n\n /**\n * Detects a right parenthesis (')', ']', '}') and returns the result; invoked from NextState.\n * @return true when the next character is any right paren\n */\n rightParen(): boolean {\n return this.peekChar() === ')' || this.peekChar() === ']' || this.peekChar() === '}';\n }\n\n /**\n * Returns the token number for a sign symbol ('+', '-'); invoked from NextState.\n * @return the next state number (7, or 0 when the literal is complete)\n */\n sign(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToSymbol();\n return 0;\n }\n return 7;\n }\n\n /**\n * Skips whitespace; invoked from NextState.\n * @return null\n */\n skippingSpaces(): null {\n while (\n this.nexts[1] === String.fromCodePoint(9) ||\n this.nexts[1] === String.fromCodePoint(10) ||\n this.nexts[1] === String.fromCodePoint(11) ||\n this.nexts[1] === String.fromCodePoint(12) ||\n this.nexts[1] === String.fromCodePoint(13) ||\n this.nexts[1] === String.fromCodePoint(32)\n ) {\n this.nextChar();\n }\n\n return null;\n }\n\n /**\n * Returns the token number for an InterpretedSymbol; invoked from NextState.\n * @return the next state number (8, or 0 when the literal is complete)\n */\n symbolToken(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToSymbol();\n return 0;\n }\n\n return 8;\n }\n\n /**\n * Converts the token into a 0-origin String-type (pseudo-Character); invoked from NextState.\n * @return null\n */\n tokenToCharacter(): null {\n this.token = this.tokenString.charAt(0);\n return null;\n }\n\n /**\n * Converts the token into a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return null\n */\n tokenToDouble(): null {\n this.token = Number(this.tokenString);\n return null;\n }\n\n /**\n * Converts the token into a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return null\n */\n tokenToDoubleAUX(): null {\n this.concat();\n this.token = Number(this.tokenString);\n return null;\n }\n\n /**\n * Converts the token into a Number-type (integer: pseudo-Integer); invoked from NextState.\n * @return null\n */\n tokenToInteger(): null {\n const aCharacter = this.tokenString[0];\n if (aCharacter === '+') {\n this.tokenString = this.tokenString.slice(1);\n }\n this.token = Number(this.tokenString);\n return null;\n }\n\n /**\n * Converts the token into a String-type; invoked from NextState.\n * @return null\n */\n tokenToString(): null {\n this.token = this.tokenString;\n return null;\n }\n\n /**\n * Converts the token into an InterpretedSymbol; invoked from NextState.\n * @return null\n */\n tokenToSymbol(): null {\n this.token = InterpretedSymbol.of(this.tokenString);\n if (this.token === InterpretedSymbol.of('nil')) {\n this.token = Cons.nil;\n }\n return null;\n }\n\n /**\n * Builds the lookup table that maps character codes to their corresponding methods (tokens).\n * @return null\n */\n initializeStateTransitionTable(): null {\n let aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 8))\n aTable.set(String(index), this.nextState(-1, null));\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, null));\n for (const index of IntStream.rangeClosed(14, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(32), this.nextState(0, null));\n aTable.set(String(33), this.nextState(8, 'symbolToken'));\n aTable.set(String(34), this.nextState(9, null));\n aTable.set(String(35), this.nextState(8, 'symbolToken'));\n aTable.set(String(36), this.nextState(8, 'symbolToken'));\n aTable.set(String(37), this.nextState(8, 'symbolToken'));\n aTable.set(String(38), this.nextState(8, 'symbolToken'));\n aTable.set(String(39), this.nextState(-1, 'quoteOrChar'));\n aTable.set(String(40), this.nextState(-1, 'parseList'));\n aTable.set(String(41), this.nextState(-1, null));\n aTable.set(String(42), this.nextState(8, 'symbolToken'));\n aTable.set(String(43), this.nextState(7, 'sign'));\n aTable.set(String(44), this.nextState(8, 'symbolToken'));\n aTable.set(String(45), this.nextState(7, 'sign'));\n aTable.set(String(46), this.nextState(-1, null));\n aTable.set(String(47), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(2, 'integerToken'));\n for (const index of IntStream.rangeClosed(58, 90))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(59), this.nextState(1, null));\n aTable.set(String(91), this.nextState(-1, 'parseList'));\n aTable.set(String(92), this.nextState(-1, null));\n aTable.set(String(93), this.nextState(-1, null));\n aTable.set(String(94), this.nextState(8, 'symbolToken'));\n aTable.set(String(95), this.nextState(8, 'symbolToken'));\n aTable.set(String(96), this.nextState(0, 'quote'));\n for (const index of IntStream.rangeClosed(97, 122))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(123), this.nextState(-1, 'parseList'));\n aTable.set(String(124), this.nextState(8, 'symbolToken'));\n aTable.set(String(125), this.nextState(-1, null));\n aTable.set(String(126), this.nextState(8, 'symbolToken'));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(0, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 8))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(10), this.nextState(0, null));\n aTable.set(String(13), this.nextState(0, null));\n for (const index of IntStream.rangeClosed(14, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(1, null));\n this.states.set(1, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToInteger'));\n aTable.set(String(32), this.nextState(0, 'tokenToInteger'));\n // `+` / `-` after a digit are not numeric continuations (exponent sign is\n // handled in state 4 after E/e). Route them into the symbol state so that\n // forms like `1+` / `1-` / `1+2` parse as the symbols \"1+\" / \"1-\" / \"1+2\".\n aTable.set(String(43), this.nextState(8, 'symbolToken'));\n aTable.set(String(45), this.nextState(8, 'symbolToken'));\n aTable.set(String(46), this.nextState(3, 'doubleToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(2, 'integerToken'));\n aTable.set(String(69), this.nextState(4, 'concat'));\n aTable.set(String(101), this.nextState(4, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(2, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToDouble'));\n aTable.set(String(32), this.nextState(0, 'tokenToDouble'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(3, 'doubleToken'));\n aTable.set(String(68), this.nextState(0, 'tokenToDoubleAUX'));\n aTable.set(String(69), this.nextState(4, 'concat'));\n aTable.set(String(100), this.nextState(0, 'tokenToDoubleAUX'));\n aTable.set(String(101), this.nextState(4, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(3, aTable);\n\n aTable = new Map<string, NextState>();\n aTable.set(String(43), this.nextState(6, 'concat'));\n aTable.set(String(45), this.nextState(6, 'concat'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(5, 'doubleTokenAUX'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(4, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToDouble'));\n aTable.set(String(32), this.nextState(0, 'tokenToDouble'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(5, 'doubleTokenAUX'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(5, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(5, 'doubleTokenAUX'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(6, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(32), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(33), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(35, 38))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(42, 45))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(47), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(2, 'integerToken'));\n for (const index of IntStream.rangeClosed(58, 90))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(94), this.nextState(8, 'symbolToken'));\n aTable.set(String(95), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(97, 122))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(124), this.nextState(8, 'symbolToken'));\n aTable.set(String(126), this.nextState(8, 'symbolToken'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(7, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(32), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(33), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(35, 38))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(42, 45))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(47), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(58, 90))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(94), this.nextState(8, 'symbolToken'));\n aTable.set(String(95), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(97, 122))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(124), this.nextState(8, 'symbolToken'));\n aTable.set(String(126), this.nextState(8, 'symbolToken'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(8, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(34), this.nextState(0, 'tokenToString'));\n aTable.set(String(92), this.nextState(10, null));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(9, 'concat'));\n this.states.set(9, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(9, 'escapeConcat'));\n this.states.set(10, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(32, 38))\n aTable.set(String(index), this.nextState(12, 'concat'));\n for (const index of IntStream.rangeClosed(40, 91))\n aTable.set(String(index), this.nextState(12, 'concat'));\n aTable.set(String(92), this.nextState(13, null));\n for (const index of IntStream.rangeClosed(93, 126))\n aTable.set(String(index), this.nextState(12, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(11, aTable);\n\n aTable = new Map<string, NextState>();\n aTable.set(String(39), this.nextState(0, 'tokenToCharacter'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(12, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(32, 38))\n aTable.set(String(index), this.nextState(12, 'concat'));\n for (const index of IntStream.rangeClosed(40, 126))\n aTable.set(String(index), this.nextState(12, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(13, aTable);\n\n return null;\n }\n}\n","import { InterpretedSymbol } from '../InterpretedSymbol/index.js';\nimport { Loop } from '../Loop/index.js';\nimport { Parser } from '../../parser/Parser/index.js';\nimport { Table } from '../../runtime/Table/index.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Class that mimics a Cons cell.\n * @author Keisuke Ikeda\n * @this {Cons}\n */\nexport class Cons extends Object {\n /**\n * The shared empty-list sentinel. A Cons whose car and cdr are both itself, representing Lisp `nil`.\n */\n static readonly nil: Cons = new Cons();\n\n /**\n * The head element of this Cons cell.\n */\n car: LispValue;\n /**\n * The tail of this Cons cell (typically another Cons or nil).\n */\n cdr: LispValue;\n\n /**\n * Constructor.\n * @constructor\n * @param car the car; defaults to nil when no argument is given.\n * @param cdr the cdr; defaults to nil when no argument is given.\n */\n constructor(car: LispValue = Cons.nil, cdr: LispValue = Cons.nil) {\n super();\n this.car = car;\n this.cdr = cdr;\n }\n\n /**\n * Appends the given element to the end of this Cons.\n * @param anObject the object to append\n * @return the Cons with the element appended\n */\n add(anObject: LispValue): this {\n const aCons = new Cons(anObject, Cons.nil);\n return this.nconc(aCons);\n }\n\n /**\n * Clones this Cons and returns the clone.\n * @return the cloned Cons\n */\n clone(): Cons {\n return new Cons(Cons.cloneValue(this.car), Cons.cloneValue(this.cdr));\n }\n\n /**\n * Clones the given value (a Cons element) and returns the clone.\n * @param value a Cons element\n * @return the cloned element\n */\n static cloneValue(value: LispValue): LispValue {\n if (Cons.isCons(value)) {\n return value.clone();\n }\n if (Cons.isNil(value)) {\n return Cons.nil;\n }\n if (Cons.isNumber(value)) {\n return value;\n }\n if (Cons.isString(value)) {\n return value;\n }\n if (Cons.isSymbol(value)) {\n return value;\n }\n if (Cons.isTable(value)) {\n return value;\n }\n return value;\n }\n\n /**\n * Returns whether this Cons equals the given object.\n * @param anObject the object to compare against\n * @return a boolean\n */\n equals(anObject: LispValue): boolean {\n if (Cons.isCons(anObject)) {\n return this.equalsAUX(this, anObject);\n }\n return false;\n }\n\n /**\n * Returns whether both arguments are Cons cells and are equal.\n * @param left the object to compare\n * @param right the object to compare\n * @return a boolean\n */\n equalsAUX(left: LispValue, right: LispValue): boolean {\n if (left === right) {\n return true;\n }\n if (!(Cons.isCons(left) && Cons.isCons(right))) {\n return false;\n }\n if (this.equalsAUX(left.car, right.car)) {\n return this.equalsAUX(left.cdr, right.cdr);\n }\n\n return false;\n }\n\n /**\n * Returns whether the given argument is an Atom.\n */\n static isAtom(anObject: LispValue): boolean {\n return Cons.isNotCons(anObject);\n }\n\n /**\n * Returns whether the given argument is a Cons.\n */\n static isCons(anObject: LispValue): anObject is Cons {\n return anObject !== Cons.nil && anObject instanceof Cons;\n }\n\n /**\n * Returns whether the given argument is a List.\n */\n static isList(anObject: LispValue): boolean {\n return Cons.isNil(anObject) || Cons.isCons(anObject);\n }\n\n /**\n * Returns whether the given argument is Nil.\n */\n static isNil(anObject: LispValue): boolean {\n return anObject === Cons.nil;\n }\n\n /**\n * Returns whether the given argument is not a Cons.\n */\n static isNotCons(anObject: LispValue): boolean {\n return !Cons.isCons(anObject);\n }\n\n /**\n * Returns whether the given argument is not a List.\n */\n static isNotList(anObject: LispValue): boolean {\n return !Cons.isList(anObject);\n }\n\n /**\n * Returns whether the given argument is not Nil.\n */\n static isNotNil(anObject: LispValue): boolean {\n return !Cons.isNil(anObject);\n }\n\n /**\n * Returns whether the given argument is not an interpreted symbol.\n */\n static isNotSymbol(anObject: LispValue): boolean {\n return !Cons.isSymbol(anObject);\n }\n\n /**\n * Returns whether the given argument is a number.\n */\n static isNumber(anObject: LispValue): anObject is number {\n return typeof anObject === 'number';\n }\n\n /**\n * Returns whether the given argument is a string.\n */\n static isString(anObject: LispValue): anObject is string {\n return typeof anObject === 'string';\n }\n\n /**\n * Returns whether the given argument is an interpreted symbol.\n */\n static isSymbol(anObject: LispValue): anObject is InterpretedSymbol {\n return anObject instanceof InterpretedSymbol;\n }\n\n /**\n * Returns whether the given argument is an environment.\n */\n static isTable(anObject: LispValue): anObject is Table {\n return anObject instanceof Table;\n }\n\n /**\n * Returns the last cell of this Cons.\n * @return this Cons's last cell\n */\n last(): Cons {\n let theCons: Cons = new Cons(Cons.nil, this);\n let aCons: Cons = this;\n\n while (Cons.isCons(aCons)) {\n if (!Cons.isCons(aCons.cdr)) {\n break;\n }\n theCons = theCons.cdr as Cons;\n aCons = aCons.cdr;\n }\n\n return aCons;\n }\n\n /**\n * Returns an iterator over this Cons.\n * @return an iterator over this Cons\n */\n loop(): Loop {\n return new Loop(this);\n }\n\n /**\n * Returns the length (depth) of this Cons.\n * @return the length (depth) of this Cons\n */\n length(): number {\n let count = 0;\n let aCons: LispValue = this;\n\n while (Cons.isCons(aCons)) {\n count++;\n aCons = aCons.cdr;\n }\n\n return count;\n }\n\n /**\n * Concatenates the given Cons and returns this Cons.\n * @param aCons the Cons to concatenate\n * @return this Cons\n */\n nconc(aCons: Cons): this {\n this.last().setCdr(aCons);\n return this;\n }\n\n /**\n * Returns the nth element of this Cons.\n * @param aNumber the index to retrieve\n * @return the element at the given index\n */\n nth(aNumber: number): LispValue {\n if (aNumber <= 0) {\n return Cons.nil;\n }\n let count = 1;\n let aCons: LispValue = this;\n while (Cons.isCons(aCons)) {\n if (count >= aNumber) {\n return aCons.car;\n }\n count++;\n aCons = aCons.cdr;\n }\n\n return Cons.nil;\n }\n\n /**\n * Lexes the given string into a Cons and returns it.\n * @param aString the string to lex\n */\n static parse(aString: string): LispValue {\n return Parser.parse(aString);\n }\n\n /**\n * Sets the car.\n */\n setCar(anObject: LispValue): null {\n this.car = anObject;\n return null;\n }\n\n /**\n * Sets the cdr.\n */\n setCdr(anObject: LispValue): null {\n this.cdr = anObject;\n return null;\n }\n\n /**\n * Sets both the car and the cdr.\n */\n setCons(car: LispValue, cdr: LispValue): this {\n this.car = car;\n this.cdr = cdr;\n return this;\n }\n\n /**\n * Returns a formatted string representation of this Cons.\n */\n override toString(): string {\n let aString = '';\n if (Cons.isNil(this)) {\n aString += Cons.toString(Cons.nil);\n } else {\n aString += '(' + Cons.toString(this.car);\n\n if (Cons.isNil(this.cdr)) {\n aString += ')';\n } else if (this.cdr instanceof Cons) {\n let aCons: LispValue = this.cdr;\n while (Cons.isCons(aCons)) {\n const head = aCons.car;\n if (!(head instanceof Table)) {\n aString += ' ' + Cons.toString(head);\n }\n aCons = aCons.cdr;\n }\n aString += Cons.isNil(aCons) ? ')' : ' . ' + Cons.toString(aCons) + ')';\n } else {\n aString += ' . ' + Cons.toString(this.cdr) + ')';\n }\n }\n\n return aString;\n }\n\n /**\n * Returns a formatted string representation of the given object.\n * @param anObject the object to format\n */\n static override toString(anObject: LispValue): string {\n return Cons.isNil(anObject) ? 'nil' : (anObject as { toString(): string }).toString();\n }\n}\n","import { KeiLispError } from '../KeiLispError/index.js';\n\n/**\n * @class\n * @classdesc Error raised when evaluation or application of a Lisp expression fails (type mismatch, unbound symbol, arity error, etc.). Subclass of `KeiLispError`.\n * @author Keisuke Ikeda\n * @this {EvalError}\n */\nexport class EvalError extends KeiLispError {\n /**\n * Constructor.\n * @constructor\n * @param message human-readable diagnostic message\n */\n constructor(message: string) {\n super(message);\n this.name = 'EvalError';\n }\n}\n","import type { LispValue } from '../types/index.js';\n\n/**\n * User-facing diagnostic message templates emitted by the interpreter.\n * Centralizing them keeps wording consistent and makes future i18n trivial.\n */\n\n/** Builtin/special-form type-mismatch: `Can not apply \"<fn>\" to \"<value>\"`. */\nexport const cannotApply = (fn: string, value: LispValue): string =>\n `Can not apply \"${fn}\" to \"${String(value)}\"`;\n\n/** Symbol argument validation: `\"<value>\" is not symbol`. */\nexport const notSymbol = (value: LispValue): string => `\"${String(value)}\" is not symbol`;\n\n/** Unbound symbol lookup: `I could find no variable binding for <symbol>`. */\nexport const noBinding = (symbol: LispValue): string =>\n `I could find no variable binding for ${String(symbol)}`;\n\n/** Unknown procedure: `I could find no procedure description for <procedure>`. */\nexport const noProcedure = (procedure: LispValue): string =>\n `I could find no procedure description for ${String(procedure)}`;\n\n/** Positional argument validation: `arguments N is not symbol.`. */\nexport const argumentNotSymbol = (position: number): string =>\n `arguments ${String(position)} is not symbol.`;\n\n/** Multi-list arity mismatch. */\nexport const SIZES_DO_NOT_MATCH = 'sizes do not match.';\n\n/** Intentional ungrammatical wording: kept as-is for backward compatibility of error messages. */\nexport const SIZE_DO_NOT_MATCH = 'size do not match.';\n","import { Cons } from '../../value/Cons/index.js';\nimport { EvalError } from '../../errors/EvalError/index.js';\nimport { Evaluator } from '../Evaluator/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport {\n cannotApply,\n noProcedure,\n SIZE_DO_NOT_MATCH,\n SIZES_DO_NOT_MATCH,\n} from '../../constants/index.js';\nimport type { StreamManager } from '../StreamManager/index.js';\nimport { Table } from '../Table/index.js';\nimport type { KeiLispPlugin } from '../../plugin/types.js';\nimport type { LispValue } from '../../types/index.js';\n\nconst SELECT_PRINT_FUNCTION_NOT_DEFINED = 'selectPrintFunction is not defined';\n\n// Splits a string into an array of Unicode code points. Intentional choice over\n// .length / charAt, which would split surrogate pairs (emoji etc.) into halves.\n// eslint-disable-next-line @typescript-eslint/no-misused-spread\nconst toCodePoints = (s: string): string[] => [...s];\n\n/**\n * Class that mimics Lisp's universal function Apply.\n * @class\n * @classdesc\n * @author Keisuke Ikeda\n * @this {Applier}\n */\nexport class Applier extends Object {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of the Applier method that implements it.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = Applier.setup();\n static #generateNumber = 0;\n\n /**\n * The environment (variable bindings) used while applying procedures.\n */\n environment: Table;\n /**\n * The stream manager used for I/O and spy output.\n */\n streamManager: StreamManager;\n /**\n * The current recursion depth, used for spy indentation.\n */\n depth: number;\n /**\n * Registered plugins forwarded back into Evaluator on recursive evaluation (e.g. `entrustEvaluator`).\n */\n plugins: KeiLispPlugin[];\n\n /**\n * Constructor.\n * @constructor\n * @param aTable the parent environment to extend\n * @param aStreamManager the stream manager for I/O\n * @param aNumber the initial recursion depth\n * @param plugins the plugin chain to forward when re-entering the Evaluator\n */\n constructor(\n aTable: Table,\n aStreamManager: StreamManager,\n aNumber: number,\n plugins: KeiLispPlugin[] = [],\n ) {\n super();\n this.environment = new Table(aTable);\n this.streamManager = aStreamManager;\n this.depth = aNumber;\n this.plugins = plugins;\n }\n\n /**\n * Implementation of the Lisp `abs` function. Returns the absolute value of the given number.\n * @param args the argument Cons containing the target number\n * @return the absolute value\n */\n abs(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.abs(args.car);\n }\n throw new EvalError(cannotApply('abs', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `+` / `add` function. Returns the sum of the given numbers.\n * @param args the argument Cons containing the numbers to add\n * @return the sum of the arguments\n */\n add(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.add_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('add', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the sum starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to add\n * @return the sum of init and all remaining numbers\n */\n add_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result + each;\n } else {\n throw new EvalError(cannotApply('add', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Static entry point that instantiates an Applier and applies the given procedure to the arguments.\n * @param procedure the procedure to apply (a symbol or a lambda Cons)\n * @param args the argument list\n * @param environment the environment to use\n * @param aStreamManager the stream manager for I/O\n * @param depth the current recursion depth\n * @param plugins the plugin chain to forward when re-entering the Evaluator\n * @return the result of applying the procedure\n */\n static override apply(\n procedure: LispValue,\n args: LispValue,\n environment: Table,\n aStreamManager: StreamManager,\n depth: number,\n plugins: KeiLispPlugin[] = [],\n ): LispValue {\n return new Applier(environment, aStreamManager, depth, plugins).apply(procedure, args);\n }\n\n /**\n * Applies the given procedure to the given arguments.\n * @param procedure the procedure to apply (a symbol or a lambda Cons)\n * @param args the argument list\n * @return the result of applying the procedure\n */\n apply(procedure: LispValue, args: LispValue): LispValue {\n if (Cons.isSymbol(procedure)) {\n return this.selectProcedure(procedure, args);\n }\n return this.entrustEvaluator(procedure, args);\n }\n\n /**\n * Implementation of the Lisp `assoc` function. Looks up an association in an association list.\n * @param args the argument Cons containing the key and the association list\n * @return the matching pair, or nil if no match was found\n */\n assoc(args: Cons): LispValue {\n const target = args.car;\n\n if (Cons.isNotCons(args.nth(2))) {\n return Cons.nil;\n }\n const aCons = args.nth(2) as Cons;\n\n for (const each of aCons.loop()) {\n if (Cons.isNotCons(each)) {\n throw new EvalError(cannotApply('assoc', each));\n }\n const eachCons = each as Cons;\n const key = eachCons.car;\n if (this.equal_(new Cons(target, new Cons(key, Cons.nil))) === InterpretedSymbol.of('t')) {\n return eachCons;\n }\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `atom` predicate. Returns t if the argument is an atom, otherwise nil.\n * @param args the argument Cons containing the value to test\n * @return t if atom, nil otherwise\n */\n atom_(args: Cons): LispValue {\n if (Cons.isAtom(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Binds the given parameter symbols to the corresponding argument values in this environment.\n * @param parameter the parameter list (a Cons of symbols, possibly dotted)\n * @param args the argument list to bind to the parameters\n */\n binding(parameter: LispValue, args: LispValue): null {\n if (Cons.isNil(parameter)) {\n return null;\n }\n let aCons = parameter as Cons;\n let theCons = args as Cons;\n\n while (Cons.isNotNil(aCons)) {\n try {\n this.environment.set(aCons.car, theCons.car);\n } catch {\n throw new EvalError(SIZES_DO_NOT_MATCH);\n return null;\n }\n\n if (Cons.isNotCons(aCons.cdr)) {\n break;\n }\n aCons = aCons.cdr as Cons;\n theCons = theCons.cdr as Cons;\n }\n\n if (Cons.isNotList(aCons.cdr) && Cons.isNotNil(aCons.cdr)) {\n try {\n this.environment.set(aCons.cdr, theCons.cdr);\n } catch {\n throw new EvalError(SIZES_DO_NOT_MATCH);\n return null;\n }\n } else if (Cons.isNotNil(aCons.cdr)) {\n // Following the original: the source code references the undefined variable `aList`,\n // so it throws ReferenceError (the intended Error message is never reached).\n throw new ReferenceError('aList is not defined');\n }\n\n return null;\n }\n\n /**\n * Invokes the built-in method associated with the given procedure symbol.\n * @param procedure the symbol naming the built-in function\n * @param args the argument list\n * @return the result of the built-in function\n */\n buildInFunction(procedure: InterpretedSymbol, args: LispValue): LispValue {\n if (this.isSpy(procedure)) {\n this.spyPrint(this.streamManager.spyStream(procedure), new Cons(procedure, args).toString());\n this.setDepth(this.depth + 1);\n }\n\n const methodName = Applier.buildInFunctions.get(procedure) as string;\n\n const target = this as unknown as Record<string, unknown>;\n const fn = target[methodName];\n if (typeof fn !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n const answer = (fn as (a: LispValue) => LispValue).apply(target, [args]);\n\n if (this.isSpy(procedure)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(procedure),\n String(answer) + ' <== ' + new Cons(procedure, args).toString(),\n );\n }\n\n return answer;\n }\n\n /**\n * Implementation of the Lisp `car` function. Returns the car of the given Cons.\n * @param args the argument Cons containing the target Cons\n * @return the car of the target\n */\n car(args: Cons): LispValue {\n return (args.car as Cons).car;\n }\n\n /**\n * Implementation of the Lisp `cdr` function. Returns the cdr of the given Cons.\n * @param args the argument Cons containing the target Cons\n * @return the cdr of the target\n */\n cdr(args: Cons): LispValue {\n return (args.car as Cons).cdr;\n }\n\n /**\n * Implementation of the Lisp `characterp` predicate. Returns t if the argument is a single-character string.\n * @param args the argument Cons containing the value to test\n * @return t if a character, nil otherwise\n */\n character_(args: Cons): LispValue {\n if (Cons.isString(args.car) && args.car.length === 1) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `cons` function. Constructs a new Cons from the given car and cdr.\n * @param args the argument Cons containing the car and cdr\n * @return the newly constructed Cons\n */\n cons(args: Cons): LispValue {\n return new Cons(args.car, args.nth(2));\n }\n\n /**\n * Implementation of the Lisp `consp` predicate. Returns t if the argument is a Cons, otherwise nil.\n * @param args the argument Cons containing the value to test\n * @return t if a Cons, nil otherwise\n */\n cons_(args: Cons): LispValue {\n if (Cons.isCons(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `copy` function. Returns a deep clone of the given value.\n * @param args the argument Cons containing the value to copy\n * @return the cloned value\n */\n copy(args: Cons): LispValue {\n return Cons.cloneValue(args.car);\n }\n\n /**\n * Implementation of the Lisp `cos` function. Returns the cosine of the given number.\n * @param args the argument Cons containing the angle in radians\n * @return the cosine of the argument\n */\n cos(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.cos(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Implementation of the Lisp `/` / `divide` function. Returns the quotient of the given numbers.\n * @param args the argument Cons containing the numbers to divide\n * @return the quotient of the arguments\n */\n divide(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.divide_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('divide', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the quotient starting from an initial number and the remaining argument list.\n * @param init the initial number (numerator)\n * @param args the remaining numbers to divide by\n * @return the quotient of init divided by all remaining numbers\n */\n divide_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result / each;\n } else {\n throw new EvalError(cannotApply('divide', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Delegates evaluation of a lambda body to the Evaluator after binding its parameters.\n * @param procedure the lambda Cons to apply\n * @param args the argument list to bind to the lambda's parameters\n * @return the result of evaluating the lambda body\n */\n entrustEvaluator(procedure: LispValue, args: LispValue): LispValue {\n let anObject: LispValue = Cons.nil;\n let aCons = (procedure as Cons).cdr as Cons;\n this.binding(aCons.car, args);\n aCons = aCons.cdr as Cons;\n\n for (const each of aCons.loop()) {\n if (each instanceof Table) {\n break;\n }\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n\n // NOTE: Implements Common Lisp's eq as JS strict identity (===). Symbols are eq because\n // InterpretedSymbol.of interns by name; numbers / strings are eq because JS primitive\n // equality is by value; Cons / Table / other objects are eq only when they are the same\n // reference. Edge cases: NaN is never eq to itself (matches IEEE 754 and most CL\n // implementations); +0 and -0 are eq (CL leaves this implementation-defined).\n /**\n * Implementation of the Lisp `eq` predicate. Returns t when both arguments are identical (JS `===`).\n * @param args the argument Cons containing the two values to compare\n * @return t when identical, nil otherwise\n */\n eq_(args: Cons): LispValue {\n const first = args.car;\n const second = args.nth(2);\n if (first === second) {\n return InterpretedSymbol.of('t');\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `equal` / `=` predicate. Returns t when both arguments are structurally equal.\n * @param args the argument Cons containing the two values to compare\n * @return t when equal, nil otherwise\n */\n equal_(args: Cons): LispValue {\n const first = args.car;\n const second = args.nth(2);\n if (this.eq_(args) === InterpretedSymbol.of('t')) {\n return InterpretedSymbol.of('t');\n }\n if (Cons.isCons(first) && Cons.isCons(second)) {\n if (first.equals(second)) {\n return InterpretedSymbol.of('t');\n }\n if (second.equals(first)) {\n return InterpretedSymbol.of('t');\n }\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `exp` function. Returns e raised to the given power.\n * @param args the argument Cons containing the exponent\n * @return e raised to the given power\n */\n exp(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.exp(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Implementation of the Lisp `format` function. Writes a formatted string to standard output.\n * @param args the argument Cons containing the format string followed by its arguments\n * @return nil\n */\n format(args: Cons): LispValue {\n if (!Cons.isString(args.car)) {\n throw new EvalError(cannotApply('format', args.car));\n }\n const aCons = args.cdr;\n const format = this.format_AUX(args.car, aCons);\n process.stdout.write(String(format));\n\n return Cons.nil;\n }\n\n /**\n * Helper that expands the given format string with the supplied arguments.\n * @param format the format string containing directives such as `~a`, `~%`, and width specifiers\n * @param aCons the argument list to interpolate into the directives\n * @return the formatted string\n */\n format_AUX(format: string, aCons: LispValue): string | undefined {\n let theCons: LispValue = aCons;\n let index = 0;\n let state = 0;\n let buffer = '';\n let token = '';\n\n while (index < format.length) {\n const aCharacter = format[index];\n switch (state) {\n case 0: {\n if (aCharacter === '~') {\n state = 1;\n } else {\n buffer += aCharacter;\n }\n\n break;\n }\n case 1: {\n switch (aCharacter) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n token += aCharacter;\n state = 2;\n break;\n }\n case 'a': {\n // Following the original: calls theCons.car.toString() directly (throws if null).\n buffer += ((theCons as Cons).car as { toString(): string }).toString();\n theCons = (theCons as Cons).cdr;\n state = 0;\n break;\n }\n case '%': {\n buffer += '\\n';\n state = 0;\n break;\n }\n case '-': {\n state = 3;\n break;\n }\n default: {\n buffer += '~';\n buffer += aCharacter;\n state = 0;\n }\n }\n\n break;\n }\n case 2: {\n switch (aCharacter) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n token += aCharacter;\n state = 2;\n break;\n }\n case 'a': {\n const size = Number(token);\n token = '';\n if (Cons.isNil(theCons)) {\n throw new EvalError(SIZE_DO_NOT_MATCH);\n return undefined;\n }\n let value: string = ((theCons as Cons).car as { toString(): string }).toString();\n theCons = (theCons as Cons).cdr;\n while (value.length < size) {\n value += ' ';\n }\n buffer += value;\n state = 0;\n break;\n }\n default: {\n buffer += '~';\n buffer += token + aCharacter;\n token = '';\n state = 0;\n }\n }\n\n break;\n }\n case 3: {\n switch (aCharacter) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n token += aCharacter;\n state = 3;\n break;\n }\n case 'a': {\n const size = Number(token);\n token = '';\n if (Cons.isNil(theCons)) {\n throw new EvalError(SIZE_DO_NOT_MATCH);\n return undefined;\n }\n const value: string = ((theCons as Cons).car as { toString(): string }).toString();\n theCons = (theCons as Cons).cdr;\n let spaces = '';\n while (value.length + spaces.length < size) {\n spaces += ' ';\n }\n buffer += spaces + value;\n state = 0;\n break;\n }\n default: {\n buffer += '~';\n buffer += '-';\n buffer += token + aCharacter;\n token = '';\n state = 0;\n }\n }\n\n break;\n }\n default: {\n throw new EvalError(`unknown format directive: ~${aCharacter}`);\n }\n }\n index++;\n }\n if (Cons.isNotNil(theCons)) {\n throw new EvalError(SIZE_DO_NOT_MATCH);\n return undefined;\n }\n\n return buffer;\n }\n\n // Common Lisp's floatp is a type-tag predicate (integer vs float), but JS has only one\n // numeric type (double). Approximated here as a range check: \"is this number representable\n // in IEEE 32-bit (single-precision) float?\". Revisit if numeric types are split.\n /**\n * Implementation of the Lisp `floatp` predicate. Returns t if the argument is a number representable as IEEE 32-bit float.\n * @param args the argument Cons containing the value to test\n * @return t if a float, nil otherwise\n */\n float_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && -3.4e38 <= args.car && args.car <= 3.4e38) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `gensym` function. Generates a fresh, unique symbol.\n * @return a new, unique InterpretedSymbol\n */\n gensym(): InterpretedSymbol {\n const aSymbol = InterpretedSymbol.of('id' + String(Applier.#generateNumber));\n Applier.incrementGenerateNumber();\n\n return aSymbol;\n }\n\n /**\n * Returns the appropriate stream for the given object.\n * @param anObject the object used to select the stream\n * @return the selected stream\n */\n getStream(anObject: LispValue): unknown {\n if (typeof anObject === 'string') {\n return (process as unknown as { out?: unknown }).out;\n }\n\n return this.streamManager.getStream();\n }\n\n /**\n * Implementation of the Lisp `>` / `greaterThan` predicate. Returns t when arguments are in strictly decreasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is greater than the next, nil otherwise\n */\n greaterThan(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.greaterThan_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('>', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `>` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when strictly decreasing, nil otherwise\n */\n greaterThan_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue > rightValue;\n } else {\n throw new EvalError(cannotApply('>', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `>=` / `greaterThanOrEqual` predicate. Returns t when arguments are in non-increasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is greater than or equal to the next, nil otherwise\n */\n greaterThanOrEqual(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.greaterThanOrEqual_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('>=', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `>=` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when non-increasing, nil otherwise\n */\n greaterThanOrEqual_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue >= rightValue;\n } else {\n throw new EvalError(cannotApply('>=', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Increments the internal counter used by `gensym` to ensure uniqueness.\n */\n static incrementGenerateNumber(): null {\n Applier.#generateNumber++;\n return null;\n }\n\n /**\n * Returns a string of indentation used as a prefix for spy output, based on the current depth.\n * @return the indentation string\n */\n indent(): string {\n let index = 0;\n let aString = '';\n while (index++ < this.depth) {\n aString += '| ';\n }\n\n return aString;\n }\n\n /**\n * Implementation of the Lisp `integerp` predicate. Returns t if the argument is an integer.\n * @param args the argument Cons containing the value to test\n * @return t if an integer, nil otherwise\n */\n integer_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && Number.isInteger(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `evenp` predicate. Returns t if the argument is an even integer.\n * @param args the argument Cons containing the value to test\n * @return t if even, nil otherwise\n */\n even_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && Number.isInteger(args.car) && args.car % 2 === 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `oddp` predicate. Returns t if the argument is an odd integer.\n * @param args the argument Cons containing the value to test\n * @return t if odd, nil otherwise\n */\n odd_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && Number.isInteger(args.car) && args.car % 2 !== 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `zerop` predicate. Returns t if the argument equals zero.\n * @param args the argument Cons containing the value to test\n * @return t if zero, nil otherwise\n */\n zero_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && args.car === 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `plusp` predicate. Returns t if the argument is strictly positive.\n * @param args the argument Cons containing the value to test\n * @return t if positive, nil otherwise\n */\n plus_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && args.car > 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `minusp` predicate. Returns t if the argument is strictly negative.\n * @param args the argument Cons containing the value to test\n * @return t if negative, nil otherwise\n */\n minus_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && args.car < 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `1+` function. Returns the argument incremented by one.\n * @param args the argument Cons containing the target number\n * @return the argument plus one\n */\n oneplus(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return args.car + 1;\n }\n throw new EvalError(cannotApply('1+', args.car));\n }\n\n /**\n * Implementation of the Lisp `1-` function. Returns the argument decremented by one.\n * @param args the argument Cons containing the target number\n * @return the argument minus one\n */\n oneminus(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return args.car - 1;\n }\n throw new EvalError(cannotApply('1-', args.car));\n }\n\n /**\n * Implementation of the Lisp `expt` function. Returns the base raised to the exponent.\n * @param args the argument Cons containing the base followed by the exponent\n * @return base raised to the exponent\n */\n expt(args: Cons): LispValue {\n const base = args.car;\n const exponent = args.nth(2);\n if (Cons.isNumber(base) && Cons.isNumber(exponent)) {\n return Math.pow(base, exponent);\n }\n throw new EvalError(cannotApply('expt', base));\n }\n\n /**\n * Implementation of the Lisp `truncate` function. Returns the integer part of the given number.\n * @param args the argument Cons containing the target number\n * @return the truncated integer\n */\n truncate(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.trunc(args.car);\n }\n throw new EvalError(cannotApply('truncate', args.car));\n }\n\n /**\n * Implementation of the Lisp `floor` function. Returns the largest integer not greater than the given number.\n * @param args the argument Cons containing the target number\n * @return the floor of the argument\n */\n floor(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.floor(args.car);\n }\n throw new EvalError(cannotApply('floor', args.car));\n }\n\n /**\n * Implementation of the Lisp `ceiling` function. Returns the smallest integer not less than the given number.\n * @param args the argument Cons containing the target number\n * @return the ceiling of the argument\n */\n ceiling(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.ceil(args.car);\n }\n throw new EvalError(cannotApply('ceiling', args.car));\n }\n\n /**\n * Implementation of the Lisp `min` function. Returns the minimum of the given numbers.\n * @param args the argument Cons containing the numbers to compare\n * @return the smallest number\n */\n min(args: Cons): LispValue {\n const values: number[] = [];\n for (const each of args.loop()) {\n if (!Cons.isNumber(each)) {\n throw new EvalError(cannotApply('min', each));\n }\n values.push(each);\n }\n if (values.length === 0) {\n throw new EvalError('min requires at least one argument');\n }\n return Math.min(...values);\n }\n\n /**\n * Implementation of the Lisp `max` function. Returns the maximum of the given numbers.\n * @param args the argument Cons containing the numbers to compare\n * @return the largest number\n */\n max(args: Cons): LispValue {\n const values: number[] = [];\n for (const each of args.loop()) {\n if (!Cons.isNumber(each)) {\n throw new EvalError(cannotApply('max', each));\n }\n values.push(each);\n }\n if (values.length === 0) {\n throw new EvalError('max requires at least one argument');\n }\n return Math.max(...values);\n }\n\n /**\n * Implementation of the Lisp `length` function. Returns the length of a list or string.\n * @param args the argument Cons containing the target sequence\n * @return the length of the sequence\n */\n length(args: Cons): LispValue {\n const target = args.car;\n if (Cons.isString(target)) {\n return toCodePoints(target).length;\n }\n if (Cons.isCons(target)) {\n return target.length();\n }\n if (Cons.isNil(target)) {\n return 0;\n }\n throw new EvalError(cannotApply('length', target));\n }\n\n /**\n * Implementation of the Lisp `string-upcase` function. Returns the upper-cased form of the given string.\n * @param args the argument Cons containing the target string\n * @return the upper-cased string\n */\n stringUpcase(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return args.car.toUpperCase();\n }\n throw new EvalError(cannotApply('string-upcase', args.car));\n }\n\n /**\n * Implementation of the Lisp `string-downcase` function. Returns the lower-cased form of the given string.\n * @param args the argument Cons containing the target string\n * @return the lower-cased string\n */\n stringDowncase(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return args.car.toLowerCase();\n }\n throw new EvalError(cannotApply('string-downcase', args.car));\n }\n\n /**\n * Implementation of the Lisp `string-trim` function. Returns the given string with surrounding whitespace removed.\n * @param args the argument Cons containing the target string\n * @return the trimmed string\n */\n stringTrim(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return args.car.trim();\n }\n throw new EvalError(cannotApply('string-trim', args.car));\n }\n\n /**\n * Implementation of the Lisp `substring` function. Returns a portion of the given string between start and end (in code points).\n * @param args the argument Cons containing the target string, start index, and optional end index\n * @return the requested substring\n */\n substring(args: Cons): LispValue {\n const target = args.car;\n const start = args.nth(2);\n const end = args.nth(3);\n if (!Cons.isString(target)) {\n throw new EvalError(cannotApply('substring', target));\n }\n if (!Cons.isNumber(start)) {\n throw new EvalError(cannotApply('substring', start));\n }\n const chars = toCodePoints(target);\n if (Cons.isNil(end)) {\n return chars.slice(start).join('');\n }\n if (!Cons.isNumber(end)) {\n throw new EvalError(cannotApply('substring', end));\n }\n return chars.slice(start, end).join('');\n }\n\n /**\n * Implementation of the Lisp `concatenate` function. Returns the concatenation of all the given strings.\n * @param args the argument Cons containing the strings to concatenate\n * @return the concatenated string\n */\n concatenate(args: Cons): LispValue {\n let result = '';\n for (const each of args.loop()) {\n if (!Cons.isString(each)) {\n throw new EvalError(cannotApply('concatenate', each));\n }\n result += each;\n }\n return result;\n }\n\n /**\n * Implementation of the Lisp `elt` function. Returns the element at the given index of a string or list.\n * @param args the argument Cons containing the target sequence and the index\n * @return the element at the given index\n */\n elt(args: Cons): LispValue {\n const target = args.car;\n const index = args.nth(2);\n if (!Cons.isNumber(index)) {\n throw new EvalError(cannotApply('elt', index));\n }\n if (Cons.isString(target)) {\n const chars = toCodePoints(target);\n if (index < 0 || index >= chars.length) {\n throw new EvalError(`elt: index ${String(index)} out of range`);\n }\n return chars[index];\n }\n if (Cons.isCons(target)) {\n if (index < 0 || index >= target.length()) {\n throw new EvalError(`elt: index ${String(index)} out of range`);\n }\n return target.nth(index + 1);\n }\n throw new EvalError(cannotApply('elt', target));\n }\n\n /**\n * Implementation of the Lisp `subseq` function. Returns a subsequence of a string or list between start and end.\n * @param args the argument Cons containing the target sequence, start index, and optional end index\n * @return the requested subsequence\n */\n subseq(args: Cons): LispValue {\n const target = args.car;\n const start = args.nth(2);\n const end = args.nth(3);\n if (!Cons.isNumber(start)) {\n throw new EvalError(cannotApply('subseq', start));\n }\n if (Cons.isString(target)) {\n const chars = toCodePoints(target);\n if (Cons.isNil(end)) {\n return chars.slice(start).join('');\n }\n if (!Cons.isNumber(end)) {\n throw new EvalError(cannotApply('subseq', end));\n }\n return chars.slice(start, end).join('');\n }\n if (Cons.isCons(target)) {\n const stop = Cons.isNil(end) ? target.length() : (end as number);\n if (!Cons.isNumber(stop)) {\n throw new EvalError(cannotApply('subseq', end));\n }\n let result: Cons = Cons.nil;\n for (let i = stop - 1; i >= start; i--) {\n result = new Cons(target.nth(i + 1), result);\n }\n return result;\n }\n throw new EvalError(cannotApply('subseq', target));\n }\n\n /**\n * Implementation of the Lisp `count` function. Counts the occurrences of an item within a string or list.\n * @param args the argument Cons containing the item and the target sequence\n * @return the number of occurrences\n */\n count(args: Cons): LispValue {\n const item = args.car;\n const target = args.nth(2);\n let n = 0;\n if (Cons.isString(target)) {\n if (!Cons.isString(item) || item.length !== 1) {\n return 0;\n }\n for (const ch of target) {\n if (ch === item) n++;\n }\n return n;\n }\n if (Cons.isCons(target) || Cons.isNil(target)) {\n const list = Cons.isNil(target) ? Cons.nil : target;\n if (Cons.isCons(list)) {\n for (const each of list.loop()) {\n if (each === item) n++;\n }\n }\n return n;\n }\n throw new EvalError(cannotApply('count', target));\n }\n\n /**\n * Implementation of the Lisp `reduce` function. Combines the elements of a list using a binary procedure.\n * @param args the argument Cons containing the procedure, the list, and an optional initial value\n * @return the result of folding the procedure over the list\n */\n reduce(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n const hasInit = args.length() >= 3;\n const init = args.nth(3);\n\n if (Cons.isNil(list)) {\n if (hasInit) return init;\n // CL semantics: (reduce fn '()) calls fn with no args\n return Applier.apply(procedure, Cons.nil, this.environment, this.streamManager, this.depth);\n }\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('reduce', list));\n }\n\n const iter = list.loop();\n let acc: LispValue;\n if (hasInit) {\n acc = init;\n } else {\n if (!iter.hasNext()) {\n return Applier.apply(procedure, Cons.nil, this.environment, this.streamManager, this.depth);\n }\n acc = iter.next();\n }\n while (iter.hasNext()) {\n const next = iter.next();\n acc = Applier.apply(\n procedure,\n new Cons(acc, new Cons(next, Cons.nil)),\n this.environment,\n this.streamManager,\n this.depth,\n );\n }\n return acc;\n }\n\n /**\n * Implementation of the Lisp `every` function. Returns t when the predicate holds for every element of the list.\n * @param args the argument Cons containing the predicate and the list\n * @return t when the predicate holds for every element, nil otherwise\n */\n every(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) {\n return InterpretedSymbol.of('t');\n }\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('every', list));\n }\n for (const each of list.loop()) {\n const result = Applier.apply(\n procedure,\n new Cons(each, Cons.nil),\n this.environment,\n this.streamManager,\n this.depth,\n );\n if (Cons.isNil(result)) {\n return Cons.nil;\n }\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `some` function. Returns the first non-nil predicate result, or nil if all are nil.\n * @param args the argument Cons containing the predicate and the list\n * @return the first non-nil result, or nil\n */\n some(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) {\n return Cons.nil;\n }\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('some', list));\n }\n for (const each of list.loop()) {\n const result = Applier.apply(\n procedure,\n new Cons(each, Cons.nil),\n this.environment,\n this.streamManager,\n this.depth,\n );\n if (Cons.isNotNil(result)) {\n return result;\n }\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `find` function. Returns the first element of the list that matches the given item.\n * @param args the argument Cons containing the item and the list\n * @return the matching element, or nil if none found\n */\n find(args: Cons): LispValue {\n const item = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) return Cons.nil;\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('find', list));\n }\n for (const each of list.loop()) {\n // Use eq_ (identity) for matching, mirroring CL's default :test #'eql semantics.\n if (this.eq_(new Cons(item, new Cons(each, Cons.nil))) === InterpretedSymbol.of('t')) {\n return each;\n }\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `mapcan` function. Applies the procedure to each element and concatenates the resulting lists.\n * @param args the argument Cons containing the procedure and the list\n * @return the concatenation of the per-element results\n */\n mapcan(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) return Cons.nil;\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('mapcan', list));\n }\n\n const collected: LispValue[] = [];\n for (const each of list.loop()) {\n const part = Applier.apply(\n procedure,\n new Cons(each, Cons.nil),\n this.environment,\n this.streamManager,\n this.depth,\n );\n if (Cons.isCons(part)) {\n for (const x of part.loop()) {\n collected.push(x);\n }\n }\n // nil and non-cons results contribute nothing (matches CL nconc-of-nil)\n }\n let result: Cons = Cons.nil;\n for (let i = collected.length - 1; i >= 0; i--) {\n result = new Cons(collected[i], result);\n }\n return result;\n }\n\n /**\n * Implementation of the Lisp `sort` function. Returns a new list sorted by the given comparison predicate.\n * @param args the argument Cons containing the list and the comparison predicate\n * @return the sorted list\n */\n sort(args: Cons): LispValue {\n const list = args.car;\n const procedure = args.nth(2);\n\n if (Cons.isNil(list)) return Cons.nil;\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('sort', list));\n }\n\n const items: LispValue[] = [];\n for (const each of list.loop()) {\n items.push(each);\n }\n items.sort((a, b) => {\n const result = Applier.apply(\n procedure,\n new Cons(a, new Cons(b, Cons.nil)),\n this.environment,\n this.streamManager,\n this.depth,\n );\n // CL: predicate returns truthy when a should come before b.\n return Cons.isNil(result) ? 1 : -1;\n });\n let result: Cons = Cons.nil;\n for (let i = items.length - 1; i >= 0; i--) {\n result = new Cons(items[i], result);\n }\n return result;\n }\n\n /**\n * Returns whether the given symbol is currently being spied on.\n * @param aSymbol the symbol to check\n * @return true if spied on, false otherwise\n */\n isSpy(aSymbol: InterpretedSymbol): boolean {\n return this.streamManager.isSpy(aSymbol);\n }\n\n /**\n * Implementation of the Lisp `last` function. Returns the last cell of the given list.\n * @param args the argument Cons containing the target list\n * @return the last cell of the list\n */\n last(args: Cons): LispValue {\n if (Cons.isNotCons(args)) {\n return Cons.nil;\n }\n const aCons = args.car as Cons;\n\n return aCons.last();\n }\n\n /**\n * Implementation of the Lisp `<` / `lessThan` predicate. Returns t when arguments are in strictly increasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is less than the next, nil otherwise\n */\n lessThan(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.lessThan_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('<', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `<` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when strictly increasing, nil otherwise\n */\n lessThan_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue < rightValue;\n } else {\n throw new EvalError(cannotApply('<', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `<=` / `lessThanOrEqual` predicate. Returns t when arguments are in non-decreasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is less than or equal to the next, nil otherwise\n */\n lessThanOrEqual(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.lessThanOrEqual_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('<=', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `<=` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when non-decreasing, nil otherwise\n */\n lessThanOrEqual_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue <= rightValue;\n } else {\n throw new EvalError(cannotApply('<=', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `list` function. Returns a list of the given arguments.\n * @param args the argument list\n * @return a Cons list of the arguments\n */\n list(args: LispValue): LispValue {\n if (Cons.isNil(args)) {\n return Cons.nil;\n }\n return new Cons((args as Cons).car, this.list((args as Cons).cdr));\n }\n\n /**\n * Implementation of the Lisp `listp` predicate. Returns t if the argument is a list (Cons or nil).\n * @param args the argument Cons containing the value to test\n * @return t if a list, nil otherwise\n */\n list_(args: Cons): LispValue {\n if (Cons.isList(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `mapcar` function. Applies the procedure to each tuple of corresponding elements.\n * @param args the argument Cons containing the procedure followed by one or more lists\n * @return the list of results\n */\n mapcar(args: Cons): LispValue {\n const aCons = new Cons(Cons.nil, Cons.nil);\n const procedure = args.car;\n const parameters = args.nth(2) as Cons;\n const options = (args.cdr as Cons).cdr as Cons;\n let theCons: Cons = aCons;\n let index = 1;\n\n for (const each of parameters.loop()) {\n const argumentsCons = new Cons(Cons.nil, Cons.nil);\n let temporaryCons: Cons = argumentsCons;\n\n if (Cons.isNotNil(each)) {\n for (const arg of options.loop()) {\n if (Cons.isNotCons(arg)) {\n // Following the original: the source code uses `consol.log` (a typo), which throws\n // ReferenceError, so the subsequent `return Cons.nil` is never reached.\n throw new ReferenceError('consol is not defined');\n }\n temporaryCons.setCdr(new Cons((arg as Cons).nth(index), Cons.nil));\n temporaryCons = temporaryCons.cdr as Cons;\n }\n }\n\n argumentsCons.setCar(each);\n const anObject = Applier.apply(\n procedure,\n argumentsCons,\n this.environment,\n this.streamManager,\n this.depth,\n );\n theCons.setCdr(new Cons(anObject, Cons.nil));\n theCons = theCons.cdr as Cons;\n index++;\n }\n\n return aCons.cdr;\n }\n\n /**\n * Implementation of the Lisp `member` function. Returns the sublist whose car matches the given item.\n * @param args the argument Cons containing the item, the list, and an optional comparator symbol\n * @return the matching sublist, or nil if not found\n */\n member(args: Cons): LispValue {\n let aSymbol = InterpretedSymbol.of('equal?');\n if (Cons.isNotNil(args.nth(3))) {\n aSymbol = args.nth(3) as InterpretedSymbol;\n }\n if (Cons.isNotCons(args.nth(2))) {\n return Cons.nil;\n }\n let aCons = args.nth(2) as Cons;\n\n while (Cons.isCons(aCons)) {\n let anObject: LispValue = null;\n\n if (aSymbol === InterpretedSymbol.of('eq?')) {\n anObject = this.eq_(new Cons(args.car, new Cons(aCons.car, Cons.nil)));\n }\n if (aSymbol === InterpretedSymbol.of('equal?')) {\n anObject = this.equal_(new Cons(args.car, new Cons(aCons.car, Cons.nil)));\n }\n if (anObject == null) {\n throw new EvalError(cannotApply('member', aSymbol));\n }\n if (anObject === InterpretedSymbol.of('t')) {\n return aCons;\n }\n\n aCons = aCons.cdr as Cons;\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `memq` predicate. Returns t when `member` finds a match, nil otherwise.\n * @param args the argument Cons forwarded to `member`\n * @return t when found, nil otherwise\n */\n memq(args: Cons): LispValue {\n if (this.member(args) === Cons.nil) {\n return Cons.nil;\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `mod` / `//` function. Returns the remainder of dividing the arguments in sequence.\n * @param args the argument Cons containing the numbers\n * @return the modulo result\n */\n mod(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.mod_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('mod', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the modulo starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to mod by\n * @return the remainder after taking modulo with each of the remaining numbers\n */\n mod_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result % each;\n } else {\n throw new EvalError(cannotApply('mod', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Implementation of the Lisp `*` / `multiply` function. Returns the product of the given numbers.\n * @param args the argument Cons containing the numbers to multiply\n * @return the product of the arguments\n */\n multiply(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.multiply_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('multiply', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the product starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to multiply\n * @return the product of init and all remaining numbers\n */\n multiply_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result * each;\n } else {\n throw new EvalError(cannotApply('multiply', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Implementation of the Lisp `napier` function. Returns Napier's constant (e).\n * @return Math.E\n */\n napier(): number {\n return Math.E;\n }\n\n /**\n * Implementation of the Lisp `neq` / `~~` predicate. The negation of `eq`.\n * @param args the argument Cons forwarded to `eq_`\n * @return nil when eq, t otherwise\n */\n neq(args: Cons): LispValue {\n if (this.eq_(args) === InterpretedSymbol.of('t')) {\n return Cons.nil;\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `nequal` / `~=` predicate. The negation of `equal`.\n * @param args the argument Cons forwarded to `equal_`\n * @return nil when equal, t otherwise\n */\n nequal(args: Cons): LispValue {\n if (this.equal_(args) === InterpretedSymbol.of('t')) {\n return Cons.nil;\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `nth` function. Returns the nth element of a list.\n * @param args the argument Cons containing the index and the list\n * @return the element at the given index\n */\n nth(args: Cons): LispValue {\n if (!Number.isInteger(args.car)) {\n return Cons.nil;\n }\n const index = args.car as number;\n const aCons = args.nth(2) as Cons;\n\n return aCons.nth(index);\n }\n\n /**\n * Implementation of the Lisp `null` predicate. Returns t if the argument is nil, otherwise nil.\n * @param args the argument Cons containing the value to test\n * @return t if nil, nil otherwise\n */\n null_(args: Cons): LispValue {\n if (Cons.isNil(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n // NOTE: Lisp's numberp and doublep are originally distinct predicates, but because JS has only\n // one numeric type (double), we share a single implementation. In Applier.setup() both\n // Lisp function names numberp / doublep map to this method. Split into separate methods if\n // a future revision introduces additional numeric types such as BigInt.\n /**\n * Implementation of the Lisp `numberp` / `doublep` predicate. Returns t if the argument is a number.\n * @param args the argument Cons containing the value to test\n * @return t if a number, nil otherwise\n */\n number_(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `pi` function. Returns the mathematical constant pi.\n * @return Math.PI\n */\n pi(): number {\n return Math.PI;\n }\n\n /**\n * Implementation of the Lisp `random` function. Returns a pseudo-random number in [0, 1).\n * @return a random number in [0, 1)\n */\n random(): number {\n return Math.random();\n }\n\n /**\n * Implementation of the Lisp `round` function. Returns the given number rounded to the nearest integer.\n * @param args the argument Cons containing the target number\n * @return the rounded integer\n */\n round(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.round(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Dispatches the call to either a built-in function or a user-defined function based on the symbol.\n * @param procedure the symbol naming the function\n * @param args the argument list\n * @return the result of the dispatched function\n */\n selectProcedure(procedure: InterpretedSymbol, args: LispValue): LispValue {\n if (Applier.buildInFunctions.has(procedure)) {\n return this.buildInFunction(procedure, args);\n }\n if (this.environment.has(procedure)) {\n return this.userFunction(procedure, args);\n }\n throw new EvalError(noProcedure(procedure));\n\n return Cons.nil;\n }\n\n /**\n * Sets the current recursion depth.\n * @param aNumber the new depth value\n */\n setDepth(aNumber: number): null {\n this.depth = aNumber;\n return null;\n }\n\n /**\n * Builds and returns the Lisp-name to method-name dispatch map.\n * @return a Map associating each Lisp function name (as an InterpretedSymbol) with the corresponding Applier method name\n */\n static setup(): Map<InterpretedSymbol, string> {\n try {\n const entries: Array<[string, string]> = [\n ['abs', 'abs'],\n ['add', 'add'],\n ['assoc', 'assoc'],\n ['atom', 'atom_'],\n ['car', 'car'],\n ['cdr', 'cdr'],\n ['characterp', 'character_'],\n ['cons', 'cons'],\n ['consp', 'cons_'],\n ['copy', 'copy'],\n ['ceiling', 'ceiling'],\n ['cos', 'cos'],\n ['floatp', 'float_'],\n ['floor', 'floor'],\n ['divide', 'divide'],\n ['doublep', 'number_'],\n ['eq', 'eq_'],\n ['equal', 'equal_'],\n ['evenp', 'even_'],\n ['every', 'every'],\n ['exp', 'exp'],\n ['expt', 'expt'],\n ['find', 'find'],\n ['format', 'format'],\n ['gensym', 'gensym'],\n ['integerp', 'integer_'],\n ['concatenate', 'concatenate'],\n ['count', 'count'],\n ['elt', 'elt'],\n ['last', 'last'],\n ['length', 'length'],\n ['list', 'list'],\n ['listp', 'list_'],\n ['mapcan', 'mapcan'],\n ['mapcar', 'mapcar'],\n ['max', 'max'],\n ['member', 'member'],\n ['memq', 'memq'],\n ['min', 'min'],\n ['minusp', 'minus_'],\n ['mod', 'mod'],\n ['multiply', 'multiply'],\n ['napier', 'napier'],\n ['neq', 'neq'],\n ['nequal', 'nequal'],\n ['nth', 'nth'],\n ['null', 'null_'],\n ['numberp', 'number_'],\n ['oddp', 'odd_'],\n ['pi', 'pi'],\n ['plusp', 'plus_'],\n ['random', 'random'],\n ['reduce', 'reduce'],\n ['round', 'round'],\n ['sin', 'sin'],\n ['some', 'some'],\n ['sort', 'sort'],\n ['sqrt', 'sqrt'],\n ['string-downcase', 'stringDowncase'],\n ['string-trim', 'stringTrim'],\n ['string-upcase', 'stringUpcase'],\n ['stringp', 'string_'],\n ['subseq', 'subseq'],\n ['substring', 'substring'],\n ['subtract', 'subtract'],\n ['symbolp', 'symbol_'],\n ['tan', 'tan'],\n ['truncate', 'truncate'],\n ['zerop', 'zero_'],\n ['1+', 'oneplus'],\n ['1-', 'oneminus'],\n ['+', 'add'],\n ['-', 'subtract'],\n ['*', 'multiply'],\n ['/', 'divide'],\n ['//', 'mod'],\n ['==', 'eq_'],\n ['=', 'equal_'],\n ['~~', 'neq'],\n ['~=', 'nequal'],\n ['<', 'lessThan'],\n ['<=', 'lessThanOrEqual'],\n ['>', 'greaterThan'],\n ['>=', 'greaterThanOrEqual'],\n ];\n return new Map(entries.map(([key, value]) => [InterpretedSymbol.of(key), value]));\n } catch {\n throw new Error('NullPointerException (Applier, initialize)');\n }\n }\n\n /**\n * Implementation of the Lisp `sin` function. Returns the sine of the given number.\n * @param args the argument Cons containing the angle in radians\n * @return the sine of the argument\n */\n sin(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.sin(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Writes a single line of spy output (with indentation) to the given stream.\n * @param aStream the stream to write to, or null/string to fall back to process.stdout\n * @param line the line to write\n */\n spyPrint(aStream: NodeJS.WritableStream | string | null, line: string): null {\n const target: NodeJS.WritableStream =\n aStream != null && typeof aStream === 'object' && 'write' in aStream\n ? aStream\n : process.stdout;\n target.write(this.indent() + line + '\\n');\n return null;\n }\n\n /**\n * Implementation of the Lisp `sqrt` function. Returns the square root of the given number.\n * @param args the argument Cons containing the target number\n * @return the square root of the argument\n */\n sqrt(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.sqrt(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Implementation of the Lisp `stringp` predicate. Returns t if the argument is a string.\n * @param args the argument Cons containing the value to test\n * @return t if a string, nil otherwise\n */\n string_(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `-` / `subtract` function. Returns the difference of the given numbers.\n * @param args the argument Cons containing the numbers to subtract\n * @return the difference of the arguments\n */\n subtract(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.subtract_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('subtract', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the difference starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to subtract\n * @return init with all remaining numbers subtracted\n */\n subtract_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result - each;\n } else {\n throw new EvalError(cannotApply('subtract', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Implementation of the Lisp `symbolp` predicate. Returns t if the argument is an interpreted symbol.\n * @param args the argument Cons containing the value to test\n * @return t if a symbol, nil otherwise\n */\n symbol_(args: Cons): LispValue {\n if (Cons.isSymbol(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `tan` function. Returns the tangent of the given number.\n * @param args the argument Cons containing the angle in radians\n * @return the tangent of the argument\n */\n tan(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.tan(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Invokes a user-defined function (lambda) bound in the environment under the given symbol.\n * @param procedure the symbol naming the user function\n * @param args the argument list\n * @return the result of evaluating the user function\n */\n userFunction(procedure: InterpretedSymbol, args: LispValue): LispValue {\n if (this.isSpy(procedure)) {\n this.spyPrint(this.streamManager.spyStream(procedure), new Cons(procedure, args).toString());\n this.setDepth(this.depth + 1);\n }\n\n const lambda = this.environment.get(procedure) as Cons;\n const theEnvironment = lambda.last().car as Table;\n const answer = Applier.apply(lambda, args, theEnvironment, this.streamManager, this.depth);\n\n if (this.isSpy(procedure)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(procedure),\n String(answer) + ' <== ' + new Cons(procedure, args).toString(),\n );\n }\n\n return answer;\n }\n}\n","/**\n * @class\n * @classdesc Error class representing a graceful exit triggered by a Lisp (exit) call. Catch it at the REPL or library boundary to run cleanup before terminating.\n * @author Keisuke Ikeda\n * @this {ExitError}\n */\nexport class ExitError extends Error {\n /**\n * Constructor.\n * @constructor\n */\n constructor() {\n super('Exit');\n this.name = 'ExitError';\n }\n}\n","import type { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\n\ntype Stream = NodeJS.WritableStream | null;\n\n/**\n * @class\n * @classdesc Manages output streams (stdout / stderr / spy / trace) used by the interpreter.\n * @author Keisuke Ikeda\n * @this {StreamManager}\n */\nexport class StreamManager extends Object {\n /**\n * Whether tracing is currently enabled.\n */\n isTrace: boolean = false;\n /**\n * Map from a named stream key (e.g. \"default\", \"stdout\", \"stderr\") to a WritableStream.\n */\n streamTable: Map<string, Stream>;\n /**\n * Map from a spied symbol to the stream key used for that symbol's output.\n */\n spyTable: Map<InterpretedSymbol, string>;\n /**\n * The stream that receives trace output while tracing is on.\n */\n traceStream: Stream;\n\n /**\n * Constructor.\n * @constructor\n */\n constructor() {\n super();\n this.streamTable = new Map();\n this.spyTable = new Map();\n this.traceStream = null;\n this.initialize();\n }\n\n /**\n * Returns the currently selected output stream (trace stream when tracing, otherwise the default).\n * @return the active stream, or null when none is available\n */\n getStream(): Stream {\n let aPrintStream: Stream = null;\n if (this.isTrace) {\n // Following the original: traceStream is invoked as a function (since it is a Stream object this throws).\n return (this.traceStream as unknown as () => Stream)();\n }\n const filePath = process.env['HOME'] as string;\n if (this.streamTable.has(filePath)) {\n aPrintStream = this.streamTable.get(filePath) ?? null;\n }\n\n return aPrintStream;\n }\n\n /**\n * Initializes the instance variables.\n * @return null\n */\n initialize(): null {\n this.streamTable.set('default', process.stdout);\n this.streamTable.set('stdout', process.stdout);\n this.streamTable.set('stderr', process.stderr);\n\n return null;\n }\n\n /**\n * Returns whether the given symbol is being spied (or whether tracing is on, in which case every symbol is \"spied\").\n * @param aSymbol the symbol to check, or null\n * @return true if the symbol is spied or tracing is on\n */\n isSpy(aSymbol: InterpretedSymbol | null): boolean {\n if (this.isTrace) {\n return true;\n }\n if (aSymbol != null && this.spyTable_().has(aSymbol)) {\n return true;\n }\n return false;\n }\n\n /**\n * Removes the given symbol from the spy table.\n * @param aSymbol the symbol to stop spying\n * @return null\n */\n noSpy(aSymbol: InterpretedSymbol): null {\n if (this.spyTable_().has(aSymbol)) {\n this.spyTable_().delete(aSymbol);\n }\n\n return null;\n }\n\n /**\n * Turns tracing off and clears the spy table.\n * @return null\n */\n noTrace(): null {\n this.setIsTrace(false);\n this.spyTable.clear();\n\n return null;\n }\n\n /**\n * Sets the tracing flag.\n * @param aBoolean the new value for the tracing flag\n * @return null\n */\n setIsTrace(aBoolean: boolean): null {\n this.isTrace = aBoolean;\n return null;\n }\n\n /**\n * Sets the trace output stream.\n * @param aStream the stream to send trace output to\n * @return null\n */\n setTraceStream(aStream: Stream): null {\n this.traceStream = aStream;\n return null;\n }\n\n /**\n * Registers the given symbol as spied with the given stream key.\n * @param aSymbol the symbol to spy on\n * @param aString the stream key (e.g. \"default\")\n * @return null\n */\n spy(aSymbol: InterpretedSymbol, aString: string): null {\n const aPrintStream = this.getStream();\n if (aPrintStream != null) {\n this.spyTable_().set(aSymbol, aString);\n }\n\n return null;\n }\n\n /**\n * Returns the stream (or stream-key string) used for the given symbol's spy output.\n * @param aSymbol the symbol whose spy stream is requested, or null\n * @return the trace stream, the registered key string, or throws if none is found\n */\n spyStream(aSymbol: InterpretedSymbol | null): Stream | string {\n if (this.isTrace) {\n return this.traceStream;\n }\n if (aSymbol != null && this.spyTable_().has(aSymbol)) {\n return this.spyTable_().get(aSymbol) as string;\n }\n throw new Error('Stream is not found.');\n }\n\n /**\n * Returns a copy of the spy table (defensive copy so callers do not mutate the internal map).\n * @return a new map containing the same entries as the internal spy table\n */\n spyTable_(): Map<InterpretedSymbol, string> {\n const aTable = new Map<InterpretedSymbol, string>();\n for (const [key, value] of this.spyTable) {\n aTable.set(key, value);\n }\n return aTable;\n }\n\n /**\n * Turns tracing on, routing trace output to the currently active stream.\n * @return null\n */\n trace(): null {\n this.noTrace();\n const aPrintStream = this.getStream();\n this.setTraceStream(aPrintStream);\n this.setIsTrace(true);\n\n return null;\n }\n}\n","import v8 from 'node:v8';\nimport vm from 'node:vm';\n\nimport { Applier } from '../Applier/index.js';\nimport { Cons } from '../../value/Cons/index.js';\nimport { EvalError } from '../../errors/EvalError/index.js';\nimport { ExitError } from '../../errors/ExitError/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport {\n argumentNotSymbol,\n cannotApply,\n noBinding,\n notSymbol,\n SIZES_DO_NOT_MATCH,\n} from '../../constants/index.js';\nimport { StreamManager } from '../StreamManager/index.js';\nimport { Table } from '../Table/index.js';\nimport type { KeiLispPlugin, PluginContext } from '../../plugin/types.js';\nimport type { LispValue } from '../../types/index.js';\n\n// Lazily expose V8's gc() to user-land on first use, avoiding the need for the\n// host process to be started with `--expose-gc`.\nlet cachedGc: (() => void) | null = null;\nconst triggerGc = (): void => {\n if (cachedGc == null) {\n v8.setFlagsFromString('--expose_gc');\n cachedGc = vm.runInNewContext('gc') as () => void;\n }\n cachedGc();\n};\n\n/**\n * @class\n * @classdesc Class that mimics Lisp's universal function Evaluate.\n * @author Keisuke Ikeda\n * @this {Evaluator}\n */\nexport class Evaluator extends Object {\n /**\n * Lisp-name to method-name dispatch map for special forms.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = Evaluator.setup();\n\n /**\n * The variable binding environment used during evaluation.\n */\n environment: Table;\n /**\n * The stream manager used for trace and spy output.\n */\n streamManager: StreamManager;\n /**\n * The current call depth, used for indenting trace/spy output.\n */\n depth: number;\n /**\n * Registered plugins consulted by `eval` when no special form matches.\n */\n plugins: KeiLispPlugin[];\n\n /**\n * Constructor.\n * @param aTable the variable binding environment\n * @param aStreamManager the stream manager for trace and spy output\n * @param aNumber the initial call depth\n * @param plugins the plugin chain consulted before falling through to Applier\n */\n constructor(\n aTable: Table,\n aStreamManager: StreamManager,\n aNumber: number,\n plugins: KeiLispPlugin[] = [],\n ) {\n super();\n this.environment = aTable;\n this.streamManager = aStreamManager;\n this.depth = aNumber;\n this.plugins = plugins;\n }\n\n /**\n * Implementation of the Lisp `and` special form.\n * @param aCons the argument Cons containing the expressions to evaluate\n * @return nil if any expression evaluates to nil, otherwise t\n */\n and(aCons: Cons): LispValue {\n for (const each of aCons.loop()) {\n const anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNil(anObject)) {\n return Cons.nil;\n }\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `apply` special form.\n * @param aCons the argument Cons containing the procedure and its argument list\n * @return the result of applying the procedure to the arguments\n */\n apply_lisp(aCons: Cons): LispValue {\n const procedure = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n const args = Evaluator.eval(\n aCons.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n let aTable: Table = this.environment;\n if (procedure instanceof Cons && procedure.last().car instanceof Table) {\n aTable = procedure.last().car as Table;\n }\n\n return Applier.apply(procedure, args, aTable, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Implementation of the Lisp `bind` special form.\n * @param aCons the argument Cons whose car is the symbol to look up\n * @return the binding count for the symbol, or nil if unbound\n */\n bind(aCons: Cons): LispValue {\n if (Cons.isNotSymbol(aCons.car)) {\n throw new EvalError(cannotApply('bind', aCons.car));\n }\n const aSymbol = aCons.car as InterpretedSymbol;\n if (!this.environment.has(aSymbol)) {\n return Cons.nil;\n }\n\n return this.bindAUX(aSymbol);\n }\n\n /**\n * Counts the number of distinct bindings for the given symbol along the environment chain.\n * @param aSymbol the symbol whose bindings are inspected\n * @return the number of distinct bindings found\n */\n bindAUX(aSymbol: InterpretedSymbol): number {\n let aTable: Table | null = this.environment;\n let anObject: LispValue = aTable.get(aSymbol);\n let count = 1;\n\n while (aTable != null) {\n if (!aTable.has(aSymbol)) {\n break;\n }\n const theObject: LispValue = aTable.get(aSymbol);\n // Following the original: loose (!=) comparison.\n if (theObject != anObject) {\n count++;\n anObject = theObject;\n }\n aTable = aTable.source;\n }\n\n return count;\n }\n\n /**\n * Sequentially evaluates and binds each (symbol value) pair into the given table; used by let*.\n * @param parameters the Cons of (symbol value) pairs to bind\n * @param aTable the table into which the bindings are written\n */\n binding(parameters: Cons, aTable: Table): null {\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n const value = Evaluator.eval(\n theCons.nth(2),\n aTable,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n aTable.set(key, value);\n }\n\n return null;\n }\n\n /**\n * Evaluates all (symbol value) pairs first and then writes them into the given table in parallel; used by let.\n * @param parameters the Cons of (symbol value) pairs to bind\n * @param aTable the table into which the bindings are written\n */\n bindingParallel(parameters: Cons, aTable: Table): null {\n const theTable = new Map<unknown, LispValue>();\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n const value = Evaluator.eval(\n theCons.nth(2),\n aTable,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n theTable.set(key, value);\n }\n\n for (const [key, value] of theTable) {\n aTable.set(key, value);\n }\n\n return null;\n }\n\n /**\n * Implementation of the Lisp `cond` special form.\n * @param aCons the argument Cons of (test consequent...) clauses\n * @return the result of the first clause whose test is non-nil, or nil\n */\n cond(aCons: LispValue): LispValue {\n if (Cons.isNil(aCons)) {\n return Cons.nil;\n }\n const consCell = aCons as Cons;\n const clause = consCell.car as Cons;\n let anObject: LispValue = Evaluator.eval(\n clause.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNil(anObject)) {\n return this.cond(consCell.cdr);\n }\n const consequent = clause.cdr as Cons;\n for (const each of consequent.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `defun` special form.\n * @param aCons the argument Cons containing the function name, parameter list, and body\n * @return the function name symbol\n */\n defun(aCons: Cons): LispValue {\n const variable = aCons.car;\n let lambda: LispValue = aCons.cdr;\n lambda =\n aCons.length() === 2\n ? (lambda as Cons).car\n : new Cons(InterpretedSymbol.of('lambda'), lambda);\n lambda = Evaluator.eval(\n lambda,\n new Table(this.environment),\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.set(variable, lambda);\n\n return variable;\n }\n\n /**\n * Implementation of the Lisp `do` special form (parallel binding update).\n * @param aCons the argument Cons containing bindings, termination clause, and body\n * @return the value of the termination clause's result form\n */\n do_(aCons: Cons): LispValue {\n const parameters = aCons.car as Cons;\n const bool = aCons.nth(2) as Cons;\n const expressions = (aCons.cdr as Cons).cdr as Cons;\n this.bindingParallel(parameters, this.environment);\n if (Cons.isNil(bool)) {\n bool.setCar(Cons.nil);\n }\n\n while (\n Cons.isNil(\n Evaluator.eval(bool.car, this.environment, this.streamManager, this.depth, this.plugins),\n )\n ) {\n const theTable = new Map<InterpretedSymbol, LispValue>();\n for (const each of expressions.loop()) {\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins);\n }\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n if (Cons.isNotNil(theCons.nth(3))) {\n const value = Evaluator.eval(\n theCons.nth(3),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n theTable.set(key, value);\n }\n }\n for (const [key, value] of theTable) {\n this.environment.set(key, value);\n }\n }\n return Evaluator.eval(\n bool.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Implementation of the Lisp `dolist` special form.\n * @param aCons the argument Cons containing the binding clause and body\n * @return the value of the result form\n */\n doList(aCons: Cons): LispValue {\n const parameter = aCons.car as Cons;\n const theCons = aCons.cdr as Cons;\n const args = Evaluator.eval(\n parameter.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n ) as Cons;\n for (const element of args.loop()) {\n this.environment.set(parameter.car, element);\n for (const each of theCons.loop()) {\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins);\n }\n }\n\n return Evaluator.eval(\n parameter.nth(3),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Implementation of the Lisp `do*` special form (sequential binding update).\n * @param aCons the argument Cons containing bindings, termination clause, and body\n * @return the value of the termination clause's result form\n */\n doStar(aCons: Cons): LispValue {\n const parameters = aCons.car as Cons;\n const bool = aCons.nth(2) as Cons;\n const expressions = (aCons.cdr as Cons).cdr as Cons;\n this.binding(parameters, this.environment);\n if (Cons.isNil(bool)) {\n bool.setCar(Cons.nil);\n }\n\n while (\n Cons.isNil(\n Evaluator.eval(bool.car, this.environment, this.streamManager, this.depth, this.plugins),\n )\n ) {\n for (const each of expressions.loop()) {\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins);\n }\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n if (Cons.isNotNil(theCons.nth(3))) {\n const value = Evaluator.eval(\n theCons.nth(3),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.set(key, value);\n }\n }\n }\n return Evaluator.eval(\n bool.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Evaluates a procedure call by delegating to the Applier after evaluating each argument.\n * @param form the call form whose car is the procedure and whose cdr is the argument list\n * @return the result of applying the procedure\n */\n entrustApplier(form: Cons): LispValue {\n const aCons = form.cdr as Cons;\n let args: Cons = new Cons(Cons.nil, Cons.nil);\n const procedure = form.car;\n let aSymbol: InterpretedSymbol | null = null;\n\n if (Cons.isSymbol(procedure)) {\n aSymbol = procedure;\n }\n if (this.isSpy(aSymbol)) {\n this.spyPrint(this.streamManager.spyStream(aSymbol), form.toString());\n this.setDepth(this.depth + 1);\n }\n\n for (const each of aCons.loop()) {\n if (each instanceof Table) {\n break;\n }\n args.add(\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins),\n );\n }\n if (this.isSpy(aSymbol)) {\n this.setDepth(this.depth - 1);\n }\n\n args = args.cdr as Cons;\n return Applier.apply(\n procedure,\n args,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Evaluates the given form in the given environment.\n * @param form the form to evaluate\n * @param environment the variable binding environment\n * @param aStreamManager the stream manager for trace and spy output\n * @param depth the current call depth\n * @param plugins the plugin chain consulted before falling through to Applier\n * @return the evaluation result\n */\n static eval(\n form: LispValue,\n environment: Table,\n aStreamManager: StreamManager = new StreamManager(),\n depth: number = 1,\n plugins: KeiLispPlugin[] = [],\n ): LispValue {\n return new Evaluator(environment, aStreamManager, depth, plugins).eval(form);\n }\n\n /**\n * Evaluates the given form using this Evaluator's environment.\n * @param form the form to evaluate\n * @return the evaluation result\n */\n eval(form: LispValue): LispValue {\n if (Cons.isSymbol(form)) {\n return this.evaluateSymbol(form);\n }\n if (Cons.isNil(form) || Cons.isNotList(form)) {\n return form;\n }\n const formCons = form as Cons;\n if (Cons.isSymbol(formCons.car) && Evaluator.buildInFunctions.has(formCons.car)) {\n return this.specialForm(formCons);\n }\n if (Cons.isSymbol(formCons.car) && this.plugins.length > 0) {\n const symbol = formCons.car;\n const plugin = this.plugins.find((p) => p.has(symbol));\n if (plugin !== undefined) {\n return this.entrustPlugin(plugin, formCons);\n }\n }\n\n return this.entrustApplier(formCons);\n }\n\n /**\n * Evaluates the argument list (the same way `entrustApplier` does), then\n * delegates the call to the matched plugin with a context that allows\n * recursive evaluation.\n * @param plugin the plugin that claimed the call symbol\n * @param form the call form whose car is the symbol and whose cdr is the argument list\n * @return the result returned by the plugin\n */\n entrustPlugin(plugin: KeiLispPlugin, form: Cons): LispValue {\n const aCons = form.cdr as Cons;\n let args: Cons = new Cons(Cons.nil, Cons.nil);\n const symbol = form.car as InterpretedSymbol;\n\n if (this.isSpy(symbol)) {\n this.spyPrint(this.streamManager.spyStream(symbol), form.toString());\n this.setDepth(this.depth + 1);\n }\n\n for (const each of aCons.loop()) {\n if (each instanceof Table) {\n break;\n }\n args.add(\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins),\n );\n }\n if (this.isSpy(symbol)) {\n this.setDepth(this.depth - 1);\n }\n\n args = args.cdr as Cons;\n const ctx: PluginContext = {\n environment: this.environment,\n streamManager: this.streamManager,\n depth: this.depth,\n eval: (subForm: LispValue): LispValue =>\n Evaluator.eval(subForm, this.environment, this.streamManager, this.depth, this.plugins),\n };\n return plugin.apply(symbol, args, ctx);\n }\n\n /**\n * Implementation of the Lisp `eval` special form.\n * @param aCons the argument Cons whose car is the form to evaluate twice\n * @return the result of evaluating the form\n */\n eval_lisp(aCons: Cons): LispValue {\n return Evaluator.eval(\n Evaluator.eval(aCons.car, this.environment, this.streamManager, this.depth, this.plugins),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Resolves the value bound to the given symbol in the current environment.\n * @param aSymbol the symbol to resolve\n * @return the value bound to the symbol\n */\n evaluateSymbol(aSymbol: InterpretedSymbol): LispValue {\n if (!this.environment.has(aSymbol)) {\n throw new EvalError(noBinding(aSymbol));\n }\n if (this.isSpy(aSymbol)) {\n this.spyPrint(this.streamManager.spyStream(aSymbol), aSymbol.toString());\n this.setDepth(this.depth + 1);\n }\n\n let answer: LispValue = this.environment.get(aSymbol);\n if (answer instanceof Cons && answer.cdr instanceof Table) {\n answer = answer.car;\n }\n\n if (this.isSpy(aSymbol)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(aSymbol),\n String(answer) + ' <== ' + String(aSymbol),\n );\n }\n\n return answer;\n }\n\n /**\n * Implementation of the Lisp `exit` special form; terminates the REPL by throwing an ExitError.\n */\n exit(): never {\n console.log('Bye!');\n throw new ExitError();\n }\n\n /**\n * Implementation of the Lisp `gc` special form; triggers garbage collection and returns memory usage.\n * @return an association list of memory usage statistics\n */\n gc(): Cons {\n triggerGc();\n const usage = process.memoryUsage();\n // Returns an association list so callers can do (assoc 'heap-used (gc)).\n const pair = (key: string, value: number): Cons => new Cons(InterpretedSymbol.of(key), value);\n const entries: Cons[] = [\n pair('rss', usage.rss),\n pair('heap-total', usage.heapTotal),\n pair('heap-used', usage.heapUsed),\n ];\n let result: Cons = Cons.nil;\n for (const entry of entries) {\n result = new Cons(entry, result);\n }\n return result;\n }\n\n /**\n * Implementation of the Lisp `if` special form.\n * @param aCons the argument Cons containing the test, then-form, and else-form\n * @return the result of evaluating the selected branch\n */\n if_(aCons: Cons): LispValue {\n const bool = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n const anObject: LispValue = Cons.isNil(bool) ? aCons.nth(3) : aCons.nth(2);\n\n return Evaluator.eval(anObject, this.environment, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Returns the indentation string used for trace and spy output at the current depth.\n * @return the indentation string\n */\n indent(): string {\n let index = 0;\n let aString = '';\n while (index++ < this.depth) {\n aString += '| ';\n }\n\n return aString;\n }\n\n /**\n * Returns whether the given symbol is currently being spied on.\n * @param aSymbol the symbol to check\n * @return a boolean\n */\n isSpy(aSymbol: InterpretedSymbol | null): boolean {\n if (aSymbol == null) {\n return false;\n }\n return this.streamManager.isSpy(aSymbol);\n }\n\n /**\n * Implementation of the Lisp `lambda` special form; captures the current environment as a closure.\n * @param args the argument Cons containing the parameter list and body\n * @return a lambda form with the captured environment appended\n */\n lambda(args: Cons): LispValue {\n const aCons = Cons.cloneValue(args) as Cons;\n const theCons = aCons.cdr as Cons;\n theCons.setCdr(new Cons(this.environment, Cons.nil));\n\n return new Cons(InterpretedSymbol.of('lambda'), aCons);\n }\n\n /**\n * Implementation of the Lisp `let` special form (parallel binding).\n * @param aCons the argument Cons containing bindings and body\n * @return the value of the last body form\n */\n let(aCons: Cons): LispValue {\n const aTable = new Table(this.environment);\n const parameters = aCons.car as Cons;\n const forms = aCons.cdr as Cons;\n let anObject: LispValue = Cons.nil;\n this.bindingParallel(parameters, aTable);\n for (const each of forms.loop()) {\n anObject = Evaluator.eval(each, aTable, this.streamManager, this.depth, this.plugins);\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `let*` special form (sequential binding).\n * @param aCons the argument Cons containing bindings and body\n * @return the value of the last body form\n */\n letStar(aCons: Cons): LispValue {\n const aTable = new Table(this.environment);\n const parameters = aCons.car as Cons;\n const forms = aCons.cdr as Cons;\n let anObject: LispValue = Cons.nil;\n this.binding(parameters, aTable);\n for (const each of forms.loop()) {\n anObject = Evaluator.eval(each, aTable, this.streamManager, this.depth, this.plugins);\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `not` special form.\n * @param aCons the argument Cons whose car is the expression to negate\n * @return t if the expression evaluates to nil, otherwise nil\n */\n not(aCons: Cons): LispValue {\n if (\n Cons.isNil(\n Evaluator.eval(aCons.car, this.environment, this.streamManager, this.depth, this.plugins),\n )\n ) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `notrace` special form; disables tracing.\n * @return the symbol t\n */\n notrace(): InterpretedSymbol {\n this.streamManager.noTrace();\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `or` special form.\n * @param aCons the argument Cons containing the expressions to evaluate\n * @return t if any expression evaluates to non-nil, otherwise nil\n */\n or(aCons: Cons): LispValue {\n for (const each of aCons.loop()) {\n const anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotNil(anObject)) {\n return InterpretedSymbol.of('t');\n }\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `pop` special form.\n * @param aCons the argument Cons whose car is the symbol bound to a list\n * @return the popped element, or nil if the binding is not a Cons\n */\n pop_(aCons: Cons): LispValue {\n if (Cons.isNotSymbol(aCons.car)) {\n throw new EvalError(argumentNotSymbol(1));\n }\n const aSymbol = aCons.car as InterpretedSymbol;\n const anObject = Evaluator.eval(\n aSymbol,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(anObject)) {\n return Cons.nil;\n }\n const consObject = anObject as Cons;\n this.environment.setIfExist(aSymbol, consObject.cdr);\n\n return consObject.car;\n }\n\n /**\n * Implementation of the Lisp `progn` special form.\n * @param aCons the argument Cons containing the body expressions\n * @return the value of the last body form, or nil if there are none\n */\n progn(aCons: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n for (const each of aCons.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `princ` special form; writes the evaluated argument without a trailing newline.\n * @param aCons the argument Cons whose car is the expression to print\n * @return the printed value\n */\n princ(aCons: Cons): LispValue {\n const anObject = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n process.stdout.write(String(anObject));\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `print` special form; writes the evaluated argument followed by a newline.\n * @param aCons the argument Cons whose car is the expression to print\n * @return the printed value\n */\n print(aCons: Cons): LispValue {\n const anObject = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n process.stdout.write(String(anObject) + '\\n');\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `push` special form.\n * @param aCons the argument Cons containing the value to push and the target symbol\n * @return the new Cons stored in the symbol\n */\n push_(aCons: Cons): LispValue {\n let anObject = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotSymbol(aCons.nth(2))) {\n throw new EvalError(argumentNotSymbol(2));\n }\n const aSymbol = aCons.nth(2) as InterpretedSymbol;\n anObject = new Cons(\n anObject,\n Evaluator.eval(aSymbol, this.environment, this.streamManager, this.depth, this.plugins),\n );\n this.environment.setIfExist(aSymbol, anObject);\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `quote` special form.\n * @param aCons the argument Cons whose car is the form to return unevaluated\n * @return the quoted form\n */\n quote(aCons: Cons): LispValue {\n return aCons.car;\n }\n\n /**\n * Implementation of the Lisp `rplaca` special form; destructively replaces the car of a Cons.\n * @param args the argument Cons containing the target Cons expression and the new car value\n * @return the modified Cons\n */\n rplaca(args: Cons): LispValue {\n let anObject = Evaluator.eval(\n args.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(anObject)) {\n throw new EvalError(cannotApply('set-car!', anObject));\n }\n const aCons = anObject as Cons;\n anObject = Evaluator.eval(\n args.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n aCons.setCar(anObject);\n\n return Evaluator.eval(args.car, this.environment, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Implementation of the Lisp `rplacd` special form; destructively replaces the cdr of a Cons.\n * @param args the argument Cons containing the target Cons expression and the new cdr value\n * @return the modified Cons\n */\n rplacd(args: Cons): LispValue {\n let anObject = Evaluator.eval(\n args.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(anObject)) {\n throw new EvalError(cannotApply('set-cdr!', anObject));\n }\n const aCons = anObject as Cons;\n anObject = Evaluator.eval(\n args.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n aCons.setCdr(anObject);\n\n return Evaluator.eval(args.car, this.environment, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Implementation of the Lisp `setq` special form; assigns values in the local environment.\n * @param args the argument Cons containing alternating (symbol value) pairs\n * @return the last assigned value\n */\n setq(args: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const anIterator = args.loop();\n const index = -1;\n\n while (anIterator.hasNext()) {\n if (!Cons.isSymbol(args.nth(index + 2))) {\n throw new EvalError(notSymbol(args.car));\n }\n const key = anIterator.next() as InterpretedSymbol;\n\n if (!anIterator.hasNext()) {\n throw new EvalError(SIZES_DO_NOT_MATCH);\n }\n anObject = Evaluator.eval(\n anIterator.next(),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.set(key, anObject);\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `set-allq` special form; assigns values in the binding's owning scope.\n * @param args the argument Cons containing alternating (symbol value) pairs\n * @return the last assigned value\n */\n set_allq(args: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const anIterator = args.loop();\n const index = -1;\n\n while (anIterator.hasNext()) {\n if (!Cons.isSymbol(args.nth(index + 2))) {\n throw new EvalError(notSymbol(args.car));\n }\n const key = anIterator.next() as InterpretedSymbol;\n anObject = Evaluator.eval(\n anIterator.next(),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.setIfExist(key, anObject);\n }\n\n return anObject;\n }\n\n /**\n * Sets the current call depth used for trace and spy indentation.\n * @param aNumber the new depth\n */\n setDepth(aNumber: number): null {\n this.depth = aNumber;\n return null;\n }\n\n /**\n * Builds and returns the Lisp-name to method-name dispatch map for special forms.\n * @return the dispatch map\n */\n static setup(): Map<InterpretedSymbol, string> {\n try {\n const entries: Array<[string, string]> = [\n ['and', 'and'],\n ['apply', 'apply_lisp'],\n ['bind', 'bind'],\n ['cond', 'cond'],\n ['defun', 'defun'],\n ['do', 'do_'],\n ['dolist', 'doList'],\n ['do*', 'doStar'],\n ['eval', 'eval_lisp'],\n ['exit', 'exit'],\n ['gc', 'gc'],\n ['if', 'if_'],\n ['lambda', 'lambda'],\n ['let', 'let'],\n ['let*', 'letStar'],\n ['not', 'not'],\n ['notrace', 'notrace'],\n ['or', 'or'],\n ['pop', 'pop_'],\n ['progn', 'progn'],\n ['princ', 'princ'],\n ['print', 'print'],\n ['push', 'push_'],\n ['quote', 'quote'],\n ['rplaca', 'rplaca'],\n ['rplacd', 'rplacd'],\n ['setq', 'setq'],\n ['set-allq', 'set_allq'],\n ['terpri', 'terpri'],\n ['time', 'time'],\n ['trace', 'trace'],\n ['unless', 'unless'],\n ['when', 'when'],\n ];\n return new Map(entries.map(([key, value]) => [InterpretedSymbol.of(key), value]));\n } catch {\n throw new Error('NullPointerException (Evaluator, initialize)');\n }\n }\n\n /**\n * Dispatches a special-form call to the corresponding method via the build-in dispatch map.\n * @param form the form whose car is the special-form symbol\n * @return the result of the special-form method\n */\n specialForm(form: Cons): LispValue {\n const aSymbol = form.car as InterpretedSymbol;\n\n if (this.isSpy(aSymbol)) {\n this.spyPrint(this.streamManager.spyStream(aSymbol), form.toString());\n this.setDepth(this.depth + 1);\n }\n\n const aCons = form.cdr as Cons;\n const methodName = Evaluator.buildInFunctions.get(aSymbol) as string;\n\n const target = this as unknown as Record<string, unknown>;\n const fn = target[methodName];\n if (typeof fn !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n const answer = (fn as (a: Cons) => LispValue).apply(target, [aCons]);\n\n if (this.isSpy(aSymbol)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(aSymbol),\n String(answer) + ' <== ' + String(aSymbol),\n );\n }\n\n return answer;\n }\n\n /**\n * Writes a trace/spy line to the given stream (or stdout) with the current indentation.\n * @param aStream the destination stream, or null/string to fall back to stdout\n * @param line the line to write\n */\n spyPrint(aStream: NodeJS.WritableStream | string | null, line: string): null {\n const target: NodeJS.WritableStream =\n aStream != null && typeof aStream === 'object' && 'write' in aStream\n ? aStream\n : process.stdout;\n target.write(this.indent() + line + '\\n');\n return null;\n }\n\n /**\n * Implementation of the Lisp `terpri` special form; writes a newline to stdout.\n * @return the symbol t\n */\n terpri(): InterpretedSymbol {\n process.stdout.write('\\n');\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `time` special form; measures evaluation time in milliseconds.\n * @param aCons the argument Cons whose car is the form to time\n * @return the elapsed time in milliseconds\n */\n time(aCons: Cons): number {\n const start = process.hrtime();\n Evaluator.eval(aCons.car, this.environment, this.streamManager, this.depth, this.plugins);\n const end = process.hrtime(start);\n\n return end[1] / 1_000_000;\n }\n\n /**\n * Implementation of the Lisp `trace` special form; enables tracing.\n * @return the symbol t\n */\n trace(): InterpretedSymbol {\n this.streamManager.trace();\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `unless` special form.\n * @param aCons the argument Cons containing the test and body\n * @return the value of the last body form if the test is nil, otherwise nil\n */\n unless(aCons: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const theCons = aCons.cdr as Cons;\n const flag = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotNil(flag)) {\n return Cons.nil;\n }\n for (const each of theCons.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `when` special form.\n * @param aCons the argument Cons containing the test and body\n * @return the value of the last body form if the test is non-nil, otherwise nil\n */\n when(aCons: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const theCons = aCons.cdr as Cons;\n const flag = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNil(flag)) {\n return Cons.nil;\n }\n for (const each of theCons.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n}\n","import { Cons } from '../../value/Cons/index.js';\nimport { Evaluator } from '../../runtime/Evaluator/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport { StreamManager } from '../../runtime/StreamManager/index.js';\nimport { Table } from '../../runtime/Table/index.js';\nimport type { KeiLispPlugin } from '../../plugin/types.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Class for the interpreter.\n * @author Keisuke Ikeda\n * @this {LispInterpreter}\n */\nexport class LispInterpreter extends Object {\n /**\n * The root (top-level) environment table, pre-populated with built-in symbols.\n */\n root: Table;\n /**\n * The stream manager that owns the interpreter's output / spy streams.\n */\n streamManager: StreamManager;\n /**\n * Registered plugins consulted by the evaluator on every call. See `use`.\n */\n plugins: KeiLispPlugin[];\n\n /**\n * Constructor.\n * @constructor\n */\n constructor() {\n super();\n this.root = this.initializeTable();\n this.streamManager = new StreamManager();\n this.plugins = [];\n }\n\n /**\n * Registers a plugin. Subsequent `eval` calls will consult the plugin chain\n * (in registration order, first match wins) when no special form matches a\n * symbol, before falling through to the Applier built-ins.\n * @param plugin the plugin to register\n * @return this interpreter, for chaining\n */\n use(plugin: KeiLispPlugin): this {\n this.plugins.push(plugin);\n return this;\n }\n\n /**\n * Evaluates the given expression and returns the result. Throws `ParseError`,\n * `EvalError`, or `ExitError` on failure; library users are expected to catch\n * these (see the `KeiLispError` base class for the parse/eval family).\n * @param aCons the expression to evaluate\n * @return the evaluation result\n */\n eval(aCons: LispValue): LispValue {\n return Evaluator.eval(aCons, this.root, this.streamManager, 1, this.plugins);\n }\n\n /**\n * Parses the source string, evaluates every expression it contains, and returns the results as an array.\n * @param source the Lisp source string\n * @return the array of evaluation results, one per top-level expression\n */\n evalAll(source: string): LispValue[] {\n const ast = this.parse(source);\n const results: LispValue[] = [];\n for (const expr of ast.loop()) {\n results.push(this.eval(expr));\n }\n return results;\n }\n\n /**\n * Parses and evaluates the source string and returns the value of the last expression.\n * @param source the Lisp source string\n * @return the value of the last expression, or `Cons.nil` for empty input\n */\n evalString(source: string): LispValue {\n const results = this.evalAll(source);\n return results.length === 0 ? Cons.nil : (results.at(-1) ?? Cons.nil);\n }\n\n /**\n * Parses the given string into a list of top-level expressions and returns\n * it. The result is always a `Cons` (possibly `Cons.nil` for empty input)\n * because the source is wrapped in an outer list before parsing. Throws\n * `ParseError` if the source cannot be parsed.\n * @param aString the Lisp source string\n * @return a Cons containing the parsed top-level expressions\n */\n parse(aString: string): Cons {\n return Cons.parse('(' + aString + '\\n);') as Cons;\n }\n\n /**\n * Sets the given environment as the root of the environment chain.\n * @param environment the environment table to install as root\n * @return null\n */\n setRoot(environment: Table): null {\n if (environment instanceof Table) {\n environment.setRoot(true);\n this.root = environment;\n }\n\n return null;\n }\n\n /**\n * Builds the root environment table by pre-registering every built-in symbol and the small set of bootstrap lambdas (append / butlast / nthcdr / reverse).\n * @return the freshly initialized root environment\n */\n initializeTable(): Table {\n const aList: string[] = [];\n const aTable = new Table();\n aTable.setRoot(true);\n\n aList.push(\n 'abs',\n 'add',\n 'and',\n 'apply',\n 'assoc',\n 'atom',\n 'bind',\n 'car',\n 'cdr',\n 'characterp',\n 'cond',\n 'ceiling',\n 'concatenate',\n 'cons',\n 'consp',\n 'copy',\n 'cos',\n 'count',\n 'floatp',\n 'floor',\n 'defun',\n 'divide',\n 'do',\n 'do*',\n 'dolist',\n 'doublep',\n 'elt',\n 'eq',\n 'equal',\n 'eval',\n 'evenp',\n 'every',\n 'exit',\n 'exp',\n 'expt',\n 'find',\n 'format',\n 'gc',\n 'gensym',\n 'if',\n 'integerp',\n 'lambda',\n 'let',\n 'let*',\n 'last',\n 'length',\n 'list',\n 'listp',\n 'mapcan',\n 'mapcar',\n 'max',\n 'member',\n 'memq',\n 'min',\n 'minusp',\n 'mod',\n 'multiply',\n 'napier',\n 'neq',\n 'nequal',\n 'not',\n 'notrace',\n 'nth',\n 'null',\n 'numberp',\n 'oddp',\n 'or',\n 'pi',\n 'plusp',\n 'pop',\n 'princ',\n 'print',\n 'progn',\n 'push',\n 'quote',\n 'random',\n 'reduce',\n 'round',\n 'rplaca',\n 'rplacd',\n 'setq',\n 'set-allq',\n 'sin',\n 'some',\n 'sort',\n 'sqrt',\n 'string-downcase',\n 'string-trim',\n 'string-upcase',\n 'stringp',\n 'subseq',\n 'substring',\n 'subtract',\n 'symbolp',\n 'tan',\n 'terpri',\n 'time',\n 'trace',\n 'truncate',\n 'unless',\n 'when',\n 'zerop',\n '1+',\n '1-',\n '+',\n '-',\n '*',\n '/',\n '//',\n '=',\n '==',\n '~=',\n '~~',\n '<',\n '<=',\n '>',\n '>=',\n );\n\n for (const each of aList) {\n const aSymbol = InterpretedSymbol.of(each);\n aTable.set(aSymbol, aSymbol);\n }\n\n let aString: string;\n let aCons: Cons;\n aString =\n '(lambda (list1 list2) (cond ((null (listp list1)) nil) ((null (listp list2)) nil) ((null list1) list2) (t (cons (car list1) (append (cdr list1) list2)))))';\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('append'), aCons);\n\n aString =\n '(lambda (l n) (cond ((<= (length l) n) nil) (t (cons (car l) (butlast (cdr l) n)))))';\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('butlast'), aCons);\n\n aString =\n '(lambda (n l) (cond ((> n (length l)) nil) ((= 0 n) l) (t (nthcdr (- n 1) (cdr l)))))';\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('nthcdr'), aCons);\n\n aString =\n \"(lambda (l) (cond ((null (listp l)) l) ((null l) '()) (t (append (reverse (cdr l)) (list (car l))))))\";\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('reverse'), aCons);\n\n aTable.set(InterpretedSymbol.of('t'), InterpretedSymbol.of('t'));\n\n return aTable;\n }\n}\n","import { createRequire } from 'node:module';\nimport type { Interface as ReadlineInterface } from 'node:readline';\n\nimport { Cons } from '../../value/Cons/index.js';\nimport { ExitError } from '../../errors/ExitError/index.js';\nimport { KeiLispError } from '../../errors/KeiLispError/index.js';\nimport { LispInterpreter } from '../LispInterpreter/index.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * @class\n * @classdesc Interactive REPL wrapper around LispInterpreter. Handles line accumulation, parenthesis balancing, and prompt I/O.\n * @author Keisuke Ikeda\n * @this {Repl}\n */\nexport class Repl extends Object {\n /**\n * The underlying interpreter used to parse and evaluate user input.\n */\n interpreter: LispInterpreter;\n /**\n * The Node.js readline interface that supplies prompt I/O.\n */\n rl: ReadlineInterface;\n\n /**\n * Constructor.\n * @constructor\n * @param interpreter the interpreter to evaluate input against (defaults to a fresh one)\n */\n constructor(interpreter: LispInterpreter = new LispInterpreter()) {\n super();\n this.interpreter = interpreter;\n\n const readline = require('node:readline') as typeof import('node:readline');\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: '>> ',\n });\n }\n\n /**\n * Starts the REPL loop.\n * @return void\n */\n run(): void {\n let aString = '';\n let leftParentheses = 0;\n let exitedViaLisp = false;\n\n this.rl.prompt();\n this.rl\n .on('line', (line: string) => {\n line += ' ';\n\n for (const aCharacter of line) {\n if (aCharacter === '(') {\n leftParentheses++;\n }\n if (aCharacter === ')') {\n leftParentheses--;\n }\n aString += aCharacter;\n }\n\n if (leftParentheses <= 0) {\n try {\n const aCons = this.interpreter.parse(aString);\n for (const each of aCons.loop()) {\n process.stdout.write(\n (this.interpreter.eval(each) as { toString(): string }).toString() + '\\n',\n );\n }\n } catch (error) {\n if (error instanceof ExitError) {\n exitedViaLisp = true;\n this.rl.close();\n return;\n }\n if (error instanceof KeiLispError) {\n console.error(`*** ${error.name}: ${error.message} ***`);\n process.stdout.write(Cons.nil.toString() + '\\n');\n } else {\n throw error;\n }\n }\n leftParentheses = 0;\n aString = '';\n this.rl.prompt();\n }\n })\n .on('close', () => {\n // Skip the message if (exit) was called, since Evaluator.exit() already printed \"Bye!\".\n if (!exitedViaLisp) {\n console.log('\\nBye!');\n }\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#intern","#generateNumber"],"sources":["../src/runtime/Table/index.ts","../src/value/InterpretedSymbol/index.ts","../src/value/Loop/index.ts","../src/parser/IntStream/index.ts","../src/errors/KeiLispError/index.ts","../src/errors/ParseError/index.ts","../src/parser/NextState/index.ts","../src/parser/Parser/index.ts","../src/value/Cons/index.ts","../src/errors/EvalError/index.ts","../src/constants/index.ts","../src/runtime/Applier/index.ts","../src/errors/ExitError/index.ts","../src/runtime/StreamManager/index.ts","../src/runtime/Evaluator/index.ts","../src/interpreter/LispInterpreter/index.ts","../src/interpreter/Repl/index.ts"],"sourcesContent":["import { Cons } from '../../value/Cons/index.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Class that manages bindings of interpreted symbols.\n * @author Keisuke Ikeda\n * @this {Table}\n */\nexport class Table extends Map<unknown, LispValue> {\n /**\n * The enclosing (parent) environment, or null when this is the root.\n */\n source: Table | null;\n /**\n * Whether this environment is the root of its chain.\n */\n root: boolean;\n\n /**\n * Constructor.\n * @constructor\n * @param aTable the environment in which this environment was created\n */\n constructor(aTable: Table | null = null) {\n super();\n this.source = aTable;\n this.root = aTable == null;\n }\n\n /**\n * Clones this Table and returns the clone.\n * @return the cloned Table\n */\n clone(): Table {\n const aTable = new Table(this);\n for (const key of this.keys()) {\n const value = Cons.cloneValue(this.get(key));\n if (value == null) {\n throw new Error('RuntimeException!');\n }\n aTable.set(key, value);\n }\n\n return aTable;\n }\n\n /**\n * Returns whether anything is bound to the given property (key).\n * @param aSymbol the symbol to look up\n * @return true if a binding exists in this scope or any enclosing scope\n */\n override has(aSymbol: unknown): boolean {\n if (super.has(aSymbol)) {\n return true;\n }\n if (this.isRoot()) {\n return false;\n }\n\n // source is guaranteed non-null when isRoot=false (the constructor sets root=true iff aTable is null).\n return (this.source as Table).has(aSymbol);\n }\n\n /**\n * Returns whether this instance equals the given object.\n * @param anObject the object to compare against\n * @return true when the underlying Map.equals would return true\n */\n equals(anObject: unknown): boolean {\n // Kept for interface uniformity with Cons.equals / InterpretedSymbol.equals.\n // Delegates to Map.prototype.equals which does not exist in JS (throws TypeError).\n return (Map.prototype as unknown as { equals(o: unknown): boolean }).equals(anObject);\n }\n\n /**\n * Returns the value bound to the given interpreted symbol, walking up the scope chain.\n * @param aSymbol the symbol to look up\n * @return the bound value, or null when no binding exists\n */\n override get(aSymbol: unknown): LispValue {\n if (super.has(aSymbol)) {\n return super.get(aSymbol) as LispValue;\n }\n if (this.isRoot()) {\n return null;\n }\n\n // source is guaranteed non-null when isRoot=false.\n return (this.source as Table).get(aSymbol);\n }\n\n /**\n * Returns whether this instance is the root of the environment chain.\n * @return true if this is the root environment\n */\n isRoot(): boolean {\n return this.root;\n }\n\n /**\n * Reassigns the symbol bound in the innermost scope (equivalent to Common Lisp's setq). If a binding exists in the current scope, update it and return; otherwise recurse into the parent scope.\n * @param aSymbol the symbol to update\n * @param anObject the new bound value\n * @return the new bound value, or null when no enclosing scope has a binding\n */\n setIfExist(aSymbol: unknown, anObject: LispValue): LispValue {\n if (super.has(aSymbol)) {\n this.set(aSymbol, anObject);\n return anObject;\n }\n if (this.isRoot()) {\n return null;\n }\n return (this.source as Table).setIfExist(aSymbol, anObject);\n }\n\n /**\n * Sets whether this instance is the root of its environment chain.\n * @param aBoolean the new root flag\n * @return null\n */\n setRoot(aBoolean: boolean): null {\n this.root = aBoolean;\n return null;\n }\n\n /**\n * Sets the parent environment.\n * @param aTable the new parent environment (or null)\n * @return null\n */\n setSource(aTable: Table | null): null {\n this.source = aTable;\n return null;\n }\n\n /**\n * Returns a formatted string representation of this instance.\n * @return the formatted string\n */\n override toString(): string {\n return '#<Environment>';\n }\n}\n","import { Table } from '../../runtime/Table/index.js';\n\n/**\n * @class\n * @classdesc Interpreted symbol with uniqueness, where each printed name maps to a single canonical instance (identity equals equality). A class that mimics canonical strings, distinct from JS's standard Symbol.\n * @author Keisuke Ikeda\n * @this {InterpretedSymbol}\n */\nexport class InterpretedSymbol extends Object {\n /**\n * Table that stores InterpretedSymbol instances (lazily initialized to avoid a circular dependency).\n */\n static #intern: Table | null = null;\n /**\n * Lazy accessor for the intern table that holds every InterpretedSymbol instance.\n * @return the intern Table (created on first access)\n */\n static get table(): Table {\n this.#intern ??= new Table();\n return this.#intern;\n }\n\n /**\n * The printed name of this symbol.\n */\n name: string;\n\n /**\n * Constructor.\n * @constructor\n * @param name printed name\n */\n constructor(name: string = 'null') {\n super();\n this.name = name;\n }\n\n /**\n * Compares this interpreted symbol with the given one by printed name.\n * @param aSymbol the symbol to compare against\n * @return the difference in string length\n */\n compareTo(aSymbol: InterpretedSymbol): number {\n const left = this.name.codePointAt(0) ?? 0;\n const right = aSymbol.name.codePointAt(0) ?? 0;\n let aNumber = left < right ? aSymbol.name.length - left : left - aSymbol.name.length;\n aNumber = left === right ? 0 : aNumber;\n\n return aNumber;\n }\n\n /**\n * Returns whether this symbol equals the given object.\n * @param anObject the object to compare against\n * @return true when identity-equal (since intern guarantees uniqueness)\n */\n equals(anObject: unknown): boolean {\n return this === anObject;\n }\n\n /**\n * Returns the same interpreted symbol for a given printed name.\n * @param aString printed name\n * @return the canonical InterpretedSymbol for that name\n */\n static of(aString: string): InterpretedSymbol {\n let aSymbol = this.table.get(aString) as InterpretedSymbol | null;\n\n if (aSymbol == null) {\n aSymbol = new InterpretedSymbol(aString);\n this.table.set(aString, aSymbol);\n }\n\n return aSymbol;\n }\n\n /**\n * Returns the string representation of this symbol.\n * @return the printed name\n */\n override toString(): string {\n return this.name;\n }\n}\n","import type { Cons } from '../Cons/index.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Iterator class for Cons.\n * @author Keisuke Ikeda\n * @this {Loop}\n */\nexport class Loop extends Object {\n /**\n * The Cons being iterated over.\n */\n aCons: Cons;\n /**\n * The number of elements in the underlying Cons (computed once at construction time).\n */\n length: number;\n /**\n * The 1-based index of the next element to return.\n */\n index: number;\n\n /**\n * Constructor.\n * @constructor\n * @param aCons the Cons to iterate over\n */\n constructor(aCons: Cons) {\n super();\n this.aCons = aCons;\n this.length = aCons.length();\n this.index = 1;\n }\n\n /**\n * Returns this instance so it can be used as its own iterator.\n * @return this Loop instance\n */\n iterator(): this {\n return this;\n }\n\n /**\n * Returns whether a next element exists.\n * @return true if there is at least one more element\n */\n hasNext(): boolean {\n return this.index <= this.length;\n }\n\n /**\n * Returns the next element and advances the cursor.\n * @return the element at the current index\n */\n next(): LispValue {\n const anObject = this.aCons.nth(this.index);\n this.remove();\n\n return anObject;\n }\n\n /**\n * Implementation of the iterable protocol. Enables iteration with for...of and similar constructs.\n * @return an iterator over the Cons elements\n */\n [Symbol.iterator](): Iterator<LispValue> {\n return {\n next: (): IteratorResult<LispValue> => {\n if (this.index <= this.length) {\n const nextValue = this.aCons.nth(this.index);\n this.remove();\n return { value: nextValue, done: false };\n }\n return { done: true } as IteratorResult<LispValue>;\n },\n };\n }\n\n /**\n * Implementation of the async iterable protocol. Enables iteration with for await...of and similar constructs.\n * @return an async iterator over the Cons elements\n */\n [Symbol.asyncIterator](): AsyncIterator<LispValue> {\n return {\n next: (): Promise<IteratorResult<LispValue>> => {\n if (this.index <= this.length) {\n const nextValue = this.aCons.nth(this.index);\n this.remove();\n return Promise.resolve({ value: nextValue, done: false });\n }\n return Promise.resolve({ done: true } as IteratorResult<LispValue>);\n },\n };\n }\n\n /**\n * Advances the cursor to the next element.\n * @return null\n */\n remove(): null {\n this.index++;\n return null;\n }\n}\n","/**\n * @class\n * @classdesc Class that mimics Java's IntStream.\n * @author Keisuke Ikeda\n * @this {IntStream}\n */\nexport class IntStream extends Object {\n /**\n * Builds and returns an array of consecutive integers from start to afterEnd (exclusive).\n * @param start the first integer (inclusive)\n * @param afterEnd the integer one past the last value to include\n * @return the array of integers in [start, afterEnd)\n */\n static range(start: number, afterEnd: number): number[] {\n const end = afterEnd - 1;\n return this.rangeClosed(start, end);\n }\n\n /**\n * Builds and returns an array of consecutive integers from start to end (inclusive).\n * @param start the first integer (inclusive)\n * @param end the last integer (inclusive)\n * @return the array of integers in [start, end]\n */\n static rangeClosed(start: number, end: number): number[] {\n const range = end - start + 1;\n return Array.from({ length: range }, () => start++);\n }\n}\n","/**\n * @class\n * @classdesc Base class for all errors raised by kei-lisp during parsing or evaluation. Catch this to handle any Lisp-level failure without intercepting an unrelated runtime error or an `ExitError` (which signals a graceful `(exit)` and is intentionally not a subclass).\n * @author Keisuke Ikeda\n * @this {KeiLispError}\n */\nexport class KeiLispError extends Error {\n /**\n * Constructor.\n * @constructor\n * @param message human-readable diagnostic message\n */\n constructor(message: string) {\n super(message);\n this.name = 'KeiLispError';\n }\n}\n","import { KeiLispError } from '../KeiLispError/index.js';\n\n/**\n * @class\n * @classdesc Error raised when the parser cannot turn a source string into an AST. Subclass of `KeiLispError`.\n * @author Keisuke Ikeda\n * @this {ParseError}\n */\nexport class ParseError extends KeiLispError {\n /**\n * Constructor.\n * @constructor\n * @param message human-readable diagnostic message\n */\n constructor(message: string) {\n super(message);\n this.name = 'ParseError';\n }\n}\n","import { ParseError } from '../../errors/ParseError/index.js';\nimport type { Parser } from '../Parser/index.js';\n\n/**\n * @class\n * @classdesc Class that holds the next state.\n * @author Keisuke Ikeda\n * @this {NextState}\n */\nexport class NextState extends Object {\n /**\n * The parser whose method will be invoked. Set on each call to `next`.\n */\n automaton: Parser | null = null;\n /**\n * The fallback state number returned when no method is configured (or as the initial value).\n */\n nextState: number | null;\n /**\n * Cached reference to the resolved method (kept as `unknown` because lookup happens by name).\n */\n method: unknown;\n /**\n * The name of the parser method to invoke, or null if only `nextState` should be returned.\n */\n methodName: string | null;\n\n /**\n * Constructor.\n * @constructor\n * @param aNumber the fallback state number (or null)\n * @param aString the parser method name to invoke (or null)\n */\n constructor(aNumber: number | null, aString: string | null) {\n super();\n this.nextState = aNumber;\n this.method = null;\n this.methodName = aString;\n }\n\n /**\n * Invokes the method corresponding to the input character and returns the resulting token number.\n * @param anAutomaton the parser to invoke the method on\n * @return the next state number\n */\n next(anAutomaton: Parser): number {\n this.automaton = anAutomaton;\n if (this.methodName == null) {\n return Number(this.nextState);\n }\n if (this.method == null) {\n try {\n this.method = (this.automaton as unknown as Record<string, unknown>)[this.methodName];\n } catch {\n throw new ParseError('Not Found Method: ' + this.methodName);\n }\n }\n\n let aNumber = -1;\n try {\n if (this.nextState != null) {\n aNumber = this.nextState;\n }\n const anObject = (this.automaton as unknown as Record<string, () => unknown>)[\n this.methodName\n ]();\n if (anObject != null) {\n aNumber = Number(anObject);\n }\n } catch (error) {\n // Preserve Lisp-domain parse errors; wrap anything else (e.g. TypeError from\n // a malformed grammar table) as a ParseError so library users see the same family.\n if (error instanceof ParseError) throw error;\n throw new ParseError(`Not Invoke Method: ${this.methodName}`);\n }\n\n return aNumber;\n }\n}\n","import { Cons } from '../../value/Cons/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport { IntStream } from '../IntStream/index.js';\nimport { NextState } from '../NextState/index.js';\nimport { ParseError } from '../../errors/ParseError/index.js';\nimport type { LispValue } from '../../types/index.js';\n\nconst PEEKCOUNT = 10;\nconst SYNTAX_ERROR = 'Syntax Error!';\n\n/**\n * @class\n * @classdesc Class that performs parsing (syntactic analysis).\n * @author Keisuke Ikeda\n * @this {Parser}\n */\nexport class Parser extends Object {\n /**\n * Iterator over the input source characters.\n */\n stream: Iterator<string>;\n /**\n * The most recently produced parse token (a value or sub-Cons).\n */\n token: LispValue;\n /**\n * The accumulator for the current literal being read (number, symbol, string).\n */\n tokenString: string;\n /**\n * The state transition table: current state -> (input code point string -> NextState).\n */\n states: Map<number, Map<string, NextState>>;\n /**\n * The current automaton state number.\n */\n state: number;\n /**\n * The look-ahead buffer of characters (size `PEEKCOUNT + 1`).\n */\n nexts: Array<string | null>;\n\n /**\n * Constructor.\n * @constructor\n * @param aString the string to parse\n */\n constructor(aString: string) {\n super();\n this.stream = aString[Symbol.iterator]();\n this.token = null;\n this.tokenString = '';\n this.states = new Map();\n this.state = 0;\n this.nexts = Array.from({ length: PEEKCOUNT + 1 }, (): string | null => null);\n this.initializeStateTransitionTable();\n let count = 0;\n while (count++ < PEEKCOUNT) {\n this.nextChar();\n }\n }\n\n /**\n * Returns whether this is the last element.\n * @return true if there are no more characters to read\n */\n atEnd(): boolean {\n return this.peekChar() == null;\n }\n\n /**\n * Concatenates the current character into the token string.\n * @return null\n */\n concatCharacter(): null {\n this.tokenString = this.tokenString.concat(String(this.nexts[0]));\n return null;\n }\n\n /**\n * Parses a single character of the input string.\n * @param aCharacter the character to feed into the automaton; defaults to the next character\n * @return the token produced so far (may be null if still accumulating)\n */\n input(aCharacter: string | null = this.nextChar()): LispValue {\n // Following the original: throws TypeError on .has when inputs is undefined.\n const inputs = this.states.get(this.state) as Map<string, NextState>;\n\n // Following the original: throws TypeError on codePointAt when aCharacter is null.\n const codePoint = (aCharacter as string).codePointAt(0) ?? 0;\n const aNumber = inputs.has(String(codePoint))\n ? (inputs.get(String(codePoint)) as NextState).next(this)\n : (inputs.get(String(128)) as NextState).next(this);\n\n if (aNumber < 0) {\n throw new ParseError(SYNTAX_ERROR);\n }\n this.state = aNumber;\n\n return this.token;\n }\n\n /**\n * Returns the next character to be parsed from the input string.\n * @return the next character, or null at end of input\n */\n nextChar(): string | null {\n let aCharacter: string | null = null;\n try {\n const aNumber = (this.stream.next().value as string | undefined)?.codePointAt(0) ?? -1;\n if (aNumber >= 0) {\n aCharacter = String.fromCodePoint(aNumber);\n }\n } catch {\n throw new ParseError('Read Error!');\n }\n\n let count = 0;\n while (count < PEEKCOUNT) {\n this.nexts[count] = this.nexts[count + 1];\n count++;\n }\n this.nexts[count] = aCharacter;\n\n return this.nexts[0];\n }\n\n /**\n * Determines and returns the next token.\n * @return the next parsed token\n */\n nextToken(): LispValue {\n this.token = null;\n let token: LispValue = null;\n\n while (!this.atEnd()) {\n if (this.state === 0 && token != null) {\n break;\n }\n token = this.input();\n }\n if (this.atEnd() && this.state !== 0) {\n throw new ParseError(SYNTAX_ERROR);\n }\n this.tokenString = '';\n\n return token;\n }\n\n /**\n * Instantiates and returns a NextState.\n * @param aNumber the fallback state number (or null)\n * @param aString the parser method name (or null)\n * @return the new NextState\n */\n nextState(aNumber: number | null, aString: string | null): NextState {\n return new NextState(aNumber, aString);\n }\n\n /**\n * Parses the given string and returns the result.\n * @param aString the source string\n * @return the parsed value\n */\n static parse(aString: string): LispValue {\n return new Parser(aString).nextToken();\n }\n\n /**\n * Returns the next character if one exists.\n * @param aNumber 1-based offset into the look-ahead buffer\n * @return the character at that offset, or null if not present\n */\n peekChar(aNumber: number = 1): string | null {\n if (aNumber > this.nexts.length) {\n throw new ParseError('Read Error!');\n }\n return this.nexts[aNumber];\n }\n\n /**\n * Concatenates characters; invoked from NextState.\n * @return null\n */\n concat(): null {\n this.concatCharacter();\n return null;\n }\n\n /**\n * Concatenates the current character after translating common escape sequences\n * (`\\n`, `\\t`, `\\r`, `\\\\`, `\\\"`) into their actual characters. Invoked from NextState\n * inside a string literal after a backslash. Unknown escapes pass through as the\n * literal character (e.g. `\\x` becomes `x`).\n * @return null\n */\n escapeConcat(): null {\n const c = String(this.nexts[0]);\n const map: Record<string, string> = {\n n: '\\n',\n t: '\\t',\n r: '\\r',\n '\\\\': '\\\\',\n '\"': '\"',\n };\n this.tokenString = this.tokenString.concat(map[c] ?? c);\n return null;\n }\n\n /**\n * Returns the token number for a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return the next state number (3, or 0 when the literal is complete)\n */\n doubleToken(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToDouble();\n return 0;\n }\n\n return 3;\n }\n\n /**\n * Returns the token number for a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return the next state number (5, or 0 when the literal is complete)\n */\n doubleTokenAUX(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToDouble();\n return 0;\n }\n\n return 5;\n }\n\n /**\n * Returns the token number for a Number-type (integer: pseudo-Integer); invoked from NextState.\n * @return the next state number (2, or 0 when the literal is complete)\n */\n integerToken(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToInteger();\n return 0;\n }\n\n return 2;\n }\n\n /**\n * Converts the token into a list (Cons) and returns the token number for a list (Cons); invoked from NextState.\n * @return 0\n */\n parseList(): number {\n this.skippingSpaces();\n if (this.rightParen()) {\n this.nextChar();\n this.token = Cons.nil;\n } else {\n this.token = this.parseListAUX();\n }\n\n return 0;\n }\n\n /**\n * Helper that converts the token into a list (Cons); invoked from NextState.\n * @return the parsed Cons (or its cdr in dotted-pair form)\n */\n parseListAUX(): LispValue {\n this.skippingSpaces();\n if (this.peekChar() === ';') {\n while (this.peekChar() !== '\\n' && this.peekChar() != null) {\n this.nextChar();\n }\n this.nextChar();\n this.skippingSpaces();\n }\n if (this.rightParen()) {\n this.nextChar();\n return Cons.nil;\n } else if (this.peekChar() === '.') {\n this.nextChar();\n this.state = 0;\n const cdr = this.nextToken();\n this.skippingSpaces();\n if (!this.rightParen()) {\n throw new ParseError(SYNTAX_ERROR);\n }\n this.nextChar();\n\n return cdr;\n } else {\n this.state = 0;\n return new Cons(this.nextToken(), this.parseListAUX());\n }\n }\n\n /**\n * Recognizes a quote, wraps the token into a list (Cons), and returns the token number; invoked from NextState.\n * @return 0\n */\n quote(): number {\n const anObject = new Cons(this.nextToken(), Cons.nil);\n this.token = new Cons(InterpretedSymbol.of('quote'), anObject);\n\n return 0;\n }\n\n /**\n * Recognizes a backquote (`` ` ``), wraps the following form into `(quasiquote form)`, and returns the token number; invoked from NextState.\n * @return 0\n */\n quasiquote(): number {\n const anObject = new Cons(this.nextToken(), Cons.nil);\n this.token = new Cons(InterpretedSymbol.of('quasiquote'), anObject);\n\n return 0;\n }\n\n /**\n * Recognizes a comma and wraps the following form into `(unquote form)`, or\n * `(unquote-splicing form)` when the comma is immediately followed by `@`\n * (i.e. `,@`); invoked from NextState.\n * @return 0\n */\n unquote(): number {\n let aSymbol = InterpretedSymbol.of('unquote');\n if (this.peekChar() === '@') {\n this.nextChar();\n aSymbol = InterpretedSymbol.of('unquote-splicing');\n }\n const anObject = new Cons(this.nextToken(), Cons.nil);\n this.token = new Cons(aSymbol, anObject);\n\n return 0;\n }\n\n /**\n * Returns the token number for a quote or for a 0-origin String-type (pseudo-Character); invoked from NextState.\n * @return the next state number\n */\n quoteOrChar(): number {\n let aNumber = this.peekChar() === '\\\\' ? 3 : 2;\n aNumber = this.peekChar(aNumber) === \"'\" ? 11 : this.quote();\n\n return aNumber;\n }\n\n /**\n * Detects a right parenthesis (')', ']', '}') and returns the result; invoked from NextState.\n * @return true when the next character is any right paren\n */\n rightParen(): boolean {\n return this.peekChar() === ')' || this.peekChar() === ']' || this.peekChar() === '}';\n }\n\n /**\n * Returns the token number for a sign symbol ('+', '-'); invoked from NextState.\n * @return the next state number (7, or 0 when the literal is complete)\n */\n sign(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToSymbol();\n return 0;\n }\n return 7;\n }\n\n /**\n * Skips whitespace; invoked from NextState.\n * @return null\n */\n skippingSpaces(): null {\n while (\n this.nexts[1] === String.fromCodePoint(9) ||\n this.nexts[1] === String.fromCodePoint(10) ||\n this.nexts[1] === String.fromCodePoint(11) ||\n this.nexts[1] === String.fromCodePoint(12) ||\n this.nexts[1] === String.fromCodePoint(13) ||\n this.nexts[1] === String.fromCodePoint(32)\n ) {\n this.nextChar();\n }\n\n return null;\n }\n\n /**\n * Returns the token number for an InterpretedSymbol; invoked from NextState.\n * @return the next state number (8, or 0 when the literal is complete)\n */\n symbolToken(): number {\n this.concat();\n if (this.rightParen()) {\n this.tokenToSymbol();\n return 0;\n }\n\n return 8;\n }\n\n /**\n * Converts the token into a 0-origin String-type (pseudo-Character); invoked from NextState.\n * @return null\n */\n tokenToCharacter(): null {\n this.token = this.tokenString.charAt(0);\n return null;\n }\n\n /**\n * Converts the token into a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return null\n */\n tokenToDouble(): null {\n this.token = Number(this.tokenString);\n return null;\n }\n\n /**\n * Converts the token into a Number-type (double-precision floating point: pseudo-Double); invoked from NextState.\n * @return null\n */\n tokenToDoubleAUX(): null {\n this.concat();\n this.token = Number(this.tokenString);\n return null;\n }\n\n /**\n * Converts the token into a Number-type (integer: pseudo-Integer); invoked from NextState.\n * @return null\n */\n tokenToInteger(): null {\n const aCharacter = this.tokenString[0];\n if (aCharacter === '+') {\n this.tokenString = this.tokenString.slice(1);\n }\n this.token = Number(this.tokenString);\n return null;\n }\n\n /**\n * Converts the token into a String-type; invoked from NextState.\n * @return null\n */\n tokenToString(): null {\n this.token = this.tokenString;\n return null;\n }\n\n /**\n * Converts the token into an InterpretedSymbol; invoked from NextState.\n * @return null\n */\n tokenToSymbol(): null {\n this.token = InterpretedSymbol.of(this.tokenString);\n if (this.token === InterpretedSymbol.of('nil')) {\n this.token = Cons.nil;\n }\n return null;\n }\n\n /**\n * Builds the lookup table that maps character codes to their corresponding methods (tokens).\n * @return null\n */\n initializeStateTransitionTable(): null {\n let aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 8))\n aTable.set(String(index), this.nextState(-1, null));\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, null));\n for (const index of IntStream.rangeClosed(14, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(32), this.nextState(0, null));\n aTable.set(String(33), this.nextState(8, 'symbolToken'));\n aTable.set(String(34), this.nextState(9, null));\n aTable.set(String(35), this.nextState(8, 'symbolToken'));\n aTable.set(String(36), this.nextState(8, 'symbolToken'));\n aTable.set(String(37), this.nextState(8, 'symbolToken'));\n aTable.set(String(38), this.nextState(8, 'symbolToken'));\n aTable.set(String(39), this.nextState(-1, 'quoteOrChar'));\n aTable.set(String(40), this.nextState(-1, 'parseList'));\n aTable.set(String(41), this.nextState(-1, null));\n aTable.set(String(42), this.nextState(8, 'symbolToken'));\n aTable.set(String(43), this.nextState(7, 'sign'));\n aTable.set(String(44), this.nextState(0, 'unquote'));\n aTable.set(String(45), this.nextState(7, 'sign'));\n aTable.set(String(46), this.nextState(-1, null));\n aTable.set(String(47), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(2, 'integerToken'));\n for (const index of IntStream.rangeClosed(58, 90))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(59), this.nextState(1, null));\n aTable.set(String(91), this.nextState(-1, 'parseList'));\n aTable.set(String(92), this.nextState(-1, null));\n aTable.set(String(93), this.nextState(-1, null));\n aTable.set(String(94), this.nextState(8, 'symbolToken'));\n aTable.set(String(95), this.nextState(8, 'symbolToken'));\n aTable.set(String(96), this.nextState(0, 'quasiquote'));\n for (const index of IntStream.rangeClosed(97, 122))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(123), this.nextState(-1, 'parseList'));\n aTable.set(String(124), this.nextState(8, 'symbolToken'));\n aTable.set(String(125), this.nextState(-1, null));\n aTable.set(String(126), this.nextState(8, 'symbolToken'));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(0, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 8))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(10), this.nextState(0, null));\n aTable.set(String(13), this.nextState(0, null));\n for (const index of IntStream.rangeClosed(14, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(1, null));\n this.states.set(1, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToInteger'));\n aTable.set(String(32), this.nextState(0, 'tokenToInteger'));\n // `+` / `-` after a digit are not numeric continuations (exponent sign is\n // handled in state 4 after E/e). Route them into the symbol state so that\n // forms like `1+` / `1-` / `1+2` parse as the symbols \"1+\" / \"1-\" / \"1+2\".\n aTable.set(String(43), this.nextState(8, 'symbolToken'));\n aTable.set(String(45), this.nextState(8, 'symbolToken'));\n aTable.set(String(46), this.nextState(3, 'doubleToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(2, 'integerToken'));\n aTable.set(String(69), this.nextState(4, 'concat'));\n aTable.set(String(101), this.nextState(4, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(2, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToDouble'));\n aTable.set(String(32), this.nextState(0, 'tokenToDouble'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(3, 'doubleToken'));\n aTable.set(String(68), this.nextState(0, 'tokenToDoubleAUX'));\n aTable.set(String(69), this.nextState(4, 'concat'));\n aTable.set(String(100), this.nextState(0, 'tokenToDoubleAUX'));\n aTable.set(String(101), this.nextState(4, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(3, aTable);\n\n aTable = new Map<string, NextState>();\n aTable.set(String(43), this.nextState(6, 'concat'));\n aTable.set(String(45), this.nextState(6, 'concat'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(5, 'doubleTokenAUX'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(4, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToDouble'));\n aTable.set(String(32), this.nextState(0, 'tokenToDouble'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(5, 'doubleTokenAUX'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(5, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(5, 'doubleTokenAUX'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(6, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(32), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(33), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(35, 38))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(42, 45))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(47), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(2, 'integerToken'));\n for (const index of IntStream.rangeClosed(58, 90))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(94), this.nextState(8, 'symbolToken'));\n aTable.set(String(95), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(97, 122))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(124), this.nextState(8, 'symbolToken'));\n aTable.set(String(126), this.nextState(8, 'symbolToken'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(7, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(9, 13))\n aTable.set(String(index), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(32), this.nextState(0, 'tokenToSymbol'));\n aTable.set(String(33), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(35, 38))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(42, 45))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(47), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(48, 57))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(58, 90))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(94), this.nextState(8, 'symbolToken'));\n aTable.set(String(95), this.nextState(8, 'symbolToken'));\n for (const index of IntStream.rangeClosed(97, 122))\n aTable.set(String(index), this.nextState(8, 'symbolToken'));\n aTable.set(String(124), this.nextState(8, 'symbolToken'));\n aTable.set(String(126), this.nextState(8, 'symbolToken'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(8, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(34), this.nextState(0, 'tokenToString'));\n aTable.set(String(92), this.nextState(10, null));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(9, 'concat'));\n this.states.set(9, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(0, 31))\n aTable.set(String(index), this.nextState(-1, null));\n aTable.set(String(127), this.nextState(-1, null));\n aTable.set(String(128), this.nextState(9, 'escapeConcat'));\n this.states.set(10, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(32, 38))\n aTable.set(String(index), this.nextState(12, 'concat'));\n for (const index of IntStream.rangeClosed(40, 91))\n aTable.set(String(index), this.nextState(12, 'concat'));\n aTable.set(String(92), this.nextState(13, null));\n for (const index of IntStream.rangeClosed(93, 126))\n aTable.set(String(index), this.nextState(12, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(11, aTable);\n\n aTable = new Map<string, NextState>();\n aTable.set(String(39), this.nextState(0, 'tokenToCharacter'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(12, aTable);\n\n aTable = new Map<string, NextState>();\n for (const index of IntStream.rangeClosed(32, 38))\n aTable.set(String(index), this.nextState(12, 'concat'));\n for (const index of IntStream.rangeClosed(40, 126))\n aTable.set(String(index), this.nextState(12, 'concat'));\n aTable.set(String(128), this.nextState(-1, null));\n this.states.set(13, aTable);\n\n return null;\n }\n}\n","import { InterpretedSymbol } from '../InterpretedSymbol/index.js';\nimport { Loop } from '../Loop/index.js';\nimport { Parser } from '../../parser/Parser/index.js';\nimport { Table } from '../../runtime/Table/index.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Class that mimics a Cons cell.\n * @author Keisuke Ikeda\n * @this {Cons}\n */\nexport class Cons extends Object {\n /**\n * The shared empty-list sentinel. A Cons whose car and cdr are both itself, representing Lisp `nil`.\n */\n static readonly nil: Cons = new Cons();\n\n /**\n * The head element of this Cons cell.\n */\n car: LispValue;\n /**\n * The tail of this Cons cell (typically another Cons or nil).\n */\n cdr: LispValue;\n\n /**\n * Constructor.\n * @constructor\n * @param car the car; defaults to nil when no argument is given.\n * @param cdr the cdr; defaults to nil when no argument is given.\n */\n constructor(car: LispValue = Cons.nil, cdr: LispValue = Cons.nil) {\n super();\n this.car = car;\n this.cdr = cdr;\n }\n\n /**\n * Appends the given element to the end of this Cons.\n * @param anObject the object to append\n * @return the Cons with the element appended\n */\n add(anObject: LispValue): this {\n const aCons = new Cons(anObject, Cons.nil);\n return this.nconc(aCons);\n }\n\n /**\n * Clones this Cons and returns the clone.\n * @return the cloned Cons\n */\n clone(): Cons {\n return new Cons(Cons.cloneValue(this.car), Cons.cloneValue(this.cdr));\n }\n\n /**\n * Clones the given value (a Cons element) and returns the clone.\n * @param value a Cons element\n * @return the cloned element\n */\n static cloneValue(value: LispValue): LispValue {\n if (Cons.isCons(value)) {\n return value.clone();\n }\n if (Cons.isNil(value)) {\n return Cons.nil;\n }\n if (Cons.isNumber(value)) {\n return value;\n }\n if (Cons.isString(value)) {\n return value;\n }\n if (Cons.isSymbol(value)) {\n return value;\n }\n if (Cons.isTable(value)) {\n return value;\n }\n return value;\n }\n\n /**\n * Returns whether this Cons equals the given object.\n * @param anObject the object to compare against\n * @return a boolean\n */\n equals(anObject: LispValue): boolean {\n if (Cons.isCons(anObject)) {\n return this.equalsAUX(this, anObject);\n }\n return false;\n }\n\n /**\n * Returns whether both arguments are Cons cells and are equal.\n * @param left the object to compare\n * @param right the object to compare\n * @return a boolean\n */\n equalsAUX(left: LispValue, right: LispValue): boolean {\n if (left === right) {\n return true;\n }\n if (!(Cons.isCons(left) && Cons.isCons(right))) {\n return false;\n }\n if (this.equalsAUX(left.car, right.car)) {\n return this.equalsAUX(left.cdr, right.cdr);\n }\n\n return false;\n }\n\n /**\n * Returns whether the given argument is an Atom.\n */\n static isAtom(anObject: LispValue): boolean {\n return Cons.isNotCons(anObject);\n }\n\n /**\n * Returns whether the given argument is a Cons.\n */\n static isCons(anObject: LispValue): anObject is Cons {\n return anObject !== Cons.nil && anObject instanceof Cons;\n }\n\n /**\n * Returns whether the given argument is a List.\n */\n static isList(anObject: LispValue): boolean {\n return Cons.isNil(anObject) || Cons.isCons(anObject);\n }\n\n /**\n * Returns whether the given argument is Nil.\n */\n static isNil(anObject: LispValue): boolean {\n return anObject === Cons.nil;\n }\n\n /**\n * Returns whether the given argument is not a Cons.\n */\n static isNotCons(anObject: LispValue): boolean {\n return !Cons.isCons(anObject);\n }\n\n /**\n * Returns whether the given argument is not a List.\n */\n static isNotList(anObject: LispValue): boolean {\n return !Cons.isList(anObject);\n }\n\n /**\n * Returns whether the given argument is not Nil.\n */\n static isNotNil(anObject: LispValue): boolean {\n return !Cons.isNil(anObject);\n }\n\n /**\n * Returns whether the given argument is not an interpreted symbol.\n */\n static isNotSymbol(anObject: LispValue): boolean {\n return !Cons.isSymbol(anObject);\n }\n\n /**\n * Returns whether the given argument is a number.\n */\n static isNumber(anObject: LispValue): anObject is number {\n return typeof anObject === 'number';\n }\n\n /**\n * Returns whether the given argument is a string.\n */\n static isString(anObject: LispValue): anObject is string {\n return typeof anObject === 'string';\n }\n\n /**\n * Returns whether the given argument is an interpreted symbol.\n */\n static isSymbol(anObject: LispValue): anObject is InterpretedSymbol {\n return anObject instanceof InterpretedSymbol;\n }\n\n /**\n * Returns whether the given argument is an environment.\n */\n static isTable(anObject: LispValue): anObject is Table {\n return anObject instanceof Table;\n }\n\n /**\n * Returns the last cell of this Cons.\n * @return this Cons's last cell\n */\n last(): Cons {\n let theCons: Cons = new Cons(Cons.nil, this);\n let aCons: Cons = this;\n\n while (Cons.isCons(aCons)) {\n if (!Cons.isCons(aCons.cdr)) {\n break;\n }\n theCons = theCons.cdr as Cons;\n aCons = aCons.cdr;\n }\n\n return aCons;\n }\n\n /**\n * Returns an iterator over this Cons.\n * @return an iterator over this Cons\n */\n loop(): Loop {\n return new Loop(this);\n }\n\n /**\n * Returns the length (depth) of this Cons.\n * @return the length (depth) of this Cons\n */\n length(): number {\n let count = 0;\n let aCons: LispValue = this;\n\n while (Cons.isCons(aCons)) {\n count++;\n aCons = aCons.cdr;\n }\n\n return count;\n }\n\n /**\n * Concatenates the given Cons and returns this Cons.\n * @param aCons the Cons to concatenate\n * @return this Cons\n */\n nconc(aCons: Cons): this {\n this.last().setCdr(aCons);\n return this;\n }\n\n /**\n * Returns the nth element of this Cons.\n * @param aNumber the index to retrieve\n * @return the element at the given index\n */\n nth(aNumber: number): LispValue {\n if (aNumber <= 0) {\n return Cons.nil;\n }\n let count = 1;\n let aCons: LispValue = this;\n while (Cons.isCons(aCons)) {\n if (count >= aNumber) {\n return aCons.car;\n }\n count++;\n aCons = aCons.cdr;\n }\n\n return Cons.nil;\n }\n\n /**\n * Lexes the given string into a Cons and returns it.\n * @param aString the string to lex\n */\n static parse(aString: string): LispValue {\n return Parser.parse(aString);\n }\n\n /**\n * Sets the car.\n */\n setCar(anObject: LispValue): null {\n this.car = anObject;\n return null;\n }\n\n /**\n * Sets the cdr.\n */\n setCdr(anObject: LispValue): null {\n this.cdr = anObject;\n return null;\n }\n\n /**\n * Sets both the car and the cdr.\n */\n setCons(car: LispValue, cdr: LispValue): this {\n this.car = car;\n this.cdr = cdr;\n return this;\n }\n\n /**\n * Returns a formatted string representation of this Cons.\n */\n override toString(): string {\n let aString = '';\n if (Cons.isNil(this)) {\n aString += Cons.toString(Cons.nil);\n } else {\n aString += '(' + Cons.toString(this.car);\n\n if (Cons.isNil(this.cdr)) {\n aString += ')';\n } else if (this.cdr instanceof Cons) {\n let aCons: LispValue = this.cdr;\n while (Cons.isCons(aCons)) {\n const head = aCons.car;\n if (!(head instanceof Table)) {\n aString += ' ' + Cons.toString(head);\n }\n aCons = aCons.cdr;\n }\n aString += Cons.isNil(aCons) ? ')' : ' . ' + Cons.toString(aCons) + ')';\n } else {\n aString += ' . ' + Cons.toString(this.cdr) + ')';\n }\n }\n\n return aString;\n }\n\n /**\n * Returns a formatted string representation of the given object.\n * @param anObject the object to format\n */\n static override toString(anObject: LispValue): string {\n return Cons.isNil(anObject) ? 'nil' : (anObject as { toString(): string }).toString();\n }\n}\n","import { KeiLispError } from '../KeiLispError/index.js';\n\n/**\n * @class\n * @classdesc Error raised when evaluation or application of a Lisp expression fails (type mismatch, unbound symbol, arity error, etc.). Subclass of `KeiLispError`.\n * @author Keisuke Ikeda\n * @this {EvalError}\n */\nexport class EvalError extends KeiLispError {\n /**\n * Constructor.\n * @constructor\n * @param message human-readable diagnostic message\n */\n constructor(message: string) {\n super(message);\n this.name = 'EvalError';\n }\n}\n","import type { LispValue } from '../types/index.js';\n\n/**\n * User-facing diagnostic message templates emitted by the interpreter.\n * Centralizing them keeps wording consistent and makes future i18n trivial.\n */\n\n/** Builtin/special-form type-mismatch: `Can not apply \"<fn>\" to \"<value>\"`. */\nexport const cannotApply = (fn: string, value: LispValue): string =>\n `Can not apply \"${fn}\" to \"${String(value)}\"`;\n\n/** Symbol argument validation: `\"<value>\" is not symbol`. */\nexport const notSymbol = (value: LispValue): string => `\"${String(value)}\" is not symbol`;\n\n/** Unbound symbol lookup: `I could find no variable binding for <symbol>`. */\nexport const noBinding = (symbol: LispValue): string =>\n `I could find no variable binding for ${String(symbol)}`;\n\n/** Unknown procedure: `I could find no procedure description for <procedure>`. */\nexport const noProcedure = (procedure: LispValue): string =>\n `I could find no procedure description for ${String(procedure)}`;\n\n/** Positional argument validation: `arguments N is not symbol.`. */\nexport const argumentNotSymbol = (position: number): string =>\n `arguments ${String(position)} is not symbol.`;\n\n/** Multi-list arity mismatch. */\nexport const SIZES_DO_NOT_MATCH = 'sizes do not match.';\n\n/** Intentional ungrammatical wording: kept as-is for backward compatibility of error messages. */\nexport const SIZE_DO_NOT_MATCH = 'size do not match.';\n","import { Cons } from '../../value/Cons/index.js';\nimport { EvalError } from '../../errors/EvalError/index.js';\nimport { Evaluator } from '../Evaluator/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport {\n cannotApply,\n noProcedure,\n SIZE_DO_NOT_MATCH,\n SIZES_DO_NOT_MATCH,\n} from '../../constants/index.js';\nimport type { StreamManager } from '../StreamManager/index.js';\nimport { Table } from '../Table/index.js';\nimport type { KeiLispPlugin } from '../../plugin/types.js';\nimport type { LispValue } from '../../types/index.js';\n\nconst SELECT_PRINT_FUNCTION_NOT_DEFINED = 'selectPrintFunction is not defined';\n\n// Splits a string into an array of Unicode code points. Intentional choice over\n// .length / charAt, which would split surrogate pairs (emoji etc.) into halves.\n// eslint-disable-next-line @typescript-eslint/no-misused-spread\nconst toCodePoints = (s: string): string[] => [...s];\n\n/**\n * Class that mimics Lisp's universal function Apply.\n * @class\n * @classdesc\n * @author Keisuke Ikeda\n * @this {Applier}\n */\nexport class Applier extends Object {\n /**\n * Dispatch map from a Lisp function name (InterpretedSymbol) to the name of the Applier method that implements it.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = Applier.setup();\n static #generateNumber = 0;\n\n /**\n * The environment (variable bindings) used while applying procedures.\n */\n environment: Table;\n /**\n * The stream manager used for I/O and spy output.\n */\n streamManager: StreamManager;\n /**\n * The current recursion depth, used for spy indentation.\n */\n depth: number;\n /**\n * Registered plugins forwarded back into Evaluator on recursive evaluation (e.g. `entrustEvaluator`).\n */\n plugins: KeiLispPlugin[];\n\n /**\n * Constructor.\n * @constructor\n * @param aTable the parent environment to extend\n * @param aStreamManager the stream manager for I/O\n * @param aNumber the initial recursion depth\n * @param plugins the plugin chain to forward when re-entering the Evaluator\n */\n constructor(\n aTable: Table,\n aStreamManager: StreamManager,\n aNumber: number,\n plugins: KeiLispPlugin[] = [],\n ) {\n super();\n this.environment = new Table(aTable);\n this.streamManager = aStreamManager;\n this.depth = aNumber;\n this.plugins = plugins;\n }\n\n /**\n * Implementation of the Lisp `abs` function. Returns the absolute value of the given number.\n * @param args the argument Cons containing the target number\n * @return the absolute value\n */\n abs(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.abs(args.car);\n }\n throw new EvalError(cannotApply('abs', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `+` / `add` function. Returns the sum of the given numbers.\n * @param args the argument Cons containing the numbers to add\n * @return the sum of the arguments\n */\n add(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.add_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('add', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the sum starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to add\n * @return the sum of init and all remaining numbers\n */\n add_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result + each;\n } else {\n throw new EvalError(cannotApply('add', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Static entry point that instantiates an Applier and applies the given procedure to the arguments.\n * @param procedure the procedure to apply (a symbol or a lambda Cons)\n * @param args the argument list\n * @param environment the environment to use\n * @param aStreamManager the stream manager for I/O\n * @param depth the current recursion depth\n * @param plugins the plugin chain to forward when re-entering the Evaluator\n * @return the result of applying the procedure\n */\n static override apply(\n procedure: LispValue,\n args: LispValue,\n environment: Table,\n aStreamManager: StreamManager,\n depth: number,\n plugins: KeiLispPlugin[] = [],\n ): LispValue {\n return new Applier(environment, aStreamManager, depth, plugins).apply(procedure, args);\n }\n\n /**\n * Applies the given procedure to the given arguments.\n * @param procedure the procedure to apply (a symbol or a lambda Cons)\n * @param args the argument list\n * @return the result of applying the procedure\n */\n apply(procedure: LispValue, args: LispValue): LispValue {\n if (Cons.isSymbol(procedure)) {\n return this.selectProcedure(procedure, args);\n }\n return this.entrustEvaluator(procedure, args);\n }\n\n /**\n * Implementation of the Lisp `assoc` function. Looks up an association in an association list.\n * @param args the argument Cons containing the key and the association list\n * @return the matching pair, or nil if no match was found\n */\n assoc(args: Cons): LispValue {\n const target = args.car;\n\n if (Cons.isNotCons(args.nth(2))) {\n return Cons.nil;\n }\n const aCons = args.nth(2) as Cons;\n\n for (const each of aCons.loop()) {\n if (Cons.isNotCons(each)) {\n throw new EvalError(cannotApply('assoc', each));\n }\n const eachCons = each as Cons;\n const key = eachCons.car;\n if (this.equal_(new Cons(target, new Cons(key, Cons.nil))) === InterpretedSymbol.of('t')) {\n return eachCons;\n }\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `atom` predicate. Returns t if the argument is an atom, otherwise nil.\n * @param args the argument Cons containing the value to test\n * @return t if atom, nil otherwise\n */\n atom_(args: Cons): LispValue {\n if (Cons.isAtom(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Binds the given parameter symbols to the corresponding argument values in this environment.\n * @param parameter the parameter list (a Cons of symbols, possibly dotted)\n * @param args the argument list to bind to the parameters\n */\n binding(parameter: LispValue, args: LispValue): null {\n if (Cons.isNil(parameter)) {\n return null;\n }\n let aCons = parameter as Cons;\n let theCons = args as Cons;\n\n while (Cons.isNotNil(aCons)) {\n try {\n this.environment.set(aCons.car, theCons.car);\n } catch {\n throw new EvalError(SIZES_DO_NOT_MATCH);\n return null;\n }\n\n if (Cons.isNotCons(aCons.cdr)) {\n break;\n }\n aCons = aCons.cdr as Cons;\n theCons = theCons.cdr as Cons;\n }\n\n if (Cons.isNotList(aCons.cdr) && Cons.isNotNil(aCons.cdr)) {\n try {\n this.environment.set(aCons.cdr, theCons.cdr);\n } catch {\n throw new EvalError(SIZES_DO_NOT_MATCH);\n return null;\n }\n } else if (Cons.isNotNil(aCons.cdr)) {\n // Following the original: the source code references the undefined variable `aList`,\n // so it throws ReferenceError (the intended Error message is never reached).\n throw new ReferenceError('aList is not defined');\n }\n\n return null;\n }\n\n /**\n * Invokes the built-in method associated with the given procedure symbol.\n * @param procedure the symbol naming the built-in function\n * @param args the argument list\n * @return the result of the built-in function\n */\n buildInFunction(procedure: InterpretedSymbol, args: LispValue): LispValue {\n if (this.isSpy(procedure)) {\n this.spyPrint(this.streamManager.spyStream(procedure), new Cons(procedure, args).toString());\n this.setDepth(this.depth + 1);\n }\n\n const methodName = Applier.buildInFunctions.get(procedure) as string;\n\n const target = this as unknown as Record<string, unknown>;\n const fn = target[methodName];\n if (typeof fn !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n const answer = (fn as (a: LispValue) => LispValue).apply(target, [args]);\n\n if (this.isSpy(procedure)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(procedure),\n String(answer) + ' <== ' + new Cons(procedure, args).toString(),\n );\n }\n\n return answer;\n }\n\n /**\n * Implementation of the Lisp `car` function. Returns the car of the given Cons.\n * @param args the argument Cons containing the target Cons\n * @return the car of the target\n */\n car(args: Cons): LispValue {\n return (args.car as Cons).car;\n }\n\n /**\n * Implementation of the Lisp `cdr` function. Returns the cdr of the given Cons.\n * @param args the argument Cons containing the target Cons\n * @return the cdr of the target\n */\n cdr(args: Cons): LispValue {\n return (args.car as Cons).cdr;\n }\n\n /**\n * Implementation of the Lisp `characterp` predicate. Returns t if the argument is a single-character string.\n * @param args the argument Cons containing the value to test\n * @return t if a character, nil otherwise\n */\n character_(args: Cons): LispValue {\n if (Cons.isString(args.car) && args.car.length === 1) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `cons` function. Constructs a new Cons from the given car and cdr.\n * @param args the argument Cons containing the car and cdr\n * @return the newly constructed Cons\n */\n cons(args: Cons): LispValue {\n return new Cons(args.car, args.nth(2));\n }\n\n /**\n * Implementation of the Lisp `consp` predicate. Returns t if the argument is a Cons, otherwise nil.\n * @param args the argument Cons containing the value to test\n * @return t if a Cons, nil otherwise\n */\n cons_(args: Cons): LispValue {\n if (Cons.isCons(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `copy` function. Returns a deep clone of the given value.\n * @param args the argument Cons containing the value to copy\n * @return the cloned value\n */\n copy(args: Cons): LispValue {\n return Cons.cloneValue(args.car);\n }\n\n /**\n * Implementation of the Lisp `cos` function. Returns the cosine of the given number.\n * @param args the argument Cons containing the angle in radians\n * @return the cosine of the argument\n */\n cos(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.cos(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Implementation of the Lisp `/` / `divide` function. Returns the quotient of the given numbers.\n * @param args the argument Cons containing the numbers to divide\n * @return the quotient of the arguments\n */\n divide(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.divide_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('divide', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the quotient starting from an initial number and the remaining argument list.\n * @param init the initial number (numerator)\n * @param args the remaining numbers to divide by\n * @return the quotient of init divided by all remaining numbers\n */\n divide_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result / each;\n } else {\n throw new EvalError(cannotApply('divide', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Delegates evaluation of a lambda body to the Evaluator after binding its parameters.\n * @param procedure the lambda Cons to apply\n * @param args the argument list to bind to the lambda's parameters\n * @return the result of evaluating the lambda body\n */\n entrustEvaluator(procedure: LispValue, args: LispValue): LispValue {\n let anObject: LispValue = Cons.nil;\n let aCons = (procedure as Cons).cdr as Cons;\n this.binding(aCons.car, args);\n aCons = aCons.cdr as Cons;\n\n for (const each of aCons.loop()) {\n if (each instanceof Table) {\n break;\n }\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n\n // NOTE: Implements Common Lisp's eq as JS strict identity (===). Symbols are eq because\n // InterpretedSymbol.of interns by name; numbers / strings are eq because JS primitive\n // equality is by value; Cons / Table / other objects are eq only when they are the same\n // reference. Edge cases: NaN is never eq to itself (matches IEEE 754 and most CL\n // implementations); +0 and -0 are eq (CL leaves this implementation-defined).\n /**\n * Implementation of the Lisp `eq` predicate. Returns t when both arguments are identical (JS `===`).\n * @param args the argument Cons containing the two values to compare\n * @return t when identical, nil otherwise\n */\n eq_(args: Cons): LispValue {\n const first = args.car;\n const second = args.nth(2);\n if (first === second) {\n return InterpretedSymbol.of('t');\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `equal` / `=` predicate. Returns t when both arguments are structurally equal.\n * @param args the argument Cons containing the two values to compare\n * @return t when equal, nil otherwise\n */\n equal_(args: Cons): LispValue {\n const first = args.car;\n const second = args.nth(2);\n if (this.eq_(args) === InterpretedSymbol.of('t')) {\n return InterpretedSymbol.of('t');\n }\n if (Cons.isCons(first) && Cons.isCons(second)) {\n if (first.equals(second)) {\n return InterpretedSymbol.of('t');\n }\n if (second.equals(first)) {\n return InterpretedSymbol.of('t');\n }\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `exp` function. Returns e raised to the given power.\n * @param args the argument Cons containing the exponent\n * @return e raised to the given power\n */\n exp(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.exp(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Implementation of the Lisp `format` function. Writes a formatted string to standard output.\n * @param args the argument Cons containing the format string followed by its arguments\n * @return nil\n */\n format(args: Cons): LispValue {\n if (!Cons.isString(args.car)) {\n throw new EvalError(cannotApply('format', args.car));\n }\n const aCons = args.cdr;\n const format = this.format_AUX(args.car, aCons);\n process.stdout.write(String(format));\n\n return Cons.nil;\n }\n\n /**\n * Helper that expands the given format string with the supplied arguments.\n * @param format the format string containing directives such as `~a`, `~%`, and width specifiers\n * @param aCons the argument list to interpolate into the directives\n * @return the formatted string\n */\n format_AUX(format: string, aCons: LispValue): string | undefined {\n let theCons: LispValue = aCons;\n let index = 0;\n let state = 0;\n let buffer = '';\n let token = '';\n\n while (index < format.length) {\n const aCharacter = format[index];\n switch (state) {\n case 0: {\n if (aCharacter === '~') {\n state = 1;\n } else {\n buffer += aCharacter;\n }\n\n break;\n }\n case 1: {\n switch (aCharacter) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n token += aCharacter;\n state = 2;\n break;\n }\n case 'a': {\n // Following the original: calls theCons.car.toString() directly (throws if null).\n buffer += ((theCons as Cons).car as { toString(): string }).toString();\n theCons = (theCons as Cons).cdr;\n state = 0;\n break;\n }\n case '%': {\n buffer += '\\n';\n state = 0;\n break;\n }\n case '-': {\n state = 3;\n break;\n }\n default: {\n buffer += '~';\n buffer += aCharacter;\n state = 0;\n }\n }\n\n break;\n }\n case 2: {\n switch (aCharacter) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n token += aCharacter;\n state = 2;\n break;\n }\n case 'a': {\n const size = Number(token);\n token = '';\n if (Cons.isNil(theCons)) {\n throw new EvalError(SIZE_DO_NOT_MATCH);\n return undefined;\n }\n let value: string = ((theCons as Cons).car as { toString(): string }).toString();\n theCons = (theCons as Cons).cdr;\n while (value.length < size) {\n value += ' ';\n }\n buffer += value;\n state = 0;\n break;\n }\n default: {\n buffer += '~';\n buffer += token + aCharacter;\n token = '';\n state = 0;\n }\n }\n\n break;\n }\n case 3: {\n switch (aCharacter) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n token += aCharacter;\n state = 3;\n break;\n }\n case 'a': {\n const size = Number(token);\n token = '';\n if (Cons.isNil(theCons)) {\n throw new EvalError(SIZE_DO_NOT_MATCH);\n return undefined;\n }\n const value: string = ((theCons as Cons).car as { toString(): string }).toString();\n theCons = (theCons as Cons).cdr;\n let spaces = '';\n while (value.length + spaces.length < size) {\n spaces += ' ';\n }\n buffer += spaces + value;\n state = 0;\n break;\n }\n default: {\n buffer += '~';\n buffer += '-';\n buffer += token + aCharacter;\n token = '';\n state = 0;\n }\n }\n\n break;\n }\n default: {\n throw new EvalError(`unknown format directive: ~${aCharacter}`);\n }\n }\n index++;\n }\n if (Cons.isNotNil(theCons)) {\n throw new EvalError(SIZE_DO_NOT_MATCH);\n return undefined;\n }\n\n return buffer;\n }\n\n // Common Lisp's floatp is a type-tag predicate (integer vs float), but JS has only one\n // numeric type (double). Approximated here as a range check: \"is this number representable\n // in IEEE 32-bit (single-precision) float?\". Revisit if numeric types are split.\n /**\n * Implementation of the Lisp `floatp` predicate. Returns t if the argument is a number representable as IEEE 32-bit float.\n * @param args the argument Cons containing the value to test\n * @return t if a float, nil otherwise\n */\n float_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && -3.4e38 <= args.car && args.car <= 3.4e38) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `gensym` function. Generates a fresh, unique symbol.\n * @return a new, unique InterpretedSymbol\n */\n gensym(): InterpretedSymbol {\n const aSymbol = InterpretedSymbol.of('id' + String(Applier.#generateNumber));\n Applier.incrementGenerateNumber();\n\n return aSymbol;\n }\n\n /**\n * Returns the appropriate stream for the given object.\n * @param anObject the object used to select the stream\n * @return the selected stream\n */\n getStream(anObject: LispValue): unknown {\n if (typeof anObject === 'string') {\n return (process as unknown as { out?: unknown }).out;\n }\n\n return this.streamManager.getStream();\n }\n\n /**\n * Implementation of the Lisp `>` / `greaterThan` predicate. Returns t when arguments are in strictly decreasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is greater than the next, nil otherwise\n */\n greaterThan(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.greaterThan_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('>', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `>` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when strictly decreasing, nil otherwise\n */\n greaterThan_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue > rightValue;\n } else {\n throw new EvalError(cannotApply('>', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `>=` / `greaterThanOrEqual` predicate. Returns t when arguments are in non-increasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is greater than or equal to the next, nil otherwise\n */\n greaterThanOrEqual(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.greaterThanOrEqual_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('>=', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `>=` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when non-increasing, nil otherwise\n */\n greaterThanOrEqual_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue >= rightValue;\n } else {\n throw new EvalError(cannotApply('>=', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Increments the internal counter used by `gensym` to ensure uniqueness.\n */\n static incrementGenerateNumber(): null {\n Applier.#generateNumber++;\n return null;\n }\n\n /**\n * Returns a string of indentation used as a prefix for spy output, based on the current depth.\n * @return the indentation string\n */\n indent(): string {\n let index = 0;\n let aString = '';\n while (index++ < this.depth) {\n aString += '| ';\n }\n\n return aString;\n }\n\n /**\n * Implementation of the Lisp `integerp` predicate. Returns t if the argument is an integer.\n * @param args the argument Cons containing the value to test\n * @return t if an integer, nil otherwise\n */\n integer_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && Number.isInteger(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `evenp` predicate. Returns t if the argument is an even integer.\n * @param args the argument Cons containing the value to test\n * @return t if even, nil otherwise\n */\n even_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && Number.isInteger(args.car) && args.car % 2 === 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `oddp` predicate. Returns t if the argument is an odd integer.\n * @param args the argument Cons containing the value to test\n * @return t if odd, nil otherwise\n */\n odd_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && Number.isInteger(args.car) && args.car % 2 !== 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `zerop` predicate. Returns t if the argument equals zero.\n * @param args the argument Cons containing the value to test\n * @return t if zero, nil otherwise\n */\n zero_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && args.car === 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `plusp` predicate. Returns t if the argument is strictly positive.\n * @param args the argument Cons containing the value to test\n * @return t if positive, nil otherwise\n */\n plus_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && args.car > 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `minusp` predicate. Returns t if the argument is strictly negative.\n * @param args the argument Cons containing the value to test\n * @return t if negative, nil otherwise\n */\n minus_(args: Cons): LispValue {\n if (Cons.isNumber(args.car) && args.car < 0) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `1+` function. Returns the argument incremented by one.\n * @param args the argument Cons containing the target number\n * @return the argument plus one\n */\n oneplus(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return args.car + 1;\n }\n throw new EvalError(cannotApply('1+', args.car));\n }\n\n /**\n * Implementation of the Lisp `1-` function. Returns the argument decremented by one.\n * @param args the argument Cons containing the target number\n * @return the argument minus one\n */\n oneminus(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return args.car - 1;\n }\n throw new EvalError(cannotApply('1-', args.car));\n }\n\n /**\n * Implementation of the Lisp `expt` function. Returns the base raised to the exponent.\n * @param args the argument Cons containing the base followed by the exponent\n * @return base raised to the exponent\n */\n expt(args: Cons): LispValue {\n const base = args.car;\n const exponent = args.nth(2);\n if (Cons.isNumber(base) && Cons.isNumber(exponent)) {\n return Math.pow(base, exponent);\n }\n throw new EvalError(cannotApply('expt', base));\n }\n\n /**\n * Implementation of the Lisp `truncate` function. Returns the integer part of the given number.\n * @param args the argument Cons containing the target number\n * @return the truncated integer\n */\n truncate(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.trunc(args.car);\n }\n throw new EvalError(cannotApply('truncate', args.car));\n }\n\n /**\n * Implementation of the Lisp `floor` function. Returns the largest integer not greater than the given number.\n * @param args the argument Cons containing the target number\n * @return the floor of the argument\n */\n floor(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.floor(args.car);\n }\n throw new EvalError(cannotApply('floor', args.car));\n }\n\n /**\n * Implementation of the Lisp `ceiling` function. Returns the smallest integer not less than the given number.\n * @param args the argument Cons containing the target number\n * @return the ceiling of the argument\n */\n ceiling(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.ceil(args.car);\n }\n throw new EvalError(cannotApply('ceiling', args.car));\n }\n\n /**\n * Implementation of the Lisp `min` function. Returns the minimum of the given numbers.\n * @param args the argument Cons containing the numbers to compare\n * @return the smallest number\n */\n min(args: Cons): LispValue {\n const values: number[] = [];\n for (const each of args.loop()) {\n if (!Cons.isNumber(each)) {\n throw new EvalError(cannotApply('min', each));\n }\n values.push(each);\n }\n if (values.length === 0) {\n throw new EvalError('min requires at least one argument');\n }\n return Math.min(...values);\n }\n\n /**\n * Implementation of the Lisp `max` function. Returns the maximum of the given numbers.\n * @param args the argument Cons containing the numbers to compare\n * @return the largest number\n */\n max(args: Cons): LispValue {\n const values: number[] = [];\n for (const each of args.loop()) {\n if (!Cons.isNumber(each)) {\n throw new EvalError(cannotApply('max', each));\n }\n values.push(each);\n }\n if (values.length === 0) {\n throw new EvalError('max requires at least one argument');\n }\n return Math.max(...values);\n }\n\n /**\n * Implementation of the Lisp `length` function. Returns the length of a list or string.\n * @param args the argument Cons containing the target sequence\n * @return the length of the sequence\n */\n length(args: Cons): LispValue {\n const target = args.car;\n if (Cons.isString(target)) {\n return toCodePoints(target).length;\n }\n if (Cons.isCons(target)) {\n return target.length();\n }\n if (Cons.isNil(target)) {\n return 0;\n }\n throw new EvalError(cannotApply('length', target));\n }\n\n /**\n * Implementation of the Lisp `string-upcase` function. Returns the upper-cased form of the given string.\n * @param args the argument Cons containing the target string\n * @return the upper-cased string\n */\n stringUpcase(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return args.car.toUpperCase();\n }\n throw new EvalError(cannotApply('string-upcase', args.car));\n }\n\n /**\n * Implementation of the Lisp `string-downcase` function. Returns the lower-cased form of the given string.\n * @param args the argument Cons containing the target string\n * @return the lower-cased string\n */\n stringDowncase(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return args.car.toLowerCase();\n }\n throw new EvalError(cannotApply('string-downcase', args.car));\n }\n\n /**\n * Implementation of the Lisp `string-trim` function. Returns the given string with surrounding whitespace removed.\n * @param args the argument Cons containing the target string\n * @return the trimmed string\n */\n stringTrim(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return args.car.trim();\n }\n throw new EvalError(cannotApply('string-trim', args.car));\n }\n\n /**\n * Implementation of the Lisp `substring` function. Returns a portion of the given string between start and end (in code points).\n * @param args the argument Cons containing the target string, start index, and optional end index\n * @return the requested substring\n */\n substring(args: Cons): LispValue {\n const target = args.car;\n const start = args.nth(2);\n const end = args.nth(3);\n if (!Cons.isString(target)) {\n throw new EvalError(cannotApply('substring', target));\n }\n if (!Cons.isNumber(start)) {\n throw new EvalError(cannotApply('substring', start));\n }\n const chars = toCodePoints(target);\n if (Cons.isNil(end)) {\n return chars.slice(start).join('');\n }\n if (!Cons.isNumber(end)) {\n throw new EvalError(cannotApply('substring', end));\n }\n return chars.slice(start, end).join('');\n }\n\n /**\n * Implementation of the Lisp `concatenate` function. Returns the concatenation of all the given strings.\n * @param args the argument Cons containing the strings to concatenate\n * @return the concatenated string\n */\n concatenate(args: Cons): LispValue {\n let result = '';\n for (const each of args.loop()) {\n if (!Cons.isString(each)) {\n throw new EvalError(cannotApply('concatenate', each));\n }\n result += each;\n }\n return result;\n }\n\n /**\n * Implementation of the Lisp `elt` function. Returns the element at the given index of a string or list.\n * @param args the argument Cons containing the target sequence and the index\n * @return the element at the given index\n */\n elt(args: Cons): LispValue {\n const target = args.car;\n const index = args.nth(2);\n if (!Cons.isNumber(index)) {\n throw new EvalError(cannotApply('elt', index));\n }\n if (Cons.isString(target)) {\n const chars = toCodePoints(target);\n if (index < 0 || index >= chars.length) {\n throw new EvalError(`elt: index ${String(index)} out of range`);\n }\n return chars[index];\n }\n if (Cons.isCons(target)) {\n if (index < 0 || index >= target.length()) {\n throw new EvalError(`elt: index ${String(index)} out of range`);\n }\n return target.nth(index + 1);\n }\n throw new EvalError(cannotApply('elt', target));\n }\n\n /**\n * Implementation of the Lisp `subseq` function. Returns a subsequence of a string or list between start and end.\n * @param args the argument Cons containing the target sequence, start index, and optional end index\n * @return the requested subsequence\n */\n subseq(args: Cons): LispValue {\n const target = args.car;\n const start = args.nth(2);\n const end = args.nth(3);\n if (!Cons.isNumber(start)) {\n throw new EvalError(cannotApply('subseq', start));\n }\n if (Cons.isString(target)) {\n const chars = toCodePoints(target);\n if (Cons.isNil(end)) {\n return chars.slice(start).join('');\n }\n if (!Cons.isNumber(end)) {\n throw new EvalError(cannotApply('subseq', end));\n }\n return chars.slice(start, end).join('');\n }\n if (Cons.isCons(target)) {\n const stop = Cons.isNil(end) ? target.length() : (end as number);\n if (!Cons.isNumber(stop)) {\n throw new EvalError(cannotApply('subseq', end));\n }\n let result: Cons = Cons.nil;\n for (let i = stop - 1; i >= start; i--) {\n result = new Cons(target.nth(i + 1), result);\n }\n return result;\n }\n throw new EvalError(cannotApply('subseq', target));\n }\n\n /**\n * Implementation of the Lisp `count` function. Counts the occurrences of an item within a string or list.\n * @param args the argument Cons containing the item and the target sequence\n * @return the number of occurrences\n */\n count(args: Cons): LispValue {\n const item = args.car;\n const target = args.nth(2);\n let n = 0;\n if (Cons.isString(target)) {\n if (!Cons.isString(item) || item.length !== 1) {\n return 0;\n }\n for (const ch of target) {\n if (ch === item) n++;\n }\n return n;\n }\n if (Cons.isCons(target) || Cons.isNil(target)) {\n const list = Cons.isNil(target) ? Cons.nil : target;\n if (Cons.isCons(list)) {\n for (const each of list.loop()) {\n if (each === item) n++;\n }\n }\n return n;\n }\n throw new EvalError(cannotApply('count', target));\n }\n\n /**\n * Implementation of the Lisp `reduce` function. Combines the elements of a list using a binary procedure.\n * @param args the argument Cons containing the procedure, the list, and an optional initial value\n * @return the result of folding the procedure over the list\n */\n reduce(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n const hasInit = args.length() >= 3;\n const init = args.nth(3);\n\n if (Cons.isNil(list)) {\n if (hasInit) return init;\n // CL semantics: (reduce fn '()) calls fn with no args\n return Applier.apply(procedure, Cons.nil, this.environment, this.streamManager, this.depth);\n }\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('reduce', list));\n }\n\n const iter = list.loop();\n let acc: LispValue;\n if (hasInit) {\n acc = init;\n } else {\n if (!iter.hasNext()) {\n return Applier.apply(procedure, Cons.nil, this.environment, this.streamManager, this.depth);\n }\n acc = iter.next();\n }\n while (iter.hasNext()) {\n const next = iter.next();\n acc = Applier.apply(\n procedure,\n new Cons(acc, new Cons(next, Cons.nil)),\n this.environment,\n this.streamManager,\n this.depth,\n );\n }\n return acc;\n }\n\n /**\n * Implementation of the Lisp `every` function. Returns t when the predicate holds for every element of the list.\n * @param args the argument Cons containing the predicate and the list\n * @return t when the predicate holds for every element, nil otherwise\n */\n every(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) {\n return InterpretedSymbol.of('t');\n }\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('every', list));\n }\n for (const each of list.loop()) {\n const result = Applier.apply(\n procedure,\n new Cons(each, Cons.nil),\n this.environment,\n this.streamManager,\n this.depth,\n );\n if (Cons.isNil(result)) {\n return Cons.nil;\n }\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `some` function. Returns the first non-nil predicate result, or nil if all are nil.\n * @param args the argument Cons containing the predicate and the list\n * @return the first non-nil result, or nil\n */\n some(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) {\n return Cons.nil;\n }\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('some', list));\n }\n for (const each of list.loop()) {\n const result = Applier.apply(\n procedure,\n new Cons(each, Cons.nil),\n this.environment,\n this.streamManager,\n this.depth,\n );\n if (Cons.isNotNil(result)) {\n return result;\n }\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `find` function. Returns the first element of the list that matches the given item.\n * @param args the argument Cons containing the item and the list\n * @return the matching element, or nil if none found\n */\n find(args: Cons): LispValue {\n const item = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) return Cons.nil;\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('find', list));\n }\n for (const each of list.loop()) {\n // Use eq_ (identity) for matching, mirroring CL's default :test #'eql semantics.\n if (this.eq_(new Cons(item, new Cons(each, Cons.nil))) === InterpretedSymbol.of('t')) {\n return each;\n }\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `mapcan` function. Applies the procedure to each element and concatenates the resulting lists.\n * @param args the argument Cons containing the procedure and the list\n * @return the concatenation of the per-element results\n */\n mapcan(args: Cons): LispValue {\n const procedure = args.car;\n const list = args.nth(2);\n\n if (Cons.isNil(list)) return Cons.nil;\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('mapcan', list));\n }\n\n const collected: LispValue[] = [];\n for (const each of list.loop()) {\n const part = Applier.apply(\n procedure,\n new Cons(each, Cons.nil),\n this.environment,\n this.streamManager,\n this.depth,\n );\n if (Cons.isCons(part)) {\n for (const x of part.loop()) {\n collected.push(x);\n }\n }\n // nil and non-cons results contribute nothing (matches CL nconc-of-nil)\n }\n let result: Cons = Cons.nil;\n for (let i = collected.length - 1; i >= 0; i--) {\n result = new Cons(collected[i], result);\n }\n return result;\n }\n\n /**\n * Implementation of the Lisp `sort` function. Returns a new list sorted by the given comparison predicate.\n * @param args the argument Cons containing the list and the comparison predicate\n * @return the sorted list\n */\n sort(args: Cons): LispValue {\n const list = args.car;\n const procedure = args.nth(2);\n\n if (Cons.isNil(list)) return Cons.nil;\n if (!Cons.isCons(list)) {\n throw new EvalError(cannotApply('sort', list));\n }\n\n const items: LispValue[] = [];\n for (const each of list.loop()) {\n items.push(each);\n }\n items.sort((a, b) => {\n const result = Applier.apply(\n procedure,\n new Cons(a, new Cons(b, Cons.nil)),\n this.environment,\n this.streamManager,\n this.depth,\n );\n // CL: predicate returns truthy when a should come before b.\n return Cons.isNil(result) ? 1 : -1;\n });\n let result: Cons = Cons.nil;\n for (let i = items.length - 1; i >= 0; i--) {\n result = new Cons(items[i], result);\n }\n return result;\n }\n\n /**\n * Returns whether the given symbol is currently being spied on.\n * @param aSymbol the symbol to check\n * @return true if spied on, false otherwise\n */\n isSpy(aSymbol: InterpretedSymbol): boolean {\n return this.streamManager.isSpy(aSymbol);\n }\n\n /**\n * Implementation of the Lisp `last` function. Returns the last cell of the given list.\n * @param args the argument Cons containing the target list\n * @return the last cell of the list\n */\n last(args: Cons): LispValue {\n if (Cons.isNotCons(args)) {\n return Cons.nil;\n }\n const aCons = args.car as Cons;\n\n return aCons.last();\n }\n\n /**\n * Implementation of the Lisp `<` / `lessThan` predicate. Returns t when arguments are in strictly increasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is less than the next, nil otherwise\n */\n lessThan(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.lessThan_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('<', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `<` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when strictly increasing, nil otherwise\n */\n lessThan_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue < rightValue;\n } else {\n throw new EvalError(cannotApply('<', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `<=` / `lessThanOrEqual` predicate. Returns t when arguments are in non-decreasing order.\n * @param args the argument Cons containing the numbers to compare\n * @return t when each is less than or equal to the next, nil otherwise\n */\n lessThanOrEqual(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.lessThanOrEqual_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('<=', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that checks `<=` ordering starting from an initial number against the remaining argument list.\n * @param init the initial number on the left side of the first comparison\n * @param args the remaining numbers to compare against\n * @return t when non-decreasing, nil otherwise\n */\n lessThanOrEqual_Number(init: number, args: LispValue): LispValue {\n let leftValue: number = init;\n let aCons: LispValue = args;\n let aBoolean: boolean;\n\n while (Cons.isNotNil(aCons)) {\n const rightValue = (aCons as Cons).car;\n if (Cons.isNumber(rightValue)) {\n aBoolean = leftValue <= rightValue;\n } else {\n throw new EvalError(cannotApply('<=', rightValue));\n return Cons.nil;\n }\n if (!aBoolean) {\n return Cons.nil;\n }\n leftValue = rightValue;\n aCons = (aCons as Cons).cdr;\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `list` function. Returns a list of the given arguments.\n * @param args the argument list\n * @return a Cons list of the arguments\n */\n list(args: LispValue): LispValue {\n if (Cons.isNil(args)) {\n return Cons.nil;\n }\n return new Cons((args as Cons).car, this.list((args as Cons).cdr));\n }\n\n /**\n * Implementation of the Lisp `listp` predicate. Returns t if the argument is a list (Cons or nil).\n * @param args the argument Cons containing the value to test\n * @return t if a list, nil otherwise\n */\n list_(args: Cons): LispValue {\n if (Cons.isList(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `mapcar` function. Applies the procedure to each tuple of corresponding elements.\n * @param args the argument Cons containing the procedure followed by one or more lists\n * @return the list of results\n */\n mapcar(args: Cons): LispValue {\n const aCons = new Cons(Cons.nil, Cons.nil);\n const procedure = args.car;\n const parameters = args.nth(2) as Cons;\n const options = (args.cdr as Cons).cdr as Cons;\n let theCons: Cons = aCons;\n let index = 1;\n\n for (const each of parameters.loop()) {\n const argumentsCons = new Cons(Cons.nil, Cons.nil);\n let temporaryCons: Cons = argumentsCons;\n\n if (Cons.isNotNil(each)) {\n for (const arg of options.loop()) {\n if (Cons.isNotCons(arg)) {\n // Following the original: the source code uses `consol.log` (a typo), which throws\n // ReferenceError, so the subsequent `return Cons.nil` is never reached.\n throw new ReferenceError('consol is not defined');\n }\n temporaryCons.setCdr(new Cons((arg as Cons).nth(index), Cons.nil));\n temporaryCons = temporaryCons.cdr as Cons;\n }\n }\n\n argumentsCons.setCar(each);\n const anObject = Applier.apply(\n procedure,\n argumentsCons,\n this.environment,\n this.streamManager,\n this.depth,\n );\n theCons.setCdr(new Cons(anObject, Cons.nil));\n theCons = theCons.cdr as Cons;\n index++;\n }\n\n return aCons.cdr;\n }\n\n /**\n * Implementation of the Lisp `member` function. Returns the sublist whose car matches the given item.\n * @param args the argument Cons containing the item, the list, and an optional comparator symbol\n * @return the matching sublist, or nil if not found\n */\n member(args: Cons): LispValue {\n let aSymbol = InterpretedSymbol.of('equal?');\n if (Cons.isNotNil(args.nth(3))) {\n aSymbol = args.nth(3) as InterpretedSymbol;\n }\n if (Cons.isNotCons(args.nth(2))) {\n return Cons.nil;\n }\n let aCons = args.nth(2) as Cons;\n\n while (Cons.isCons(aCons)) {\n let anObject: LispValue = null;\n\n if (aSymbol === InterpretedSymbol.of('eq?')) {\n anObject = this.eq_(new Cons(args.car, new Cons(aCons.car, Cons.nil)));\n }\n if (aSymbol === InterpretedSymbol.of('equal?')) {\n anObject = this.equal_(new Cons(args.car, new Cons(aCons.car, Cons.nil)));\n }\n if (anObject == null) {\n throw new EvalError(cannotApply('member', aSymbol));\n }\n if (anObject === InterpretedSymbol.of('t')) {\n return aCons;\n }\n\n aCons = aCons.cdr as Cons;\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `memq` predicate. Returns t when `member` finds a match, nil otherwise.\n * @param args the argument Cons forwarded to `member`\n * @return t when found, nil otherwise\n */\n memq(args: Cons): LispValue {\n if (this.member(args) === Cons.nil) {\n return Cons.nil;\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `mod` / `//` function. Returns the remainder of dividing the arguments in sequence.\n * @param args the argument Cons containing the numbers\n * @return the modulo result\n */\n mod(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.mod_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('mod', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the modulo starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to mod by\n * @return the remainder after taking modulo with each of the remaining numbers\n */\n mod_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result % each;\n } else {\n throw new EvalError(cannotApply('mod', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Implementation of the Lisp `*` / `multiply` function. Returns the product of the given numbers.\n * @param args the argument Cons containing the numbers to multiply\n * @return the product of the arguments\n */\n multiply(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.multiply_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('multiply', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the product starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to multiply\n * @return the product of init and all remaining numbers\n */\n multiply_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result * each;\n } else {\n throw new EvalError(cannotApply('multiply', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Implementation of the Lisp `napier` function. Returns Napier's constant (e).\n * @return Math.E\n */\n napier(): number {\n return Math.E;\n }\n\n /**\n * Implementation of the Lisp `neq` / `~~` predicate. The negation of `eq`.\n * @param args the argument Cons forwarded to `eq_`\n * @return nil when eq, t otherwise\n */\n neq(args: Cons): LispValue {\n if (this.eq_(args) === InterpretedSymbol.of('t')) {\n return Cons.nil;\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `nequal` / `~=` predicate. The negation of `equal`.\n * @param args the argument Cons forwarded to `equal_`\n * @return nil when equal, t otherwise\n */\n nequal(args: Cons): LispValue {\n if (this.equal_(args) === InterpretedSymbol.of('t')) {\n return Cons.nil;\n }\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `nth` function. Returns the nth element of a list.\n * @param args the argument Cons containing the index and the list\n * @return the element at the given index\n */\n nth(args: Cons): LispValue {\n if (!Number.isInteger(args.car)) {\n return Cons.nil;\n }\n const index = args.car as number;\n const aCons = args.nth(2) as Cons;\n\n return aCons.nth(index);\n }\n\n /**\n * Implementation of the Lisp `null` predicate. Returns t if the argument is nil, otherwise nil.\n * @param args the argument Cons containing the value to test\n * @return t if nil, nil otherwise\n */\n null_(args: Cons): LispValue {\n if (Cons.isNil(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n // NOTE: Lisp's numberp and doublep are originally distinct predicates, but because JS has only\n // one numeric type (double), we share a single implementation. In Applier.setup() both\n // Lisp function names numberp / doublep map to this method. Split into separate methods if\n // a future revision introduces additional numeric types such as BigInt.\n /**\n * Implementation of the Lisp `numberp` / `doublep` predicate. Returns t if the argument is a number.\n * @param args the argument Cons containing the value to test\n * @return t if a number, nil otherwise\n */\n number_(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `pi` function. Returns the mathematical constant pi.\n * @return Math.PI\n */\n pi(): number {\n return Math.PI;\n }\n\n /**\n * Implementation of the Lisp `random` function. Returns a pseudo-random number in [0, 1).\n * @return a random number in [0, 1)\n */\n random(): number {\n return Math.random();\n }\n\n /**\n * Implementation of the Lisp `round` function. Returns the given number rounded to the nearest integer.\n * @param args the argument Cons containing the target number\n * @return the rounded integer\n */\n round(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.round(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Dispatches the call to either a built-in function or a user-defined function based on the symbol.\n * @param procedure the symbol naming the function\n * @param args the argument list\n * @return the result of the dispatched function\n */\n selectProcedure(procedure: InterpretedSymbol, args: LispValue): LispValue {\n if (Applier.buildInFunctions.has(procedure)) {\n return this.buildInFunction(procedure, args);\n }\n if (this.environment.has(procedure)) {\n return this.userFunction(procedure, args);\n }\n throw new EvalError(noProcedure(procedure));\n\n return Cons.nil;\n }\n\n /**\n * Sets the current recursion depth.\n * @param aNumber the new depth value\n */\n setDepth(aNumber: number): null {\n this.depth = aNumber;\n return null;\n }\n\n /**\n * Builds and returns the Lisp-name to method-name dispatch map.\n * @return a Map associating each Lisp function name (as an InterpretedSymbol) with the corresponding Applier method name\n */\n static setup(): Map<InterpretedSymbol, string> {\n try {\n const entries: Array<[string, string]> = [\n ['abs', 'abs'],\n ['add', 'add'],\n ['assoc', 'assoc'],\n ['atom', 'atom_'],\n ['car', 'car'],\n ['cdr', 'cdr'],\n ['characterp', 'character_'],\n ['cons', 'cons'],\n ['consp', 'cons_'],\n ['copy', 'copy'],\n ['ceiling', 'ceiling'],\n ['cos', 'cos'],\n ['floatp', 'float_'],\n ['floor', 'floor'],\n ['divide', 'divide'],\n ['doublep', 'number_'],\n ['eq', 'eq_'],\n ['equal', 'equal_'],\n ['evenp', 'even_'],\n ['every', 'every'],\n ['exp', 'exp'],\n ['expt', 'expt'],\n ['find', 'find'],\n ['format', 'format'],\n ['gensym', 'gensym'],\n ['integerp', 'integer_'],\n ['concatenate', 'concatenate'],\n ['count', 'count'],\n ['elt', 'elt'],\n ['last', 'last'],\n ['length', 'length'],\n ['list', 'list'],\n ['listp', 'list_'],\n ['mapcan', 'mapcan'],\n ['mapcar', 'mapcar'],\n ['max', 'max'],\n ['member', 'member'],\n ['memq', 'memq'],\n ['min', 'min'],\n ['minusp', 'minus_'],\n ['mod', 'mod'],\n ['multiply', 'multiply'],\n ['napier', 'napier'],\n ['neq', 'neq'],\n ['nequal', 'nequal'],\n ['nth', 'nth'],\n ['null', 'null_'],\n ['numberp', 'number_'],\n ['oddp', 'odd_'],\n ['pi', 'pi'],\n ['plusp', 'plus_'],\n ['random', 'random'],\n ['reduce', 'reduce'],\n ['round', 'round'],\n ['sin', 'sin'],\n ['some', 'some'],\n ['sort', 'sort'],\n ['sqrt', 'sqrt'],\n ['string-downcase', 'stringDowncase'],\n ['string-trim', 'stringTrim'],\n ['string-upcase', 'stringUpcase'],\n ['stringp', 'string_'],\n ['subseq', 'subseq'],\n ['substring', 'substring'],\n ['subtract', 'subtract'],\n ['symbolp', 'symbol_'],\n ['tan', 'tan'],\n ['truncate', 'truncate'],\n ['zerop', 'zero_'],\n ['1+', 'oneplus'],\n ['1-', 'oneminus'],\n ['+', 'add'],\n ['-', 'subtract'],\n ['*', 'multiply'],\n ['/', 'divide'],\n ['//', 'mod'],\n ['==', 'eq_'],\n ['=', 'equal_'],\n ['~~', 'neq'],\n ['~=', 'nequal'],\n ['<', 'lessThan'],\n ['<=', 'lessThanOrEqual'],\n ['>', 'greaterThan'],\n ['>=', 'greaterThanOrEqual'],\n ];\n return new Map(entries.map(([key, value]) => [InterpretedSymbol.of(key), value]));\n } catch {\n throw new Error('NullPointerException (Applier, initialize)');\n }\n }\n\n /**\n * Implementation of the Lisp `sin` function. Returns the sine of the given number.\n * @param args the argument Cons containing the angle in radians\n * @return the sine of the argument\n */\n sin(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.sin(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Writes a single line of spy output (with indentation) to the given stream.\n * @param aStream the stream to write to, or null/string to fall back to process.stdout\n * @param line the line to write\n */\n spyPrint(aStream: NodeJS.WritableStream | string | null, line: string): null {\n const target: NodeJS.WritableStream =\n aStream != null && typeof aStream === 'object' && 'write' in aStream\n ? aStream\n : process.stdout;\n target.write(this.indent() + line + '\\n');\n return null;\n }\n\n /**\n * Implementation of the Lisp `sqrt` function. Returns the square root of the given number.\n * @param args the argument Cons containing the target number\n * @return the square root of the argument\n */\n sqrt(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.sqrt(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Implementation of the Lisp `stringp` predicate. Returns t if the argument is a string.\n * @param args the argument Cons containing the value to test\n * @return t if a string, nil otherwise\n */\n string_(args: Cons): LispValue {\n if (Cons.isString(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `-` / `subtract` function. Returns the difference of the given numbers.\n * @param args the argument Cons containing the numbers to subtract\n * @return the difference of the arguments\n */\n subtract(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return this.subtract_Number(args.car, args.cdr);\n }\n throw new EvalError(cannotApply('subtract', args.car));\n\n return Cons.nil;\n }\n\n /**\n * Helper that accumulates the difference starting from an initial number and the remaining argument list.\n * @param init the initial number\n * @param args the remaining numbers to subtract\n * @return init with all remaining numbers subtracted\n */\n subtract_Number(init: number, args: LispValue): LispValue {\n let result = init;\n let aCons: LispValue = args;\n\n while (Cons.isNotNil(aCons)) {\n const each = (aCons as Cons).car;\n if (Cons.isNumber(each)) {\n result = result - each;\n } else {\n throw new EvalError(cannotApply('subtract', each));\n return Cons.nil;\n }\n aCons = (aCons as Cons).cdr;\n }\n\n return result;\n }\n\n /**\n * Implementation of the Lisp `symbolp` predicate. Returns t if the argument is an interpreted symbol.\n * @param args the argument Cons containing the value to test\n * @return t if a symbol, nil otherwise\n */\n symbol_(args: Cons): LispValue {\n if (Cons.isSymbol(args.car)) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `tan` function. Returns the tangent of the given number.\n * @param args the argument Cons containing the angle in radians\n * @return the tangent of the argument\n */\n tan(args: Cons): LispValue {\n if (Cons.isNumber(args.car)) {\n return Math.tan(args.car);\n }\n // Following the original: calls the undefined `selectPrintFunction`, so it throws ReferenceError.\n throw new ReferenceError(SELECT_PRINT_FUNCTION_NOT_DEFINED);\n }\n\n /**\n * Invokes a user-defined function (lambda) bound in the environment under the given symbol.\n * @param procedure the symbol naming the user function\n * @param args the argument list\n * @return the result of evaluating the user function\n */\n userFunction(procedure: InterpretedSymbol, args: LispValue): LispValue {\n if (this.isSpy(procedure)) {\n this.spyPrint(this.streamManager.spyStream(procedure), new Cons(procedure, args).toString());\n this.setDepth(this.depth + 1);\n }\n\n const lambda = this.environment.get(procedure) as Cons;\n const theEnvironment = lambda.last().car as Table;\n const answer = Applier.apply(lambda, args, theEnvironment, this.streamManager, this.depth);\n\n if (this.isSpy(procedure)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(procedure),\n String(answer) + ' <== ' + new Cons(procedure, args).toString(),\n );\n }\n\n return answer;\n }\n}\n","/**\n * @class\n * @classdesc Error class representing a graceful exit triggered by a Lisp (exit) call. Catch it at the REPL or library boundary to run cleanup before terminating.\n * @author Keisuke Ikeda\n * @this {ExitError}\n */\nexport class ExitError extends Error {\n /**\n * Constructor.\n * @constructor\n */\n constructor() {\n super('Exit');\n this.name = 'ExitError';\n }\n}\n","import type { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\n\ntype Stream = NodeJS.WritableStream | null;\n\n/**\n * @class\n * @classdesc Manages output streams (stdout / stderr / spy / trace) used by the interpreter.\n * @author Keisuke Ikeda\n * @this {StreamManager}\n */\nexport class StreamManager extends Object {\n /**\n * Whether tracing is currently enabled.\n */\n isTrace: boolean = false;\n /**\n * Map from a named stream key (e.g. \"default\", \"stdout\", \"stderr\") to a WritableStream.\n */\n streamTable: Map<string, Stream>;\n /**\n * Map from a spied symbol to the stream key used for that symbol's output.\n */\n spyTable: Map<InterpretedSymbol, string>;\n /**\n * The stream that receives trace output while tracing is on.\n */\n traceStream: Stream;\n\n /**\n * Constructor.\n * @constructor\n */\n constructor() {\n super();\n this.streamTable = new Map();\n this.spyTable = new Map();\n this.traceStream = null;\n this.initialize();\n }\n\n /**\n * Returns the currently selected output stream (trace stream when tracing, otherwise the default).\n * @return the active stream, or null when none is available\n */\n getStream(): Stream {\n let aPrintStream: Stream = null;\n if (this.isTrace) {\n // Following the original: traceStream is invoked as a function (since it is a Stream object this throws).\n return (this.traceStream as unknown as () => Stream)();\n }\n const filePath = process.env['HOME'] as string;\n if (this.streamTable.has(filePath)) {\n aPrintStream = this.streamTable.get(filePath) ?? null;\n }\n\n return aPrintStream;\n }\n\n /**\n * Initializes the instance variables.\n * @return null\n */\n initialize(): null {\n this.streamTable.set('default', process.stdout);\n this.streamTable.set('stdout', process.stdout);\n this.streamTable.set('stderr', process.stderr);\n\n return null;\n }\n\n /**\n * Returns whether the given symbol is being spied (or whether tracing is on, in which case every symbol is \"spied\").\n * @param aSymbol the symbol to check, or null\n * @return true if the symbol is spied or tracing is on\n */\n isSpy(aSymbol: InterpretedSymbol | null): boolean {\n if (this.isTrace) {\n return true;\n }\n if (aSymbol != null && this.spyTable_().has(aSymbol)) {\n return true;\n }\n return false;\n }\n\n /**\n * Removes the given symbol from the spy table.\n * @param aSymbol the symbol to stop spying\n * @return null\n */\n noSpy(aSymbol: InterpretedSymbol): null {\n if (this.spyTable_().has(aSymbol)) {\n this.spyTable_().delete(aSymbol);\n }\n\n return null;\n }\n\n /**\n * Turns tracing off and clears the spy table.\n * @return null\n */\n noTrace(): null {\n this.setIsTrace(false);\n this.spyTable.clear();\n\n return null;\n }\n\n /**\n * Sets the tracing flag.\n * @param aBoolean the new value for the tracing flag\n * @return null\n */\n setIsTrace(aBoolean: boolean): null {\n this.isTrace = aBoolean;\n return null;\n }\n\n /**\n * Sets the trace output stream.\n * @param aStream the stream to send trace output to\n * @return null\n */\n setTraceStream(aStream: Stream): null {\n this.traceStream = aStream;\n return null;\n }\n\n /**\n * Registers the given symbol as spied with the given stream key.\n * @param aSymbol the symbol to spy on\n * @param aString the stream key (e.g. \"default\")\n * @return null\n */\n spy(aSymbol: InterpretedSymbol, aString: string): null {\n const aPrintStream = this.getStream();\n if (aPrintStream != null) {\n this.spyTable_().set(aSymbol, aString);\n }\n\n return null;\n }\n\n /**\n * Returns the stream (or stream-key string) used for the given symbol's spy output.\n * @param aSymbol the symbol whose spy stream is requested, or null\n * @return the trace stream, the registered key string, or throws if none is found\n */\n spyStream(aSymbol: InterpretedSymbol | null): Stream | string {\n if (this.isTrace) {\n return this.traceStream;\n }\n if (aSymbol != null && this.spyTable_().has(aSymbol)) {\n return this.spyTable_().get(aSymbol) as string;\n }\n throw new Error('Stream is not found.');\n }\n\n /**\n * Returns a copy of the spy table (defensive copy so callers do not mutate the internal map).\n * @return a new map containing the same entries as the internal spy table\n */\n spyTable_(): Map<InterpretedSymbol, string> {\n const aTable = new Map<InterpretedSymbol, string>();\n for (const [key, value] of this.spyTable) {\n aTable.set(key, value);\n }\n return aTable;\n }\n\n /**\n * Turns tracing on, routing trace output to the currently active stream.\n * @return null\n */\n trace(): null {\n this.noTrace();\n const aPrintStream = this.getStream();\n this.setTraceStream(aPrintStream);\n this.setIsTrace(true);\n\n return null;\n }\n}\n","import v8 from 'node:v8';\nimport vm from 'node:vm';\n\nimport { Applier } from '../Applier/index.js';\nimport { Cons } from '../../value/Cons/index.js';\nimport { EvalError } from '../../errors/EvalError/index.js';\nimport { ExitError } from '../../errors/ExitError/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport {\n argumentNotSymbol,\n cannotApply,\n noBinding,\n notSymbol,\n SIZES_DO_NOT_MATCH,\n} from '../../constants/index.js';\nimport { StreamManager } from '../StreamManager/index.js';\nimport { Table } from '../Table/index.js';\nimport type { KeiLispPlugin, PluginContext } from '../../plugin/types.js';\nimport type { LispValue } from '../../types/index.js';\n\n// Lazily expose V8's gc() to user-land on first use, avoiding the need for the\n// host process to be started with `--expose-gc`.\nlet cachedGc: (() => void) | null = null;\nconst triggerGc = (): void => {\n if (cachedGc == null) {\n v8.setFlagsFromString('--expose_gc');\n cachedGc = vm.runInNewContext('gc') as () => void;\n }\n cachedGc();\n};\n\n/**\n * @class\n * @classdesc Class that mimics Lisp's universal function Evaluate.\n * @author Keisuke Ikeda\n * @this {Evaluator}\n */\nexport class Evaluator extends Object {\n /**\n * Lisp-name to method-name dispatch map for special forms.\n */\n static readonly buildInFunctions: Map<InterpretedSymbol, string> = Evaluator.setup();\n\n /**\n * Marker symbol stored as the car of the Cons that represents a macro binding,\n * distinguishing macros from ordinary `lambda` closures in the environment.\n */\n static readonly macroMarker: InterpretedSymbol = InterpretedSymbol.of('macro');\n\n /**\n * The variable binding environment used during evaluation.\n */\n environment: Table;\n /**\n * The stream manager used for trace and spy output.\n */\n streamManager: StreamManager;\n /**\n * The current call depth, used for indenting trace/spy output.\n */\n depth: number;\n /**\n * Registered plugins consulted by `eval` when no special form matches.\n */\n plugins: KeiLispPlugin[];\n\n /**\n * Constructor.\n * @param aTable the variable binding environment\n * @param aStreamManager the stream manager for trace and spy output\n * @param aNumber the initial call depth\n * @param plugins the plugin chain consulted before falling through to Applier\n */\n constructor(\n aTable: Table,\n aStreamManager: StreamManager,\n aNumber: number,\n plugins: KeiLispPlugin[] = [],\n ) {\n super();\n this.environment = aTable;\n this.streamManager = aStreamManager;\n this.depth = aNumber;\n this.plugins = plugins;\n }\n\n /**\n * Implementation of the Lisp `and` special form.\n * @param aCons the argument Cons containing the expressions to evaluate\n * @return nil if any expression evaluates to nil, otherwise t\n */\n and(aCons: Cons): LispValue {\n for (const each of aCons.loop()) {\n const anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNil(anObject)) {\n return Cons.nil;\n }\n }\n\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `apply` special form.\n * @param aCons the argument Cons containing the procedure and its argument list\n * @return the result of applying the procedure to the arguments\n */\n apply_lisp(aCons: Cons): LispValue {\n const procedure = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n const args = Evaluator.eval(\n aCons.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n let aTable: Table = this.environment;\n if (procedure instanceof Cons && procedure.last().car instanceof Table) {\n aTable = procedure.last().car as Table;\n }\n\n return Applier.apply(procedure, args, aTable, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Implementation of the Lisp `bind` special form.\n * @param aCons the argument Cons whose car is the symbol to look up\n * @return the binding count for the symbol, or nil if unbound\n */\n bind(aCons: Cons): LispValue {\n if (Cons.isNotSymbol(aCons.car)) {\n throw new EvalError(cannotApply('bind', aCons.car));\n }\n const aSymbol = aCons.car as InterpretedSymbol;\n if (!this.environment.has(aSymbol)) {\n return Cons.nil;\n }\n\n return this.bindAUX(aSymbol);\n }\n\n /**\n * Counts the number of distinct bindings for the given symbol along the environment chain.\n * @param aSymbol the symbol whose bindings are inspected\n * @return the number of distinct bindings found\n */\n bindAUX(aSymbol: InterpretedSymbol): number {\n let aTable: Table | null = this.environment;\n let anObject: LispValue = aTable.get(aSymbol);\n let count = 1;\n\n while (aTable != null) {\n if (!aTable.has(aSymbol)) {\n break;\n }\n const theObject: LispValue = aTable.get(aSymbol);\n // Following the original: loose (!=) comparison.\n if (theObject != anObject) {\n count++;\n anObject = theObject;\n }\n aTable = aTable.source;\n }\n\n return count;\n }\n\n /**\n * Sequentially evaluates and binds each (symbol value) pair into the given table; used by let*.\n * @param parameters the Cons of (symbol value) pairs to bind\n * @param aTable the table into which the bindings are written\n */\n binding(parameters: Cons, aTable: Table): null {\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n const value = Evaluator.eval(\n theCons.nth(2),\n aTable,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n aTable.set(key, value);\n }\n\n return null;\n }\n\n /**\n * Evaluates all (symbol value) pairs first and then writes them into the given table in parallel; used by let.\n * @param parameters the Cons of (symbol value) pairs to bind\n * @param aTable the table into which the bindings are written\n */\n bindingParallel(parameters: Cons, aTable: Table): null {\n const theTable = new Map<unknown, LispValue>();\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n const value = Evaluator.eval(\n theCons.nth(2),\n aTable,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n theTable.set(key, value);\n }\n\n for (const [key, value] of theTable) {\n aTable.set(key, value);\n }\n\n return null;\n }\n\n /**\n * Implementation of the Lisp `cond` special form.\n * @param aCons the argument Cons of (test consequent...) clauses\n * @return the result of the first clause whose test is non-nil, or nil\n */\n cond(aCons: LispValue): LispValue {\n if (Cons.isNil(aCons)) {\n return Cons.nil;\n }\n const consCell = aCons as Cons;\n const clause = consCell.car as Cons;\n let anObject: LispValue = Evaluator.eval(\n clause.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNil(anObject)) {\n return this.cond(consCell.cdr);\n }\n const consequent = clause.cdr as Cons;\n for (const each of consequent.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `defun` special form.\n * @param aCons the argument Cons containing the function name, parameter list, and body\n * @return the function name symbol\n */\n defun(aCons: Cons): LispValue {\n const variable = aCons.car;\n let lambda: LispValue = aCons.cdr;\n lambda =\n aCons.length() === 2\n ? (lambda as Cons).car\n : new Cons(InterpretedSymbol.of('lambda'), lambda);\n lambda = Evaluator.eval(\n lambda,\n new Table(this.environment),\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.set(variable, lambda);\n\n return variable;\n }\n\n /**\n * Implementation of the Lisp `defmacro` special form. Defines a macro: a\n * transformer whose body receives its arguments unevaluated and returns a\n * form that is then evaluated in the caller's environment.\n * @param aCons the argument Cons containing the macro name, parameter list, and body\n * @return the macro name symbol\n */\n defmacro(aCons: Cons): LispValue {\n const variable = aCons.car;\n const lambda = Evaluator.eval(\n new Cons(InterpretedSymbol.of('lambda'), aCons.cdr),\n new Table(this.environment),\n this.streamManager,\n this.depth,\n this.plugins,\n );\n const macro = new Cons(Evaluator.macroMarker, new Cons(lambda, Cons.nil));\n this.environment.set(variable, macro);\n\n return variable;\n }\n\n /**\n * Returns the macro transformer (a lambda Cons) bound to the given symbol, or\n * null when the symbol is not bound to a macro. Special-form symbols are never\n * treated as macros.\n * @param car the operator position of a call form\n * @return the macro's lambda Cons, or null\n */\n lookupMacro(car: LispValue): Cons | null {\n if (Cons.isNotSymbol(car) || Evaluator.buildInFunctions.has(car as InterpretedSymbol)) {\n return null;\n }\n const value = this.environment.get(car);\n if (Cons.isCons(value) && value.car === Evaluator.macroMarker) {\n return value.nth(2) as Cons;\n }\n\n return null;\n }\n\n /**\n * Expands a macro call exactly once by applying its transformer to the\n * unevaluated argument forms in the macro's captured environment.\n * @param form the call form whose car names the macro\n * @param macroLambda the macro's transformer lambda Cons\n * @return the expansion form\n */\n expandMacro1(form: Cons, macroLambda: Cons): LispValue {\n const capturedEnvironment = macroLambda.last().car as Table;\n\n return Applier.apply(\n macroLambda,\n form.cdr,\n capturedEnvironment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Expands a macro call once and evaluates the resulting form in the current\n * environment.\n * @param form the call form whose car names the macro\n * @param macroLambda the macro's transformer lambda Cons\n * @return the result of evaluating the expansion\n */\n evalMacroCall(form: Cons, macroLambda: Cons): LispValue {\n const expansion = this.expandMacro1(form, macroLambda);\n\n return Evaluator.eval(\n expansion,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Implementation of the Lisp `macroexpand-1` special form. Evaluates its\n * argument to obtain a form and, when that form is a macro call, expands it\n * exactly once without evaluating the result.\n * @param aCons the argument Cons whose car evaluates to the form to expand\n * @return the once-expanded form, or the form unchanged when it is not a macro call\n */\n macroexpand_1(aCons: Cons): LispValue {\n const form = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(form)) {\n return form;\n }\n const macroLambda = this.lookupMacro((form as Cons).car);\n if (macroLambda == null) {\n return form;\n }\n\n return this.expandMacro1(form as Cons, macroLambda);\n }\n\n /**\n * Implementation of the Lisp `macroexpand` special form. Evaluates its\n * argument to obtain a form and repeatedly expands it until the result is no\n * longer a macro call, without evaluating the result.\n * @param aCons the argument Cons whose car evaluates to the form to expand\n * @return the fully expanded form\n */\n macroexpand(aCons: Cons): LispValue {\n let form = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n while (Cons.isCons(form)) {\n const macroLambda = this.lookupMacro(form.car);\n if (macroLambda == null) {\n break;\n }\n form = this.expandMacro1(form, macroLambda);\n }\n\n return form;\n }\n\n /**\n * Implementation of the Lisp `do` special form (parallel binding update).\n * @param aCons the argument Cons containing bindings, termination clause, and body\n * @return the value of the termination clause's result form\n */\n do_(aCons: Cons): LispValue {\n const parameters = aCons.car as Cons;\n const bool = aCons.nth(2) as Cons;\n const expressions = (aCons.cdr as Cons).cdr as Cons;\n this.bindingParallel(parameters, this.environment);\n if (Cons.isNil(bool)) {\n bool.setCar(Cons.nil);\n }\n\n while (\n Cons.isNil(\n Evaluator.eval(bool.car, this.environment, this.streamManager, this.depth, this.plugins),\n )\n ) {\n const theTable = new Map<InterpretedSymbol, LispValue>();\n for (const each of expressions.loop()) {\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins);\n }\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n if (Cons.isNotNil(theCons.nth(3))) {\n const value = Evaluator.eval(\n theCons.nth(3),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n theTable.set(key, value);\n }\n }\n for (const [key, value] of theTable) {\n this.environment.set(key, value);\n }\n }\n return Evaluator.eval(\n bool.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Implementation of the Lisp `dolist` special form.\n * @param aCons the argument Cons containing the binding clause and body\n * @return the value of the result form\n */\n doList(aCons: Cons): LispValue {\n const parameter = aCons.car as Cons;\n const theCons = aCons.cdr as Cons;\n const args = Evaluator.eval(\n parameter.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n ) as Cons;\n for (const element of args.loop()) {\n this.environment.set(parameter.car, element);\n for (const each of theCons.loop()) {\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins);\n }\n }\n\n return Evaluator.eval(\n parameter.nth(3),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Implementation of the Lisp `do*` special form (sequential binding update).\n * @param aCons the argument Cons containing bindings, termination clause, and body\n * @return the value of the termination clause's result form\n */\n doStar(aCons: Cons): LispValue {\n const parameters = aCons.car as Cons;\n const bool = aCons.nth(2) as Cons;\n const expressions = (aCons.cdr as Cons).cdr as Cons;\n this.binding(parameters, this.environment);\n if (Cons.isNil(bool)) {\n bool.setCar(Cons.nil);\n }\n\n while (\n Cons.isNil(\n Evaluator.eval(bool.car, this.environment, this.streamManager, this.depth, this.plugins),\n )\n ) {\n for (const each of expressions.loop()) {\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins);\n }\n for (const each of parameters.loop()) {\n const theCons = each as Cons;\n if (Cons.isNotSymbol(theCons.car)) {\n throw new EvalError(notSymbol(theCons.car));\n }\n const key = theCons.car as InterpretedSymbol;\n if (Cons.isNotNil(theCons.nth(3))) {\n const value = Evaluator.eval(\n theCons.nth(3),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.set(key, value);\n }\n }\n }\n return Evaluator.eval(\n bool.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Evaluates a procedure call by delegating to the Applier after evaluating each argument.\n * @param form the call form whose car is the procedure and whose cdr is the argument list\n * @return the result of applying the procedure\n */\n entrustApplier(form: Cons): LispValue {\n const aCons = form.cdr as Cons;\n let args: Cons = new Cons(Cons.nil, Cons.nil);\n const procedure = form.car;\n let aSymbol: InterpretedSymbol | null = null;\n\n if (Cons.isSymbol(procedure)) {\n aSymbol = procedure;\n }\n if (this.isSpy(aSymbol)) {\n this.spyPrint(this.streamManager.spyStream(aSymbol), form.toString());\n this.setDepth(this.depth + 1);\n }\n\n for (const each of aCons.loop()) {\n if (each instanceof Table) {\n break;\n }\n args.add(\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins),\n );\n }\n if (this.isSpy(aSymbol)) {\n this.setDepth(this.depth - 1);\n }\n\n args = args.cdr as Cons;\n return Applier.apply(\n procedure,\n args,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Evaluates the given form in the given environment.\n * @param form the form to evaluate\n * @param environment the variable binding environment\n * @param aStreamManager the stream manager for trace and spy output\n * @param depth the current call depth\n * @param plugins the plugin chain consulted before falling through to Applier\n * @return the evaluation result\n */\n static eval(\n form: LispValue,\n environment: Table,\n aStreamManager: StreamManager = new StreamManager(),\n depth: number = 1,\n plugins: KeiLispPlugin[] = [],\n ): LispValue {\n return new Evaluator(environment, aStreamManager, depth, plugins).eval(form);\n }\n\n /**\n * Evaluates the given form using this Evaluator's environment.\n * @param form the form to evaluate\n * @return the evaluation result\n */\n eval(form: LispValue): LispValue {\n if (Cons.isSymbol(form)) {\n return this.evaluateSymbol(form);\n }\n if (Cons.isNil(form) || Cons.isNotList(form)) {\n return form;\n }\n const formCons = form as Cons;\n if (Cons.isSymbol(formCons.car) && Evaluator.buildInFunctions.has(formCons.car)) {\n return this.specialForm(formCons);\n }\n if (Cons.isSymbol(formCons.car)) {\n const macroLambda = this.lookupMacro(formCons.car);\n if (macroLambda != null) {\n return this.evalMacroCall(formCons, macroLambda);\n }\n }\n if (Cons.isSymbol(formCons.car) && this.plugins.length > 0) {\n const symbol = formCons.car;\n const plugin = this.plugins.find((p) => p.has(symbol));\n if (plugin !== undefined) {\n return this.entrustPlugin(plugin, formCons);\n }\n }\n\n return this.entrustApplier(formCons);\n }\n\n /**\n * Evaluates the argument list (the same way `entrustApplier` does), then\n * delegates the call to the matched plugin with a context that allows\n * recursive evaluation.\n * @param plugin the plugin that claimed the call symbol\n * @param form the call form whose car is the symbol and whose cdr is the argument list\n * @return the result returned by the plugin\n */\n entrustPlugin(plugin: KeiLispPlugin, form: Cons): LispValue {\n const aCons = form.cdr as Cons;\n let args: Cons = new Cons(Cons.nil, Cons.nil);\n const symbol = form.car as InterpretedSymbol;\n\n if (this.isSpy(symbol)) {\n this.spyPrint(this.streamManager.spyStream(symbol), form.toString());\n this.setDepth(this.depth + 1);\n }\n\n for (const each of aCons.loop()) {\n if (each instanceof Table) {\n break;\n }\n args.add(\n Evaluator.eval(each, this.environment, this.streamManager, this.depth, this.plugins),\n );\n }\n if (this.isSpy(symbol)) {\n this.setDepth(this.depth - 1);\n }\n\n args = args.cdr as Cons;\n const ctx: PluginContext = {\n environment: this.environment,\n streamManager: this.streamManager,\n depth: this.depth,\n eval: (subForm: LispValue): LispValue =>\n Evaluator.eval(subForm, this.environment, this.streamManager, this.depth, this.plugins),\n };\n return plugin.apply(symbol, args, ctx);\n }\n\n /**\n * Implementation of the Lisp `eval` special form.\n * @param aCons the argument Cons whose car is the form to evaluate twice\n * @return the result of evaluating the form\n */\n eval_lisp(aCons: Cons): LispValue {\n return Evaluator.eval(\n Evaluator.eval(aCons.car, this.environment, this.streamManager, this.depth, this.plugins),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n /**\n * Resolves the value bound to the given symbol in the current environment.\n * @param aSymbol the symbol to resolve\n * @return the value bound to the symbol\n */\n evaluateSymbol(aSymbol: InterpretedSymbol): LispValue {\n if (!this.environment.has(aSymbol)) {\n throw new EvalError(noBinding(aSymbol));\n }\n if (this.isSpy(aSymbol)) {\n this.spyPrint(this.streamManager.spyStream(aSymbol), aSymbol.toString());\n this.setDepth(this.depth + 1);\n }\n\n let answer: LispValue = this.environment.get(aSymbol);\n if (answer instanceof Cons && answer.cdr instanceof Table) {\n answer = answer.car;\n }\n\n if (this.isSpy(aSymbol)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(aSymbol),\n String(answer) + ' <== ' + String(aSymbol),\n );\n }\n\n return answer;\n }\n\n /**\n * Implementation of the Lisp `exit` special form; terminates the REPL by throwing an ExitError.\n */\n exit(): never {\n console.log('Bye!');\n throw new ExitError();\n }\n\n /**\n * Implementation of the Lisp `gc` special form; triggers garbage collection and returns memory usage.\n * @return an association list of memory usage statistics\n */\n gc(): Cons {\n triggerGc();\n const usage = process.memoryUsage();\n // Returns an association list so callers can do (assoc 'heap-used (gc)).\n const pair = (key: string, value: number): Cons => new Cons(InterpretedSymbol.of(key), value);\n const entries: Cons[] = [\n pair('rss', usage.rss),\n pair('heap-total', usage.heapTotal),\n pair('heap-used', usage.heapUsed),\n ];\n let result: Cons = Cons.nil;\n for (const entry of entries) {\n result = new Cons(entry, result);\n }\n return result;\n }\n\n /**\n * Implementation of the Lisp `if` special form.\n * @param aCons the argument Cons containing the test, then-form, and else-form\n * @return the result of evaluating the selected branch\n */\n if_(aCons: Cons): LispValue {\n const bool = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n const anObject: LispValue = Cons.isNil(bool) ? aCons.nth(3) : aCons.nth(2);\n\n return Evaluator.eval(anObject, this.environment, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Returns the indentation string used for trace and spy output at the current depth.\n * @return the indentation string\n */\n indent(): string {\n let index = 0;\n let aString = '';\n while (index++ < this.depth) {\n aString += '| ';\n }\n\n return aString;\n }\n\n /**\n * Returns whether the given symbol is currently being spied on.\n * @param aSymbol the symbol to check\n * @return a boolean\n */\n isSpy(aSymbol: InterpretedSymbol | null): boolean {\n if (aSymbol == null) {\n return false;\n }\n return this.streamManager.isSpy(aSymbol);\n }\n\n /**\n * Implementation of the Lisp `lambda` special form; captures the current environment as a closure.\n * @param args the argument Cons containing the parameter list and body\n * @return a lambda form with the captured environment appended\n */\n lambda(args: Cons): LispValue {\n const aCons = Cons.cloneValue(args) as Cons;\n const theCons = aCons.cdr as Cons;\n theCons.setCdr(new Cons(this.environment, Cons.nil));\n\n return new Cons(InterpretedSymbol.of('lambda'), aCons);\n }\n\n /**\n * Implementation of the Lisp `let` special form (parallel binding).\n * @param aCons the argument Cons containing bindings and body\n * @return the value of the last body form\n */\n let(aCons: Cons): LispValue {\n const aTable = new Table(this.environment);\n const parameters = aCons.car as Cons;\n const forms = aCons.cdr as Cons;\n let anObject: LispValue = Cons.nil;\n this.bindingParallel(parameters, aTable);\n for (const each of forms.loop()) {\n anObject = Evaluator.eval(each, aTable, this.streamManager, this.depth, this.plugins);\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `let*` special form (sequential binding).\n * @param aCons the argument Cons containing bindings and body\n * @return the value of the last body form\n */\n letStar(aCons: Cons): LispValue {\n const aTable = new Table(this.environment);\n const parameters = aCons.car as Cons;\n const forms = aCons.cdr as Cons;\n let anObject: LispValue = Cons.nil;\n this.binding(parameters, aTable);\n for (const each of forms.loop()) {\n anObject = Evaluator.eval(each, aTable, this.streamManager, this.depth, this.plugins);\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `not` special form.\n * @param aCons the argument Cons whose car is the expression to negate\n * @return t if the expression evaluates to nil, otherwise nil\n */\n not(aCons: Cons): LispValue {\n if (\n Cons.isNil(\n Evaluator.eval(aCons.car, this.environment, this.streamManager, this.depth, this.plugins),\n )\n ) {\n return InterpretedSymbol.of('t');\n }\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `notrace` special form; disables tracing.\n * @return the symbol t\n */\n notrace(): InterpretedSymbol {\n this.streamManager.noTrace();\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `or` special form.\n * @param aCons the argument Cons containing the expressions to evaluate\n * @return t if any expression evaluates to non-nil, otherwise nil\n */\n or(aCons: Cons): LispValue {\n for (const each of aCons.loop()) {\n const anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotNil(anObject)) {\n return InterpretedSymbol.of('t');\n }\n }\n\n return Cons.nil;\n }\n\n /**\n * Implementation of the Lisp `pop` special form.\n * @param aCons the argument Cons whose car is the symbol bound to a list\n * @return the popped element, or nil if the binding is not a Cons\n */\n pop_(aCons: Cons): LispValue {\n if (Cons.isNotSymbol(aCons.car)) {\n throw new EvalError(argumentNotSymbol(1));\n }\n const aSymbol = aCons.car as InterpretedSymbol;\n const anObject = Evaluator.eval(\n aSymbol,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(anObject)) {\n return Cons.nil;\n }\n const consObject = anObject as Cons;\n this.environment.setIfExist(aSymbol, consObject.cdr);\n\n return consObject.car;\n }\n\n /**\n * Implementation of the Lisp `progn` special form.\n * @param aCons the argument Cons containing the body expressions\n * @return the value of the last body form, or nil if there are none\n */\n progn(aCons: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n for (const each of aCons.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `princ` special form; writes the evaluated argument without a trailing newline.\n * @param aCons the argument Cons whose car is the expression to print\n * @return the printed value\n */\n princ(aCons: Cons): LispValue {\n const anObject = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n process.stdout.write(String(anObject));\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `print` special form; writes the evaluated argument followed by a newline.\n * @param aCons the argument Cons whose car is the expression to print\n * @return the printed value\n */\n print(aCons: Cons): LispValue {\n const anObject = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n process.stdout.write(String(anObject) + '\\n');\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `push` special form.\n * @param aCons the argument Cons containing the value to push and the target symbol\n * @return the new Cons stored in the symbol\n */\n push_(aCons: Cons): LispValue {\n let anObject = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotSymbol(aCons.nth(2))) {\n throw new EvalError(argumentNotSymbol(2));\n }\n const aSymbol = aCons.nth(2) as InterpretedSymbol;\n anObject = new Cons(\n anObject,\n Evaluator.eval(aSymbol, this.environment, this.streamManager, this.depth, this.plugins),\n );\n this.environment.setIfExist(aSymbol, anObject);\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `quote` special form.\n * @param aCons the argument Cons whose car is the form to return unevaluated\n * @return the quoted form\n */\n quote(aCons: Cons): LispValue {\n return aCons.car;\n }\n\n /**\n * Implementation of the Lisp `quasiquote` (`` ` ``) special form. Returns the\n * template with every `unquote` (`,`) and `unquote-splicing` (`,@`) at the\n * matching nesting level replaced by the evaluation of its operand. Nested\n * quasiquotes increase the level so inner unquotes are preserved.\n * @param aCons the argument Cons whose car is the template\n * @return the constructed form\n */\n quasiquote(aCons: Cons): LispValue {\n return this.quasiquoteExpand(aCons.car, 1);\n }\n\n /**\n * Recursively expands a quasiquote template at the given nesting level.\n * @param template the template to expand\n * @param level the current quasiquote nesting level (1 is the outermost)\n * @return the expanded value\n */\n quasiquoteExpand(template: LispValue, level: number): LispValue {\n if (Cons.isNotCons(template)) {\n return template;\n }\n const aCons = template as Cons;\n if (aCons.car === InterpretedSymbol.of('unquote')) {\n if (level === 1) {\n return Evaluator.eval(\n aCons.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n return new Cons(\n InterpretedSymbol.of('unquote'),\n new Cons(this.quasiquoteExpand(aCons.nth(2), level - 1), Cons.nil),\n );\n }\n if (aCons.car === InterpretedSymbol.of('quasiquote')) {\n return new Cons(\n InterpretedSymbol.of('quasiquote'),\n new Cons(this.quasiquoteExpand(aCons.nth(2), level + 1), Cons.nil),\n );\n }\n\n return this.quasiquoteList(aCons, level);\n }\n\n /**\n * Expands the elements of a quasiquoted list, handling `unquote-splicing`\n * (`,@`) elements and a possible dotted `unquote` (`,`) tail.\n * @param template the list template to expand\n * @param level the current quasiquote nesting level\n * @return the constructed list\n */\n quasiquoteList(template: Cons, level: number): LispValue {\n const parts: LispValue[] = [];\n let tail: LispValue = Cons.nil;\n let current: LispValue = template;\n\n while (Cons.isCons(current)) {\n // A dotted `(... . ,x)` tail surfaces as a cell whose car is the `unquote` symbol.\n if (current.car === InterpretedSymbol.of('unquote')) {\n tail = this.quasiquoteExpand(current, level);\n current = Cons.nil;\n break;\n }\n const head = current.car;\n if (Cons.isCons(head) && head.car === InterpretedSymbol.of('unquote-splicing')) {\n if (level === 1) {\n this.spliceInto(\n parts,\n Evaluator.eval(\n head.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n ),\n );\n } else {\n parts.push(\n new Cons(\n InterpretedSymbol.of('unquote-splicing'),\n new Cons(this.quasiquoteExpand(head.nth(2), level - 1), Cons.nil),\n ),\n );\n }\n } else {\n parts.push(this.quasiquoteExpand(head, level));\n }\n current = current.cdr;\n }\n if (Cons.isNotNil(current)) {\n tail = current;\n }\n\n let result: LispValue = tail;\n for (let index = parts.length - 1; index >= 0; index--) {\n result = new Cons(parts[index], result);\n }\n\n return result;\n }\n\n /**\n * Appends the elements of a spliced value (`,@`) onto the accumulator. The\n * value must be a proper list (or nil); an atom or an improper (dotted) list\n * is rejected rather than silently dropping the dotted tail.\n * @param parts the accumulator of list elements\n * @param value the value produced by an `unquote-splicing` operand\n */\n spliceInto(parts: LispValue[], value: LispValue): null {\n if (Cons.isNil(value)) {\n return null;\n }\n if (Cons.isNotCons(value)) {\n throw new EvalError(cannotApply('unquote-splicing', value));\n }\n let current: LispValue = value;\n while (Cons.isCons(current)) {\n parts.push(current.car);\n current = current.cdr;\n }\n if (Cons.isNotNil(current)) {\n throw new EvalError(cannotApply('unquote-splicing', value));\n }\n\n return null;\n }\n\n /**\n * Implementation of the Lisp `unquote` (`,`) special form. Signals an error\n * because unquote is only meaningful inside a `quasiquote` template.\n */\n unquote(): never {\n throw new EvalError('unquote (\",\") is only valid inside a quasiquote (\"`\")');\n }\n\n /**\n * Implementation of the Lisp `unquote-splicing` (`,@`) special form. Signals\n * an error because unquote-splicing is only meaningful inside a `quasiquote`\n * template.\n */\n unquoteSplicing(): never {\n throw new EvalError('unquote-splicing (\",@\") is only valid inside a quasiquote (\"`\")');\n }\n\n /**\n * Implementation of the Lisp `rplaca` special form; destructively replaces the car of a Cons.\n * @param args the argument Cons containing the target Cons expression and the new car value\n * @return the modified Cons\n */\n rplaca(args: Cons): LispValue {\n let anObject = Evaluator.eval(\n args.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(anObject)) {\n throw new EvalError(cannotApply('set-car!', anObject));\n }\n const aCons = anObject as Cons;\n anObject = Evaluator.eval(\n args.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n aCons.setCar(anObject);\n\n return Evaluator.eval(args.car, this.environment, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Implementation of the Lisp `rplacd` special form; destructively replaces the cdr of a Cons.\n * @param args the argument Cons containing the target Cons expression and the new cdr value\n * @return the modified Cons\n */\n rplacd(args: Cons): LispValue {\n let anObject = Evaluator.eval(\n args.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotCons(anObject)) {\n throw new EvalError(cannotApply('set-cdr!', anObject));\n }\n const aCons = anObject as Cons;\n anObject = Evaluator.eval(\n args.nth(2),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n aCons.setCdr(anObject);\n\n return Evaluator.eval(args.car, this.environment, this.streamManager, this.depth, this.plugins);\n }\n\n /**\n * Implementation of the Lisp `setq` special form; assigns values in the local environment.\n * @param args the argument Cons containing alternating (symbol value) pairs\n * @return the last assigned value\n */\n setq(args: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const anIterator = args.loop();\n const index = -1;\n\n while (anIterator.hasNext()) {\n if (!Cons.isSymbol(args.nth(index + 2))) {\n throw new EvalError(notSymbol(args.car));\n }\n const key = anIterator.next() as InterpretedSymbol;\n\n if (!anIterator.hasNext()) {\n throw new EvalError(SIZES_DO_NOT_MATCH);\n }\n anObject = Evaluator.eval(\n anIterator.next(),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.set(key, anObject);\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `set-allq` special form; assigns values in the binding's owning scope.\n * @param args the argument Cons containing alternating (symbol value) pairs\n * @return the last assigned value\n */\n set_allq(args: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const anIterator = args.loop();\n const index = -1;\n\n while (anIterator.hasNext()) {\n if (!Cons.isSymbol(args.nth(index + 2))) {\n throw new EvalError(notSymbol(args.car));\n }\n const key = anIterator.next() as InterpretedSymbol;\n anObject = Evaluator.eval(\n anIterator.next(),\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n this.environment.setIfExist(key, anObject);\n }\n\n return anObject;\n }\n\n /**\n * Sets the current call depth used for trace and spy indentation.\n * @param aNumber the new depth\n */\n setDepth(aNumber: number): null {\n this.depth = aNumber;\n return null;\n }\n\n /**\n * Builds and returns the Lisp-name to method-name dispatch map for special forms.\n * @return the dispatch map\n */\n static setup(): Map<InterpretedSymbol, string> {\n try {\n const entries: Array<[string, string]> = [\n ['and', 'and'],\n ['apply', 'apply_lisp'],\n ['bind', 'bind'],\n ['cond', 'cond'],\n ['defmacro', 'defmacro'],\n ['defun', 'defun'],\n ['do', 'do_'],\n ['dolist', 'doList'],\n ['do*', 'doStar'],\n ['eval', 'eval_lisp'],\n ['exit', 'exit'],\n ['gc', 'gc'],\n ['if', 'if_'],\n ['lambda', 'lambda'],\n ['let', 'let'],\n ['let*', 'letStar'],\n ['macroexpand', 'macroexpand'],\n ['macroexpand-1', 'macroexpand_1'],\n ['not', 'not'],\n ['notrace', 'notrace'],\n ['or', 'or'],\n ['pop', 'pop_'],\n ['progn', 'progn'],\n ['princ', 'princ'],\n ['print', 'print'],\n ['push', 'push_'],\n ['quasiquote', 'quasiquote'],\n ['quote', 'quote'],\n ['rplaca', 'rplaca'],\n ['rplacd', 'rplacd'],\n ['setq', 'setq'],\n ['set-allq', 'set_allq'],\n ['terpri', 'terpri'],\n ['time', 'time'],\n ['trace', 'trace'],\n ['unless', 'unless'],\n ['unquote', 'unquote'],\n ['unquote-splicing', 'unquoteSplicing'],\n ['when', 'when'],\n ];\n return new Map(entries.map(([key, value]) => [InterpretedSymbol.of(key), value]));\n } catch {\n throw new Error('NullPointerException (Evaluator, initialize)');\n }\n }\n\n /**\n * Dispatches a special-form call to the corresponding method via the build-in dispatch map.\n * @param form the form whose car is the special-form symbol\n * @return the result of the special-form method\n */\n specialForm(form: Cons): LispValue {\n const aSymbol = form.car as InterpretedSymbol;\n\n if (this.isSpy(aSymbol)) {\n this.spyPrint(this.streamManager.spyStream(aSymbol), form.toString());\n this.setDepth(this.depth + 1);\n }\n\n const aCons = form.cdr as Cons;\n const methodName = Evaluator.buildInFunctions.get(aSymbol) as string;\n\n const target = this as unknown as Record<string, unknown>;\n const fn = target[methodName];\n if (typeof fn !== 'function') {\n throw new TypeError(`${this.constructor.name} does not have a method named \"${methodName}\"`);\n }\n const answer = (fn as (a: Cons) => LispValue).apply(target, [aCons]);\n\n if (this.isSpy(aSymbol)) {\n this.setDepth(this.depth - 1);\n this.spyPrint(\n this.streamManager.spyStream(aSymbol),\n String(answer) + ' <== ' + String(aSymbol),\n );\n }\n\n return answer;\n }\n\n /**\n * Writes a trace/spy line to the given stream (or stdout) with the current indentation.\n * @param aStream the destination stream, or null/string to fall back to stdout\n * @param line the line to write\n */\n spyPrint(aStream: NodeJS.WritableStream | string | null, line: string): null {\n const target: NodeJS.WritableStream =\n aStream != null && typeof aStream === 'object' && 'write' in aStream\n ? aStream\n : process.stdout;\n target.write(this.indent() + line + '\\n');\n return null;\n }\n\n /**\n * Implementation of the Lisp `terpri` special form; writes a newline to stdout.\n * @return the symbol t\n */\n terpri(): InterpretedSymbol {\n process.stdout.write('\\n');\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `time` special form; measures evaluation time in milliseconds.\n * @param aCons the argument Cons whose car is the form to time\n * @return the elapsed time in milliseconds\n */\n time(aCons: Cons): number {\n const start = process.hrtime();\n Evaluator.eval(aCons.car, this.environment, this.streamManager, this.depth, this.plugins);\n const end = process.hrtime(start);\n\n return end[1] / 1_000_000;\n }\n\n /**\n * Implementation of the Lisp `trace` special form; enables tracing.\n * @return the symbol t\n */\n trace(): InterpretedSymbol {\n this.streamManager.trace();\n return InterpretedSymbol.of('t');\n }\n\n /**\n * Implementation of the Lisp `unless` special form.\n * @param aCons the argument Cons containing the test and body\n * @return the value of the last body form if the test is nil, otherwise nil\n */\n unless(aCons: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const theCons = aCons.cdr as Cons;\n const flag = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNotNil(flag)) {\n return Cons.nil;\n }\n for (const each of theCons.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n\n /**\n * Implementation of the Lisp `when` special form.\n * @param aCons the argument Cons containing the test and body\n * @return the value of the last body form if the test is non-nil, otherwise nil\n */\n when(aCons: Cons): LispValue {\n let anObject: LispValue = Cons.nil;\n const theCons = aCons.cdr as Cons;\n const flag = Evaluator.eval(\n aCons.car,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n if (Cons.isNil(flag)) {\n return Cons.nil;\n }\n for (const each of theCons.loop()) {\n anObject = Evaluator.eval(\n each,\n this.environment,\n this.streamManager,\n this.depth,\n this.plugins,\n );\n }\n\n return anObject;\n }\n}\n","import { Cons } from '../../value/Cons/index.js';\nimport { Evaluator } from '../../runtime/Evaluator/index.js';\nimport { InterpretedSymbol } from '../../value/InterpretedSymbol/index.js';\nimport { StreamManager } from '../../runtime/StreamManager/index.js';\nimport { Table } from '../../runtime/Table/index.js';\nimport type { KeiLispPlugin } from '../../plugin/types.js';\nimport type { LispValue } from '../../types/index.js';\n\n/**\n * @class\n * @classdesc Class for the interpreter.\n * @author Keisuke Ikeda\n * @this {LispInterpreter}\n */\nexport class LispInterpreter extends Object {\n /**\n * The root (top-level) environment table, pre-populated with built-in symbols.\n */\n root: Table;\n /**\n * The stream manager that owns the interpreter's output / spy streams.\n */\n streamManager: StreamManager;\n /**\n * Registered plugins consulted by the evaluator on every call. See `use`.\n */\n plugins: KeiLispPlugin[];\n\n /**\n * Constructor.\n * @constructor\n */\n constructor() {\n super();\n this.root = this.initializeTable();\n this.streamManager = new StreamManager();\n this.plugins = [];\n }\n\n /**\n * Registers a plugin. Subsequent `eval` calls will consult the plugin chain\n * (in registration order, first match wins) when no special form matches a\n * symbol, before falling through to the Applier built-ins.\n * @param plugin the plugin to register\n * @return this interpreter, for chaining\n */\n use(plugin: KeiLispPlugin): this {\n this.plugins.push(plugin);\n return this;\n }\n\n /**\n * Evaluates the given expression and returns the result. Throws `ParseError`,\n * `EvalError`, or `ExitError` on failure; library users are expected to catch\n * these (see the `KeiLispError` base class for the parse/eval family).\n * @param aCons the expression to evaluate\n * @return the evaluation result\n */\n eval(aCons: LispValue): LispValue {\n return Evaluator.eval(aCons, this.root, this.streamManager, 1, this.plugins);\n }\n\n /**\n * Parses the source string, evaluates every expression it contains, and returns the results as an array.\n * @param source the Lisp source string\n * @return the array of evaluation results, one per top-level expression\n */\n evalAll(source: string): LispValue[] {\n const ast = this.parse(source);\n const results: LispValue[] = [];\n for (const expr of ast.loop()) {\n results.push(this.eval(expr));\n }\n return results;\n }\n\n /**\n * Parses and evaluates the source string and returns the value of the last expression.\n * @param source the Lisp source string\n * @return the value of the last expression, or `Cons.nil` for empty input\n */\n evalString(source: string): LispValue {\n const results = this.evalAll(source);\n return results.length === 0 ? Cons.nil : (results.at(-1) ?? Cons.nil);\n }\n\n /**\n * Parses the given string into a list of top-level expressions and returns\n * it. The result is always a `Cons` (possibly `Cons.nil` for empty input)\n * because the source is wrapped in an outer list before parsing. Throws\n * `ParseError` if the source cannot be parsed.\n * @param aString the Lisp source string\n * @return a Cons containing the parsed top-level expressions\n */\n parse(aString: string): Cons {\n return Cons.parse('(' + aString + '\\n);') as Cons;\n }\n\n /**\n * Sets the given environment as the root of the environment chain.\n * @param environment the environment table to install as root\n * @return null\n */\n setRoot(environment: Table): null {\n if (environment instanceof Table) {\n environment.setRoot(true);\n this.root = environment;\n }\n\n return null;\n }\n\n /**\n * Builds the root environment table by pre-registering every built-in symbol and the small set of bootstrap lambdas (append / butlast / nthcdr / reverse).\n * @return the freshly initialized root environment\n */\n initializeTable(): Table {\n const aList: string[] = [];\n const aTable = new Table();\n aTable.setRoot(true);\n\n aList.push(\n 'abs',\n 'add',\n 'and',\n 'apply',\n 'assoc',\n 'atom',\n 'bind',\n 'car',\n 'cdr',\n 'characterp',\n 'cond',\n 'ceiling',\n 'concatenate',\n 'cons',\n 'consp',\n 'copy',\n 'cos',\n 'count',\n 'floatp',\n 'floor',\n 'defmacro',\n 'defun',\n 'divide',\n 'do',\n 'do*',\n 'dolist',\n 'doublep',\n 'elt',\n 'eq',\n 'equal',\n 'eval',\n 'evenp',\n 'every',\n 'exit',\n 'exp',\n 'expt',\n 'find',\n 'format',\n 'gc',\n 'gensym',\n 'if',\n 'integerp',\n 'lambda',\n 'let',\n 'let*',\n 'last',\n 'length',\n 'list',\n 'listp',\n 'macroexpand',\n 'macroexpand-1',\n 'mapcan',\n 'mapcar',\n 'max',\n 'member',\n 'memq',\n 'min',\n 'minusp',\n 'mod',\n 'multiply',\n 'napier',\n 'neq',\n 'nequal',\n 'not',\n 'notrace',\n 'nth',\n 'null',\n 'numberp',\n 'oddp',\n 'or',\n 'pi',\n 'plusp',\n 'pop',\n 'princ',\n 'print',\n 'progn',\n 'push',\n 'quasiquote',\n 'quote',\n 'random',\n 'reduce',\n 'round',\n 'rplaca',\n 'rplacd',\n 'setq',\n 'set-allq',\n 'sin',\n 'some',\n 'sort',\n 'sqrt',\n 'string-downcase',\n 'string-trim',\n 'string-upcase',\n 'stringp',\n 'subseq',\n 'substring',\n 'subtract',\n 'symbolp',\n 'tan',\n 'terpri',\n 'time',\n 'trace',\n 'truncate',\n 'unless',\n 'unquote',\n 'unquote-splicing',\n 'when',\n 'zerop',\n '1+',\n '1-',\n '+',\n '-',\n '*',\n '/',\n '//',\n '=',\n '==',\n '~=',\n '~~',\n '<',\n '<=',\n '>',\n '>=',\n );\n\n for (const each of aList) {\n const aSymbol = InterpretedSymbol.of(each);\n aTable.set(aSymbol, aSymbol);\n }\n\n let aString: string;\n let aCons: Cons;\n aString =\n '(lambda (list1 list2) (cond ((null (listp list1)) nil) ((null (listp list2)) nil) ((null list1) list2) (t (cons (car list1) (append (cdr list1) list2)))))';\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('append'), aCons);\n\n aString =\n '(lambda (l n) (cond ((<= (length l) n) nil) (t (cons (car l) (butlast (cdr l) n)))))';\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('butlast'), aCons);\n\n aString =\n '(lambda (n l) (cond ((> n (length l)) nil) ((= 0 n) l) (t (nthcdr (- n 1) (cdr l)))))';\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('nthcdr'), aCons);\n\n aString =\n \"(lambda (l) (cond ((null (listp l)) l) ((null l) '()) (t (append (reverse (cdr l)) (list (car l))))))\";\n aCons = Cons.parse(aString) as Cons;\n aCons.last().setCdr(new Cons(aTable, Cons.nil));\n aTable.set(InterpretedSymbol.of('reverse'), aCons);\n\n aTable.set(InterpretedSymbol.of('t'), InterpretedSymbol.of('t'));\n\n return aTable;\n }\n}\n","import { createRequire } from 'node:module';\nimport type { Interface as ReadlineInterface } from 'node:readline';\n\nimport { Cons } from '../../value/Cons/index.js';\nimport { ExitError } from '../../errors/ExitError/index.js';\nimport { KeiLispError } from '../../errors/KeiLispError/index.js';\nimport { LispInterpreter } from '../LispInterpreter/index.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * @class\n * @classdesc Interactive REPL wrapper around LispInterpreter. Handles line accumulation, parenthesis balancing, and prompt I/O.\n * @author Keisuke Ikeda\n * @this {Repl}\n */\nexport class Repl extends Object {\n /**\n * The underlying interpreter used to parse and evaluate user input.\n */\n interpreter: LispInterpreter;\n /**\n * The Node.js readline interface that supplies prompt I/O.\n */\n rl: ReadlineInterface;\n\n /**\n * Constructor.\n * @constructor\n * @param interpreter the interpreter to evaluate input against (defaults to a fresh one)\n */\n constructor(interpreter: LispInterpreter = new LispInterpreter()) {\n super();\n this.interpreter = interpreter;\n\n const readline = require('node:readline') as typeof import('node:readline');\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: '>> ',\n });\n }\n\n /**\n * Starts the REPL loop.\n * @return void\n */\n run(): void {\n let aString = '';\n let leftParentheses = 0;\n let exitedViaLisp = false;\n\n this.rl.prompt();\n this.rl\n .on('line', (line: string) => {\n line += ' ';\n\n for (const aCharacter of line) {\n if (aCharacter === '(') {\n leftParentheses++;\n }\n if (aCharacter === ')') {\n leftParentheses--;\n }\n aString += aCharacter;\n }\n\n if (leftParentheses <= 0) {\n try {\n const aCons = this.interpreter.parse(aString);\n for (const each of aCons.loop()) {\n process.stdout.write(\n (this.interpreter.eval(each) as { toString(): string }).toString() + '\\n',\n );\n }\n } catch (error) {\n if (error instanceof ExitError) {\n exitedViaLisp = true;\n this.rl.close();\n return;\n }\n if (error instanceof KeiLispError) {\n console.error(`*** ${error.name}: ${error.message} ***`);\n process.stdout.write(Cons.nil.toString() + '\\n');\n } else {\n throw error;\n }\n }\n leftParentheses = 0;\n aString = '';\n this.rl.prompt();\n }\n })\n .on('close', () => {\n // Skip the message if (exit) was called, since Evaluator.exit() already printed \"Bye!\".\n if (!exitedViaLisp) {\n console.log('\\nBye!');\n }\n });\n }\n}\n"],"mappings":"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"}
|