• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

source-academy / js-slang / 17011975380

16 Aug 2025 07:14PM UTC coverage: 78.56%. Remained the same
17011975380

Pull #1799

github

web-flow
Merge ab7273df7 into 20b0a35b6
Pull Request #1799: Migrate to TypeScript 5.9

2979 of 4115 branches covered (72.39%)

Branch coverage included in aggregate %.

33 of 38 new or added lines in 15 files covered. (86.84%)

1 existing line in 1 file now uncovered.

8981 of 11109 relevant lines covered (80.84%)

155600.21 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.67
/src/createContext.ts
1
// Variable determining chapter of Source is contained in this file.
2

3
import { schemeVisualise } from './alt-langs/scheme/scheme-mapper'
72✔
4
import * as scheme_libs from './alt-langs/scheme/scm-slang/src/stdlib/source-scheme-library'
72✔
5
import { GLOBAL, JSSLANG_PROPERTIES } from './constants'
72✔
6
import { call_with_current_continuation } from './cse-machine/continuations'
72✔
7
import Heap from './cse-machine/heap'
72✔
8
import { Transformers } from './cse-machine/interpreter'
72✔
9
import { cset_apply, cset_eval } from './cse-machine/scheme-macros'
72✔
10
import * as list from './stdlib/list'
72✔
11
import { list_to_vector } from './stdlib/list'
72✔
12
import { listPrelude } from './stdlib/list.prelude'
72✔
13
import { localImportPrelude } from './stdlib/localImport.prelude'
72✔
14
import * as misc from './stdlib/misc'
72✔
15
import * as parser from './stdlib/parser'
72✔
16
import * as pylib from './stdlib/pylib'
72✔
17
import {
72✔
18
  scheme1Prelude,
19
  scheme2Prelude,
20
  scheme3Prelude,
21
  scheme4Prelude,
22
  schemeFullPrelude
23
} from './stdlib/scheme.prelude'
24
import * as stream from './stdlib/stream'
72✔
25
import { streamPrelude } from './stdlib/stream.prelude'
72✔
26
import { createTypeEnvironment, tForAll, tVar } from './typeChecker/utils'
72✔
27
import {
72✔
28
  Chapter,
29
  type Context,
30
  type CustomBuiltIns,
31
  type Environment,
32
  type LanguageOptions,
33
  type NativeStorage,
34
  type Value,
35
  Variant
36
} from './types'
37
import * as operators from './utils/operators'
72✔
38
import { stringify } from './utils/stringify'
72✔
39

40
export class EnvTree {
72✔
41
  private _root: EnvTreeNode | null = null
4,155✔
42
  private map = new Map<Environment, EnvTreeNode>()
4,155✔
43

44
  get root(): EnvTreeNode | null {
45
    return this._root
3✔
46
  }
47

48
  public insert(environment: Environment): void {
49
    const tailEnvironment = environment.tail
458,328✔
50
    if (tailEnvironment === null) {
458,328✔
51
      if (this._root === null) {
3,132✔
52
        this._root = new EnvTreeNode(environment, null)
3,132✔
53
        this.map.set(environment, this._root)
3,132✔
54
      }
55
    } else {
56
      const parentNode = this.map.get(tailEnvironment)
455,196✔
57
      if (parentNode) {
455,196✔
58
        const childNode = new EnvTreeNode(environment, parentNode)
455,196✔
59
        parentNode.addChild(childNode)
455,196✔
60
        this.map.set(environment, childNode)
455,196✔
61
      }
62
    }
63
  }
64

65
  public getTreeNode(environment: Environment): EnvTreeNode | undefined {
66
    return this.map.get(environment)
5✔
67
  }
68
}
69

70
export class EnvTreeNode {
72✔
71
  private _children: EnvTreeNode[] = []
458,329✔
72

73
  constructor(
74
    readonly environment: Environment,
458,329✔
75
    public parent: EnvTreeNode | null
458,329✔
76
  ) {}
77

78
  get children(): EnvTreeNode[] {
79
    return this._children
3✔
80
  }
81

82
  public resetChildren(newChildren: EnvTreeNode[]): void {
83
    this.clearChildren()
1✔
84
    this.addChildren(newChildren)
1✔
85
    newChildren.forEach(c => (c.parent = this))
3✔
86
  }
87

88
  private clearChildren(): void {
89
    this._children = []
1✔
90
  }
91

92
  private addChildren(newChildren: EnvTreeNode[]): void {
93
    this._children.push(...newChildren)
1✔
94
  }
95

96
  public addChild(newChild: EnvTreeNode): EnvTreeNode {
97
    this._children.push(newChild)
455,197✔
98
    return newChild
455,197✔
99
  }
100
}
101

102
const createEmptyRuntime = () => ({
3,138✔
103
  break: false,
104
  debuggerOn: true,
105
  isRunning: false,
106
  environmentTree: new EnvTree(),
107
  environments: [],
108
  value: undefined,
109
  nodes: [],
110
  control: null,
111
  stash: null,
112
  transformers: new Transformers(),
113
  objectCount: 0,
114
  envSteps: -1,
115
  envStepsTotal: 0,
116
  breakpointSteps: [],
117
  changepointSteps: []
118
})
119

120
const createEmptyDebugger = () => ({
3,138✔
121
  observers: { callbacks: Array<() => void>() },
122
  status: false,
123
  state: {
124
    it: (function* (): any {
125
      return
×
126
    })()
127
  }
128
})
129

130
export const createGlobalEnvironment = (): Environment => ({
3,132✔
131
  tail: null,
132
  name: 'global',
133
  head: {},
134
  heap: new Heap(),
135
  id: '-1'
136
})
137

138
const createNativeStorage = (): NativeStorage => ({
3,138✔
139
  builtins: new Map(),
140
  previousProgramsIdentifiers: new Set(),
141
  operators: new Map(Object.entries(operators)),
142
  maxExecTime: JSSLANG_PROPERTIES.maxExecTime,
143
  evaller: null,
144
  loadedModules: {},
145
  loadedModuleTypes: {}
146
})
147

148
export const createEmptyContext = <T>(
72✔
149
  chapter: Chapter,
150
  variant: Variant = Variant.DEFAULT,
×
151
  languageOptions: LanguageOptions = {},
8✔
152
  externalSymbols: string[],
153
  externalContext?: T
154
): Context<T> => {
155
  return {
3,138✔
156
    chapter,
157
    externalSymbols,
158
    errors: [],
159
    externalContext,
160
    runtime: createEmptyRuntime(),
161
    numberOfOuterEnvironments: 1,
162
    prelude: null,
163
    debugger: createEmptyDebugger(),
164
    nativeStorage: createNativeStorage(),
165
    executionMethod: 'auto',
166
    variant,
167
    languageOptions,
168
    moduleContexts: {},
169
    unTypecheckedCode: [],
170
    typeEnvironment: createTypeEnvironment(chapter),
171
    previousPrograms: [],
172
    shouldIncreaseEvaluationTimeout: false
173
  }
174
}
175

176
export const ensureGlobalEnvironmentExist = (context: Context) => {
72✔
177
  if (!context.runtime) {
6,260!
178
    context.runtime = createEmptyRuntime()
×
179
  }
180
  if (!context.runtime.environments) {
6,260!
181
    context.runtime.environments = []
×
182
  }
183
  if (!context.runtime.environmentTree) {
6,260!
184
    context.runtime.environmentTree = new EnvTree()
×
185
  }
186
  if (context.runtime.environments.length === 0) {
6,260✔
187
    const globalEnvironment = createGlobalEnvironment()
3,130✔
188
    context.runtime.environments.push(globalEnvironment)
3,130✔
189
    context.runtime.environmentTree.insert(globalEnvironment)
3,130✔
190
  }
191
}
192

193
export const defineSymbol = (context: Context, name: string, value: Value) => {
72✔
194
  const globalEnvironment = context.runtime.environments[0]
222,927✔
195
  Object.defineProperty(globalEnvironment.head, name, {
222,927✔
196
    value,
197
    writable: false,
198
    enumerable: true
199
  })
200
  context.nativeStorage.builtins.set(name, value)
222,927✔
201
  const typeEnv = context.typeEnvironment[0]
222,927✔
202
  // if the global type env doesn't already have the imported symbol,
203
  // we set it to a type var T that can typecheck with anything.
204
  if (!typeEnv.declKindMap.has(name)) {
222,927✔
205
    typeEnv.typeMap.set(name, tForAll(tVar('T1')))
33,711✔
206
    typeEnv.declKindMap.set(name, 'const')
33,711✔
207
  }
208
}
209

210
export function defineBuiltin(
211
  context: Context,
212
  name: string, // enforce minArgsNeeded
213
  value: Value,
214
  minArgsNeeded: number
215
): void
216
export function defineBuiltin(
217
  context: Context,
218
  name: string,
219
  value: Value,
220
  minArgsNeeded?: number
221
): void
222
// Defines a builtin in the given context
223
// If the builtin is a function, wrap it such that its toString hides the implementation
224
export function defineBuiltin(
72✔
225
  context: Context,
226
  name: string,
227
  value: Value,
228
  minArgsNeeded: undefined | number = undefined
195,891✔
229
) {
230
  function extractName(name: string): string {
231
    return name.split('(')[0].trim()
189,597✔
232
  }
233

234
  function extractParameters(name: string): string[] {
235
    // if the function has no () in its name, it has no parameters
236
    if (!name.includes('(')) {
189,597✔
237
      return []
17✔
238
    }
239
    return name
189,580✔
240
      .split('(')[1]
241
      .split(')')[0]
242
      .split(',')
243
      .map(s => s.trim())
233,940✔
244
  }
245

246
  if (typeof value === 'function') {
222,927✔
247
    const funName = extractName(name)
189,597✔
248
    const funParameters = extractParameters(name)
189,597✔
249
    const repr = `function ${name} {\n\t[implementation hidden]\n}`
189,597✔
250
    value.toString = () => repr
189,597✔
251
    value.minArgsNeeded = minArgsNeeded
189,597✔
252
    value.funName = funName
189,597✔
253
    value.funParameters = funParameters
189,597✔
254

255
    defineSymbol(context, funName, value)
189,597✔
256
  } else {
257
    defineSymbol(context, name, value)
33,330✔
258
  }
259
}
260

261
export const importExternalSymbols = (context: Context, externalSymbols: string[]) => {
72✔
262
  ensureGlobalEnvironmentExist(context)
3,130✔
263

264
  externalSymbols.forEach(symbol => {
3,130✔
NEW
265
    defineSymbol(context, symbol, GLOBAL[symbol as keyof typeof GLOBAL])
×
266
  })
267
}
268

269
/**
270
 * Imports builtins from standard and external libraries.
271
 */
272
export const importBuiltins = (context: Context, externalBuiltIns: CustomBuiltIns) => {
72✔
273
  ensureGlobalEnvironmentExist(context)
3,130✔
274
  const rawDisplay = (v: Value, ...s: string[]) =>
3,130✔
275
    externalBuiltIns.rawDisplay(v, s[0], context.externalContext)
38✔
276
  const display = (v: Value, ...s: string[]) => {
3,130✔
277
    if (s.length === 1 && s[0] !== undefined && typeof s[0] !== 'string') {
38✔
278
      throw new TypeError('display expects the second argument to be a string')
1✔
279
    }
280
    return (rawDisplay(stringify(v), s[0]), v)
37✔
281
  }
282
  const displayList = (v: Value, ...s: string[]) => {
3,130✔
283
    if (s.length === 1 && s[0] !== undefined && typeof s[0] !== 'string') {
19✔
284
      throw new TypeError('display_list expects the second argument to be a string')
1✔
285
    }
286
    return list.rawDisplayList(display, v, s[0])
18✔
287
  }
288
  const prompt = (v: Value) => {
3,130✔
289
    const start = Date.now()
×
290
    const promptResult = externalBuiltIns.prompt(v, '', context.externalContext)
×
291
    context.nativeStorage.maxExecTime += Date.now() - start
×
292
    return promptResult
×
293
  }
294
  const alert = (v: Value) => {
3,130✔
295
    const start = Date.now()
2✔
296
    externalBuiltIns.alert(v, '', context.externalContext)
2✔
297
    context.nativeStorage.maxExecTime += Date.now() - start
2✔
298
  }
299
  const visualiseList = (...v: Value) => {
3,130✔
300
    externalBuiltIns.visualiseList(v, context.externalContext)
3✔
301
    return v[0]
3✔
302
  }
303

304
  if (context.chapter >= 1) {
3,130✔
305
    defineBuiltin(context, 'get_time()', misc.get_time)
2,985✔
306
    defineBuiltin(context, 'display(val, prepend = undefined)', display, 1)
2,985✔
307
    defineBuiltin(context, 'raw_display(str, prepend = undefined)', rawDisplay, 1)
2,985✔
308
    defineBuiltin(context, 'stringify(val, indent = 2, maxLineLength = 80)', stringify, 1)
2,985✔
309
    defineBuiltin(context, 'error(str, prepend = undefined)', misc.error_message, 1)
2,985✔
310
    defineBuiltin(context, 'prompt(str)', prompt)
2,985✔
311
    defineBuiltin(context, 'is_number(val)', misc.is_number)
2,985✔
312
    defineBuiltin(context, 'is_string(val)', misc.is_string)
2,985✔
313
    defineBuiltin(context, 'is_function(val)', misc.is_function)
2,985✔
314
    defineBuiltin(context, 'is_boolean(val)', misc.is_boolean)
2,985✔
315
    defineBuiltin(context, 'is_undefined(val)', misc.is_undefined)
2,985✔
316
    defineBuiltin(context, 'parse_int(str, radix)', misc.parse_int)
2,985✔
317
    defineBuiltin(context, 'char_at(str, index)', misc.char_at)
2,985✔
318
    defineBuiltin(context, 'arity(f)', misc.arity)
2,985✔
319
    defineBuiltin(context, 'undefined', undefined)
2,985✔
320
    defineBuiltin(context, 'NaN', NaN)
2,985✔
321
    defineBuiltin(context, 'Infinity', Infinity)
2,985✔
322
    // Define all Math libraries
323
    const mathLibraryNames = Object.getOwnPropertyNames(Math)
2,985✔
324
    // Short param names for stringified version of math functions
325
    const parameterNames = [...'abcdefghijklmnopqrstuvwxyz']
2,985✔
326
    for (const name of mathLibraryNames) {
2,985✔
327
      const value = Math[name as keyof typeof Math]
128,355✔
328
      if (typeof value === 'function') {
128,355✔
329
        let paramString: string
330
        let minArgsNeeded = undefined
104,475✔
331
        if (name === 'max' || name === 'min') {
104,475✔
332
          paramString = '...values'
5,970✔
333
          minArgsNeeded = 0
5,970✔
334
        } else {
335
          paramString = parameterNames.slice(0, value.length).join(', ')
98,505✔
336
        }
337
        defineBuiltin(context, `math_${name}(${paramString})`, value, minArgsNeeded)
104,475✔
338
      } else {
339
        defineBuiltin(context, `math_${name}`, value)
23,880✔
340
      }
341
    }
342
  }
343

344
  if (context.chapter >= 2) {
3,130✔
345
    // List library
346
    defineBuiltin(context, 'pair(left, right)', list.pair)
1,635✔
347
    defineBuiltin(context, 'is_pair(val)', list.is_pair)
1,635✔
348
    defineBuiltin(context, 'head(xs)', list.head)
1,635✔
349
    defineBuiltin(context, 'tail(xs)', list.tail)
1,635✔
350
    defineBuiltin(context, 'is_null(val)', list.is_null)
1,635✔
351
    defineBuiltin(context, 'list(...values)', list.list, 0)
1,635✔
352
    defineBuiltin(context, 'draw_data(...xs)', visualiseList, 1)
1,635✔
353
    defineBuiltin(context, 'display_list(val, prepend = undefined)', displayList, 0)
1,635✔
354
    defineBuiltin(context, 'is_list(val)', list.is_list)
1,635✔
355
  }
356

357
  if (context.chapter >= 3) {
3,130✔
358
    defineBuiltin(context, 'set_head(xs, val)', list.set_head)
1,359✔
359
    defineBuiltin(context, 'set_tail(xs, val)', list.set_tail)
1,359✔
360
    defineBuiltin(context, 'array_length(arr)', misc.array_length)
1,359✔
361
    defineBuiltin(context, 'is_array(val)', misc.is_array)
1,359✔
362

363
    // Stream library
364
    defineBuiltin(context, 'stream(...values)', stream.stream, 0)
1,359✔
365
  }
366

367
  if (context.chapter >= 4) {
3,130✔
368
    defineBuiltin(context, 'parse(program_string)', (str: string) =>
1,187✔
369
      parser.parse(str, createContext(context.chapter))
71✔
370
    )
371
    defineBuiltin(context, 'tokenize(program_string)', (str: string) =>
1,187✔
372
      parser.tokenize(str, createContext(context.chapter))
3✔
373
    )
374
    defineBuiltin(
1,187✔
375
      context,
376
      'apply_in_underlying_javascript(fun, args)',
377
      // tslint:disable-next-line:ban-types
378
      (fun: Function, args: Value) => fun.apply(fun, list_to_vector(args))
5✔
379
    )
380

381
    // Continuations for explicit-control variant
382
    if (context.chapter >= 4) {
1,187✔
383
      defineBuiltin(
1,187✔
384
        context,
385
        'call_cc(f)',
386
        context.variant === Variant.EXPLICIT_CONTROL
1,187✔
387
          ? call_with_current_continuation
388
          : (f: any) => {
389
              throw new Error('call_cc is only available in Explicit-Control variant')
×
390
            }
391
      )
392
    }
393
  }
394

395
  if (context.chapter === Chapter.LIBRARY_PARSER) {
3,130✔
396
    defineBuiltin(context, 'is_object(val)', misc.is_object)
307✔
397
    defineBuiltin(context, 'is_NaN(val)', misc.is_NaN)
307✔
398
    defineBuiltin(context, 'has_own_property(obj, prop)', misc.has_own_property)
307✔
399
    defineBuiltin(context, 'alert(val)', alert)
307✔
400
    // tslint:disable-next-line:ban-types
401
    defineBuiltin(context, 'timed(fun)', (f: Function) =>
307✔
402
      misc.timed(context, f, context.externalContext, externalBuiltIns.rawDisplay)
×
403
    )
404
  }
405

406
  if (context.chapter <= +Chapter.SCHEME_1 && context.chapter >= +Chapter.FULL_SCHEME) {
3,130✔
407
    switch (context.chapter) {
75!
408
      case Chapter.FULL_SCHEME:
409
        // Introduction to eval
410
        // eval metaprocedure
411
        defineBuiltin(context, '$scheme_ZXZhbA$61$$61$(xs)', cset_eval)
56✔
412

413
      case Chapter.SCHEME_4:
414
        // Introduction to call/cc
415
        defineBuiltin(context, 'call$47$cc(f)', call_with_current_continuation)
62✔
416

417
      case Chapter.SCHEME_3:
418
        // Introduction to mutable values, streams
419

420
        // Scheme pair mutation
421
        defineBuiltin(context, 'set$45$car$33$(pair, val)', scheme_libs.set$45$car$33$)
63✔
422
        defineBuiltin(context, 'set$45$cdr$33$(pair, val)', scheme_libs.set$45$cdr$33$)
63✔
423

424
        // Scheme list mutation
425
        defineBuiltin(context, 'list$45$set$33$(xs, n, val)', scheme_libs.list$45$set$33$)
63✔
426
        //defineBuiltin(context, 'filter$33$(pred, xs)', scheme_libs.filterB);
427

428
        // Scheme promises
429
        defineBuiltin(context, 'make$45$promise(thunk)', scheme_libs.make$45$promise)
63✔
430
        defineBuiltin(context, 'promise$63$(p)', scheme_libs.promise$63$)
63✔
431
        defineBuiltin(context, 'force(p)', scheme_libs.force)
63✔
432

433
        // Scheme vectors
434
        defineBuiltin(context, 'vector(...vals)', scheme_libs.vector, 0)
63✔
435
        defineBuiltin(context, 'make$45$vector(n, val)', scheme_libs.make$45$vector, 1)
63✔
436

437
        defineBuiltin(context, 'vector$63$(v)', scheme_libs.vector$63$)
63✔
438

439
        defineBuiltin(context, 'vector$45$length(v)', scheme_libs.vector$45$length)
63✔
440
        defineBuiltin(context, 'vector$45$empty$63$(v)', scheme_libs.vector$45$empty$63$)
63✔
441

442
        defineBuiltin(context, 'vector$45$ref(v, k)', scheme_libs.vector$45$ref)
63✔
443

444
        defineBuiltin(context, 'vector$45$set$33$(v, k, val)', scheme_libs.vector$45$set$33$)
63✔
445
        defineBuiltin(
63✔
446
          context,
447
          'vector$45$fill$33$(v, val, start, end)',
448
          scheme_libs.vector$45$fill$33$,
449
          2
450
        )
451
        defineBuiltin(context, 'list$45$$62$vector(xs)', scheme_libs.list$45$$62$vector)
63✔
452

453
      case Chapter.SCHEME_2:
454
        // Scheme pairs
455
        defineBuiltin(context, 'cons(left, right)', scheme_libs.cons)
64✔
456
        defineBuiltin(context, 'xcons(right, left)', scheme_libs.xcons)
64✔
457
        defineBuiltin(context, 'pair$63$(val)', scheme_libs.pair$63$)
64✔
458
        defineBuiltin(context, 'not$45$pair$63$(val)', scheme_libs.not$45$pair$63$)
64✔
459
        defineBuiltin(context, 'car(xs)', scheme_libs.car)
64✔
460
        defineBuiltin(context, 'cdr(xs)', scheme_libs.cdr)
64✔
461

462
        // Scheme lists
463
        defineBuiltin(context, 'list(...vals)', scheme_libs.list, 0)
64✔
464
        defineBuiltin(context, 'list$42$(...vals)', scheme_libs.list$42$, 1)
64✔
465
        defineBuiltin(context, 'cons$42$(...vals)', scheme_libs.cons$42$, 1)
64✔
466
        defineBuiltin(context, 'circular$45$list(...vals)', scheme_libs.circular$45$list, 0)
64✔
467
        defineBuiltin(context, 'make$45$list(n, val)', scheme_libs.make$45$list, 1)
64✔
468

469
        defineBuiltin(context, 'circular$45$list$63$(val)', scheme_libs.circular$45$list$63$)
64✔
470
        defineBuiltin(context, 'proper$45$list$63$(val)', scheme_libs.proper$45$list$63$)
64✔
471
        defineBuiltin(context, 'dotted$45$list$63$(val)', scheme_libs.dotted$45$list$63$)
64✔
472
        defineBuiltin(context, 'null$63$(val)', scheme_libs.null$63$)
64✔
473
        defineBuiltin(context, 'null$45$list$63$(val)', scheme_libs.null$45$list$63$)
64✔
474
        defineBuiltin(context, 'list$63$(val)', scheme_libs.list$63$)
64✔
475

476
        defineBuiltin(context, 'list$45$tabulate(n, f)', scheme_libs.list$45$tabulate)
64✔
477
        defineBuiltin(context, 'list$45$tail(xs, n)', scheme_libs.list$45$tail)
64✔
478
        defineBuiltin(context, 'list$45$ref(xs, k)', scheme_libs.list$45$ref)
64✔
479
        defineBuiltin(context, 'last(xs)', scheme_libs.last)
64✔
480
        defineBuiltin(context, 'last$45$pair(xs)', scheme_libs.last$45$pair)
64✔
481

482
        defineBuiltin(context, 'first(xs)', scheme_libs.first)
64✔
483
        defineBuiltin(context, 'second(xs)', scheme_libs.second)
64✔
484
        defineBuiltin(context, 'third(xs)', scheme_libs.third)
64✔
485
        defineBuiltin(context, 'fourth(xs)', scheme_libs.fourth)
64✔
486
        defineBuiltin(context, 'fifth(xs)', scheme_libs.fifth)
64✔
487
        defineBuiltin(context, 'sixth(xs)', scheme_libs.sixth)
64✔
488
        defineBuiltin(context, 'seventh(xs)', scheme_libs.seventh)
64✔
489
        defineBuiltin(context, 'eighth(xs)', scheme_libs.eighth)
64✔
490
        defineBuiltin(context, 'ninth(xs)', scheme_libs.ninth)
64✔
491
        defineBuiltin(context, 'tenth(xs)', scheme_libs.tenth)
64✔
492

493
        // some of these functions will be represented
494
        // using the preludes
495
        // defineBuiltin(context, 'filter(pred, xs)', scheme_libs.filter)
496
        defineBuiltin(context, 'r7rs$45$map(f, ...xss)', scheme_libs.map, 2)
64✔
497
        defineBuiltin(context, 'r7rs$45$fold(f, init, ...xss)', scheme_libs.fold, 3)
64✔
498
        defineBuiltin(
64✔
499
          context,
500
          'r7rs$45$fold$45$right(f, init, ...xss)',
501
          scheme_libs.fold$45$right,
502
          3
503
        )
504
        defineBuiltin(context, 'r7rs$45$fold$45$left(f, init, ...xss)', scheme_libs.fold$45$left, 3)
64✔
505
        //defineBuiltin(context, 'reduce(f, ridentity, xs)', scheme_libs.reduce)
506
        //defineBuiltin(context, 'reduce$45$right(f, ridentity, xs)', scheme_libs.reduce$45$right)
507
        //defineBuiltin(context, 'reduce$45$left(f, ridentity, xs)', scheme_libs.reduce$45$left)
508

509
        defineBuiltin(context, 'any(xs)', scheme_libs.any)
64✔
510
        defineBuiltin(context, 'list$45$copy(xs)', scheme_libs.list$45$copy)
64✔
511
        defineBuiltin(context, 'length(xs)', scheme_libs.length)
64✔
512
        defineBuiltin(context, 'length$43$(xs)', scheme_libs.length$43$)
64✔
513
        defineBuiltin(context, 'r7rs$45$append(...xss)', scheme_libs.append, 0)
64✔
514
        defineBuiltin(context, 'concatenate(xss)', scheme_libs.concatenate)
64✔
515
        defineBuiltin(context, 'reverse(xs)', scheme_libs.reverse)
64✔
516
        defineBuiltin(context, 'take(xs, n)', scheme_libs.take)
64✔
517
        defineBuiltin(context, 'take$45$right(xs, n)', scheme_libs.take$45$right)
64✔
518
        defineBuiltin(context, 'drop(xs, n)', scheme_libs.drop)
64✔
519
        defineBuiltin(context, 'drop$45$right(xs, n)', scheme_libs.drop$45$right)
64✔
520

521
        defineBuiltin(context, 'list$61$(eq$45$pred, ...xss)', scheme_libs.list$61$, 1)
64✔
522

523
        /*
524
        defineBuiltin(context, 'memq(item, xs)', scheme_libs.memq)
525
        defineBuiltin(context, 'memv(item, xs)', scheme_libs.memv)
526
        defineBuiltin(context, 'member(item, xs)', scheme_libs.member)
527
        defineBuiltin(context, 'assq(item, xs)', scheme_libs.assq)
528
        defineBuiltin(context, 'assv(item, xs)', scheme_libs.assv)
529
        defineBuiltin(context, 'assoc(item, xs)', scheme_libs.assoc)
530
        */
531

532
        // Scheme cxrs
533

534
        defineBuiltin(context, 'caar(xs)', scheme_libs.caar)
64✔
535
        defineBuiltin(context, 'cadr(xs)', scheme_libs.cadr)
64✔
536
        defineBuiltin(context, 'cdar(xs)', scheme_libs.cdar)
64✔
537
        defineBuiltin(context, 'cddr(xs)', scheme_libs.cddr)
64✔
538
        defineBuiltin(context, 'caaar(xs)', scheme_libs.caaar)
64✔
539
        defineBuiltin(context, 'caadr(xs)', scheme_libs.caadr)
64✔
540
        defineBuiltin(context, 'cadar(xs)', scheme_libs.cadar)
64✔
541
        defineBuiltin(context, 'caddr(xs)', scheme_libs.caddr)
64✔
542
        defineBuiltin(context, 'cdaar(xs)', scheme_libs.cdaar)
64✔
543
        defineBuiltin(context, 'cdadr(xs)', scheme_libs.cdadr)
64✔
544
        defineBuiltin(context, 'cddar(xs)', scheme_libs.cddar)
64✔
545
        defineBuiltin(context, 'cdddr(xs)', scheme_libs.cdddr)
64✔
546
        defineBuiltin(context, 'caaaar(xs)', scheme_libs.caaaar)
64✔
547
        defineBuiltin(context, 'caaadr(xs)', scheme_libs.caaadr)
64✔
548
        defineBuiltin(context, 'caadar(xs)', scheme_libs.caadar)
64✔
549
        defineBuiltin(context, 'caaddr(xs)', scheme_libs.caaddr)
64✔
550
        defineBuiltin(context, 'cadaar(xs)', scheme_libs.cadaar)
64✔
551
        defineBuiltin(context, 'cadadr(xs)', scheme_libs.cadadr)
64✔
552
        defineBuiltin(context, 'caddar(xs)', scheme_libs.caddar)
64✔
553
        defineBuiltin(context, 'cadddr(xs)', scheme_libs.cadddr)
64✔
554
        defineBuiltin(context, 'cdaaar(xs)', scheme_libs.cdaaar)
64✔
555
        defineBuiltin(context, 'cdaadr(xs)', scheme_libs.cdaadr)
64✔
556
        defineBuiltin(context, 'cdadar(xs)', scheme_libs.cdadar)
64✔
557
        defineBuiltin(context, 'cdaddr(xs)', scheme_libs.cdaddr)
64✔
558
        defineBuiltin(context, 'cddaar(xs)', scheme_libs.cddaar)
64✔
559
        defineBuiltin(context, 'cddadr(xs)', scheme_libs.cddadr)
64✔
560
        defineBuiltin(context, 'cdddar(xs)', scheme_libs.cdddar)
64✔
561
        defineBuiltin(context, 'cddddr(xs)', scheme_libs.cddddr)
64✔
562

563
        // Scheme symbols
564

565
        defineBuiltin(context, 'symbol$63$(val)', scheme_libs.symbol$63$)
64✔
566
        defineBuiltin(context, 'symbol$61$$63$(sym1, sym2)', scheme_libs.symbol$61$$63$)
64✔
567
        //defineBuiltin(context, 'symbol$45$$62$string(str)', scheme_libs.symbol$45$$62$string)
568
        defineBuiltin(context, 'string$45$$62$symbol(sym)', scheme_libs.string$45$$62$symbol)
64✔
569

570
        // Scheme strings
571
        defineBuiltin(context, 'string$45$$62$list(str)', scheme_libs.string$45$$62$list)
64✔
572
        defineBuiltin(context, 'list$45$$62$string(xs)', scheme_libs.list$45$$62$string)
64✔
573

574
        // Scheme apply is needed here to help in the definition of the Scheme Prelude.
575
        defineBuiltin(context, 'apply(f, ...args)', cset_apply, 2)
64✔
576

577
      case Chapter.SCHEME_1:
578
        // Display
579
        defineBuiltin(
75✔
580
          context,
581
          'display(val, prepend = undefined)',
582
          (val: any, ...str: string[]) => display(schemeVisualise(val), ...str),
×
583
          1
584
        )
585
        defineBuiltin(context, 'newline()', () => display(''))
75✔
586

587
        // I/O
588
        defineBuiltin(context, 'read(str)', () => prompt(''))
75✔
589

590
        // Error
591
        defineBuiltin(context, 'error(str, prepend = undefined)', misc.error_message, 1)
75✔
592

593
        // Scheme truthy and falsy value evaluator
594
        defineBuiltin(context, 'truthy(val)', scheme_libs.truthy)
75✔
595

596
        // Scheme conversion from vector to list, defined here as
597
        // it is used to support variadic functions
598
        defineBuiltin(context, 'vector$45$$62$list(v)', scheme_libs.vector$45$$62$list)
75✔
599

600
        // Scheme function to build numbers
601
        defineBuiltin(context, 'make_number(n)', scheme_libs.make_number)
75✔
602

603
        // Scheme equality predicates
604

605
        defineBuiltin(context, 'eq$63$(...vals)', scheme_libs.eq$63$)
75✔
606
        defineBuiltin(context, 'eqv$63$(...vals)', scheme_libs.eqv$63$)
75✔
607
        defineBuiltin(context, 'equal$63$(...vals)', scheme_libs.equal$63$)
75✔
608

609
        // Scheme basic arithmetic
610
        defineBuiltin(context, '$43$(...vals)', scheme_libs.$43$, 0)
75✔
611
        defineBuiltin(context, '$42$(...vals)', scheme_libs.$42$, 0)
75✔
612
        defineBuiltin(context, '$45$(...vals)', scheme_libs.$45$, 1)
75✔
613
        defineBuiltin(context, '$47$(...vals)', scheme_libs.$47$, 1)
75✔
614

615
        // Scheme comparison
616
        defineBuiltin(context, '$61$(...vals)', scheme_libs.$61$, 2)
75✔
617
        defineBuiltin(context, '$60$(...vals)', scheme_libs.$60$, 2)
75✔
618
        defineBuiltin(context, '$62$(...vals)', scheme_libs.$62$, 2)
75✔
619
        defineBuiltin(context, '$60$$61$(...vals)', scheme_libs.$60$$61$, 2)
75✔
620
        defineBuiltin(context, '$62$$61$(...vals)', scheme_libs.$62$$61$, 2)
75✔
621

622
        // Scheme math functions
623
        defineBuiltin(context, 'number$63$(val)', scheme_libs.number$63$)
75✔
624
        defineBuiltin(context, 'complex$63$(val)', scheme_libs.complex$63$)
75✔
625
        defineBuiltin(context, 'real$63$(val)', scheme_libs.real$63$)
75✔
626
        defineBuiltin(context, 'rational$63$(val)', scheme_libs.rational$63$)
75✔
627
        defineBuiltin(context, 'integer$63$(val)', scheme_libs.integer$63$)
75✔
628
        defineBuiltin(context, 'exact$63$(val)', scheme_libs.exact$63$)
75✔
629
        defineBuiltin(context, 'inexact$63$(val)', scheme_libs.inexact$63$)
75✔
630
        //defineBuiltin(context, 'exact$45$integer$63$(val)', scheme_libs.exact_integerQ)
631
        defineBuiltin(context, 'zero$63$(val)', scheme_libs.zero$63$)
75✔
632
        defineBuiltin(context, 'infinity$63$(val)', scheme_libs.infinity$63$)
75✔
633
        defineBuiltin(context, 'nan$63$(val)', scheme_libs.nan$63$)
75✔
634
        defineBuiltin(context, 'negative$63$(val)', scheme_libs.negative$63$)
75✔
635
        defineBuiltin(context, 'odd$63$(val)', scheme_libs.odd$63$)
75✔
636
        defineBuiltin(context, 'even$63$(val)', scheme_libs.even$63$)
75✔
637
        defineBuiltin(context, 'max(...vals)', scheme_libs.max, 0)
75✔
638
        defineBuiltin(context, 'min(...vals)', scheme_libs.min, 0)
75✔
639
        defineBuiltin(context, 'abs(val)', scheme_libs.abs)
75✔
640

641
        defineBuiltin(context, 'numerator(val)', scheme_libs.numerator)
75✔
642
        defineBuiltin(context, 'denominator(val)', scheme_libs.denominator)
75✔
643

644
        defineBuiltin(context, 'quotient(n, d)', scheme_libs.quotient)
75✔
645
        defineBuiltin(context, 'modulo(n, d)', scheme_libs.modulo)
75✔
646
        defineBuiltin(context, 'remainder(n, d)', scheme_libs.remainder)
75✔
647
        defineBuiltin(context, 'gcd(...vals)', scheme_libs.gcd, 0)
75✔
648
        defineBuiltin(context, 'lcm(...vals)', scheme_libs.lcm, 0)
75✔
649
        defineBuiltin(context, 'square(val)', scheme_libs.square)
75✔
650
        defineBuiltin(context, 'floor(val)', scheme_libs.floor)
75✔
651
        defineBuiltin(context, 'ceiling(val)', scheme_libs.ceiling)
75✔
652
        defineBuiltin(context, 'truncate(val)', scheme_libs.truncate)
75✔
653
        defineBuiltin(context, 'round(val)', scheme_libs.round)
75✔
654
        defineBuiltin(context, 'sqrt(val)', scheme_libs.sqrt)
75✔
655
        defineBuiltin(context, 'expt(base, exp)', scheme_libs.expt)
75✔
656
        defineBuiltin(context, 'exp(val)', scheme_libs.exp)
75✔
657
        defineBuiltin(context, 'log(val)', scheme_libs.log)
75✔
658
        defineBuiltin(context, 'sqrt(val)', scheme_libs.sqrt)
75✔
659
        defineBuiltin(context, 'sin(val)', scheme_libs.sin)
75✔
660
        defineBuiltin(context, 'cos(val)', scheme_libs.cos)
75✔
661
        defineBuiltin(context, 'tan(val)', scheme_libs.tan)
75✔
662
        defineBuiltin(context, 'asin(val)', scheme_libs.asin)
75✔
663
        defineBuiltin(context, 'acos(val)', scheme_libs.acos)
75✔
664
        defineBuiltin(context, 'atan(n, m)', scheme_libs.atan, 1)
75✔
665

666
        defineBuiltin(context, 'make$45$rectangular(real, imag)', scheme_libs.make$45$rectangular)
75✔
667
        defineBuiltin(context, 'make$45$polar(mag, ang)', scheme_libs.make$45$polar)
75✔
668
        defineBuiltin(context, 'real$45$part(val)', scheme_libs.real$45$part)
75✔
669
        defineBuiltin(context, 'imag$45$part(val)', scheme_libs.imag$45$part)
75✔
670
        defineBuiltin(context, 'magnitude(val)', scheme_libs.magnitude)
75✔
671
        defineBuiltin(context, 'angle(val)', scheme_libs.angle)
75✔
672

673
        defineBuiltin(context, 'math$45$pi', scheme_libs.PI)
75✔
674
        defineBuiltin(context, 'math$45$e', scheme_libs.E)
75✔
675

676
        defineBuiltin(context, 'number$45$$62$string(val)', scheme_libs.number$45$$62$string)
75✔
677

678
        // special values for scm-slang
679

680
        // Scheme booleans
681
        defineBuiltin(context, 'boolean$63$(val)', scheme_libs.boolean$63$)
75✔
682
        defineBuiltin(context, 'boolean$61$$63$(x, y)', scheme_libs.boolean$61$$63$)
75✔
683
        defineBuiltin(context, 'and(...vals)', scheme_libs.and, 0)
75✔
684
        defineBuiltin(context, 'or(...vals)', scheme_libs.or, 0)
75✔
685
        defineBuiltin(context, 'not(val)', scheme_libs.not)
75✔
686

687
        // Scheme strings
688

689
        defineBuiltin(context, 'string$63$(val)', scheme_libs.string$63$)
75✔
690
        defineBuiltin(context, 'make$45$string(n, char)', scheme_libs.make$45$string, 1)
75✔
691
        defineBuiltin(context, 'string(...vals)', scheme_libs.string, 0)
75✔
692
        defineBuiltin(context, 'string$45$length(str)', scheme_libs.string$45$length)
75✔
693
        defineBuiltin(context, 'string$45$ref(str, k)', scheme_libs.string$45$ref)
75✔
694
        defineBuiltin(context, 'string$61$$63$(str1, str2)', scheme_libs.string$61$$63$)
75✔
695
        defineBuiltin(context, 'string$60$$63$(str1, str2)', scheme_libs.string$60$$63$)
75✔
696
        defineBuiltin(context, 'string$62$$63$(str1, str2)', scheme_libs.string$62$$63$)
75✔
697
        defineBuiltin(context, 'string$60$$61$$63$(str1, str2)', scheme_libs.string$60$$61$$63$)
75✔
698
        defineBuiltin(context, 'string$62$$61$$63$(str1, str2)', scheme_libs.string$62$$61$$63$)
75✔
699
        defineBuiltin(context, 'substring(str, start, end)', scheme_libs.substring, 2)
75✔
700
        defineBuiltin(context, 'string$45$append(...vals)', scheme_libs.string$45$append, 0)
75✔
701
        defineBuiltin(context, 'string$45$copy(str)', scheme_libs.string$45$copy)
75✔
702
        defineBuiltin(context, 'string$45$map(f, str)', scheme_libs.string$45$map)
75✔
703
        defineBuiltin(context, 'string$45$for$45$each(f, str)', scheme_libs.string$45$for$45$each)
75✔
704
        defineBuiltin(context, 'string$45$$62$number(str)', scheme_libs.string$45$$62$number)
75✔
705

706
        // Scheme procedures
707
        defineBuiltin(context, 'procedure$63$(val)', scheme_libs.procedure$63$)
75✔
708
        defineBuiltin(context, 'compose(...fns)', scheme_libs.compose, 0)
75✔
709

710
        // Special values
711
        defineBuiltin(context, 'undefined', undefined)
75✔
712
        break
75✔
713
      default:
714
      //should be unreachable
715
    }
716
  }
717

718
  if (context.chapter <= Chapter.PYTHON_1 && context.chapter >= Chapter.PYTHON_1) {
3,130✔
719
    if (context.chapter == Chapter.PYTHON_1) {
45✔
720
      // Display
721
      defineBuiltin(context, 'get_time()', misc.get_time)
45✔
722
      defineBuiltin(context, 'print(val)', display, 1)
45✔
723
      defineBuiltin(context, 'raw_print(str)', rawDisplay, 1)
45✔
724
      defineBuiltin(context, 'str(val)', (val: any) => stringify(val, 2, 80), 1)
45✔
725
      defineBuiltin(context, 'error(str)', misc.error_message, 1)
45✔
726
      defineBuiltin(context, 'prompt(str)', prompt)
45✔
727
      defineBuiltin(context, 'is_float(val)', pylib.is_float)
45✔
728
      defineBuiltin(context, 'is_int(val)', pylib.is_int)
45✔
729
      defineBuiltin(context, 'is_string(val)', misc.is_string)
45✔
730
      defineBuiltin(context, 'is_function(val)', misc.is_function)
45✔
731
      defineBuiltin(context, 'is_boolean(val)', misc.is_boolean)
45✔
732
      defineBuiltin(context, 'is_None(val)', list.is_null)
45✔
733
      defineBuiltin(context, 'parse_int(str, radix)', misc.parse_int)
45✔
734
      defineBuiltin(context, 'char_at(str, index)', misc.char_at)
45✔
735
      defineBuiltin(context, 'arity(f)', misc.arity)
45✔
736
      defineBuiltin(context, 'None', null)
45✔
737

738
      // Binary operators
739
      defineBuiltin(context, '__py_adder(x, y)', pylib.__py_adder)
45✔
740
      defineBuiltin(context, '__py_minuser(x, y)', pylib.__py_minuser)
45✔
741
      defineBuiltin(context, '__py_multiplier(x, y)', pylib.__py_multiplier)
45✔
742
      defineBuiltin(context, '__py_divider(x, y)', pylib.__py_divider)
45✔
743
      defineBuiltin(context, '__py_modder(x, y)', pylib.__py_modder)
45✔
744
      defineBuiltin(context, '__py_powerer(x, y)', pylib.__py_powerer)
45✔
745
      defineBuiltin(context, '__py_floorer(x, y)', pylib.__py_floorer)
45✔
746

747
      // Unary operator +
748
      defineBuiltin(context, '__py_unary_plus(x)', pylib.__py_unary_plus)
45✔
749

750
      // Math Library
751
      defineBuiltin(context, 'math_abs(x)', pylib.math_abs)
45✔
752
      defineBuiltin(context, 'math_acos(x)', pylib.math_acos)
45✔
753
      defineBuiltin(context, 'math_acosh(x)', pylib.math_acosh)
45✔
754
      defineBuiltin(context, 'math_asin(x)', pylib.math_asin)
45✔
755
      defineBuiltin(context, 'math_asinh(x)', pylib.math_asinh)
45✔
756
      defineBuiltin(context, 'math_atan(x)', pylib.math_atan)
45✔
757
      defineBuiltin(context, 'math_atan2(x)', pylib.math_atan2)
45✔
758
      defineBuiltin(context, 'math_atanh(x)', pylib.math_atanh)
45✔
759
      defineBuiltin(context, 'math_cbrt(x)', pylib.math_cbrt)
45✔
760
      defineBuiltin(context, 'math_ceil(x)', pylib.math_ceil)
45✔
761
      defineBuiltin(context, 'math_clz32(x)', pylib.math_clz32)
45✔
762
      defineBuiltin(context, 'math_cos(x)', pylib.math_cos)
45✔
763
      defineBuiltin(context, 'math_cosh(x)', pylib.math_cosh)
45✔
764
      defineBuiltin(context, 'math_exp(x)', pylib.math_exp)
45✔
765
      defineBuiltin(context, 'math_expm1(x)', pylib.math_expm1)
45✔
766
      defineBuiltin(context, 'math_floor(x)', pylib.math_floor)
45✔
767
      defineBuiltin(context, 'math_fround(x)', pylib.math_fround)
45✔
768
      defineBuiltin(context, 'math_hypot(...values)', pylib.math_hypot)
45✔
769
      defineBuiltin(context, 'math_imul(x, y)', pylib.math_imul)
45✔
770
      defineBuiltin(context, 'math_log(x)', pylib.math_log)
45✔
771
      defineBuiltin(context, 'math_log1p(x)', pylib.math_log1p)
45✔
772
      defineBuiltin(context, 'math_log2(x)', pylib.math_log2)
45✔
773
      defineBuiltin(context, 'math_log10(x)', pylib.math_log10)
45✔
774
      defineBuiltin(context, 'math_max(...values)', pylib.math_max)
45✔
775
      defineBuiltin(context, 'math_min(...values)', pylib.math_min)
45✔
776
      defineBuiltin(context, 'math_pow(base, exponent)', pylib.math_pow)
45✔
777
      defineBuiltin(context, 'math_random()', pylib.math_random)
45✔
778
      defineBuiltin(context, 'math_round(x)', pylib.math_round)
45✔
779
      defineBuiltin(context, 'math_sign(x)', pylib.math_sign)
45✔
780
      defineBuiltin(context, 'math_sin(x)', pylib.math_sin)
45✔
781
      defineBuiltin(context, 'math_sinh(x)', pylib.math_sinh)
45✔
782
      defineBuiltin(context, 'math_sqrt(x)', pylib.math_sqrt)
45✔
783
      defineBuiltin(context, 'math_tan(x)', pylib.math_tan)
45✔
784
      defineBuiltin(context, 'math_tanh(x)', pylib.math_tanh)
45✔
785
      defineBuiltin(context, 'math_trunc(x)', pylib.math_trunc)
45✔
786

787
      // Math constants
788
      defineBuiltin(context, 'math_e', Math.E)
45✔
789
      defineBuiltin(context, 'math_inf', Infinity)
45✔
790
      defineBuiltin(context, 'math_nan', NaN)
45✔
791
      defineBuiltin(context, 'math_pi', Math.PI)
45✔
792
      defineBuiltin(context, 'math_tau', Math.PI * 2)
45✔
793
    }
794
  }
795
}
796

797
function importPrelude(context: Context) {
798
  let prelude = ''
3,130✔
799
  if (context.chapter >= 2) {
3,130✔
800
    prelude += listPrelude
1,635✔
801
    prelude += localImportPrelude
1,635✔
802
  }
803
  if (context.chapter >= 3) {
3,130✔
804
    prelude += streamPrelude
1,359✔
805
  }
806

807
  if (context.chapter <= +Chapter.SCHEME_1 && context.chapter >= +Chapter.FULL_SCHEME) {
3,130✔
808
    // Scheme preludes
809
    // scheme 1 is the "highest" scheme chapter, so we can just check if it's less than or equal to scheme 1
810
    if (context.chapter <= +Chapter.SCHEME_1) {
75✔
811
      prelude += scheme1Prelude
75✔
812
    }
813
    if (context.chapter <= +Chapter.SCHEME_2) {
75✔
814
      prelude += scheme2Prelude
64✔
815
    }
816
    if (context.chapter <= +Chapter.SCHEME_3) {
75✔
817
      prelude += scheme3Prelude
63✔
818
    }
819
    if (context.chapter <= +Chapter.SCHEME_4) {
75✔
820
      prelude += scheme4Prelude
62✔
821
    }
822
    if (context.chapter <= +Chapter.FULL_SCHEME) {
75✔
823
      prelude += schemeFullPrelude
56✔
824
    }
825
  }
826
  if (prelude !== '') {
3,130✔
827
    context.prelude = prelude
1,710✔
828
  }
829
}
830

831
const defaultBuiltIns: CustomBuiltIns = {
72✔
832
  rawDisplay: misc.rawDisplay,
833
  // See issue #5
834
  prompt: misc.rawDisplay,
835
  // See issue #11
836
  alert: misc.rawDisplay,
837
  visualiseList: (_v: Value) => {
838
    throw new Error('List visualizer is not enabled')
×
839
  }
840
}
841

842
const createContext = <T>(
72✔
843
  chapter: Chapter = Chapter.SOURCE_1,
1,186✔
844
  variant: Variant = Variant.DEFAULT,
1,802✔
845
  languageOptions: LanguageOptions = {},
2,132✔
846
  externalSymbols: string[] = [],
2,313✔
847
  externalContext?: T,
848
  externalBuiltIns: CustomBuiltIns = defaultBuiltIns
2,313✔
849
): Context => {
850
  if (chapter === Chapter.FULL_JS || chapter === Chapter.FULL_TS) {
3,281✔
851
    // fullJS will include all builtins and preludes of source 4
852
    return {
151✔
853
      ...createContext(
854
        Chapter.SOURCE_4,
855
        variant,
856
        languageOptions,
857
        externalSymbols,
858
        externalContext,
859
        externalBuiltIns
860
      ),
861
      chapter
862
    } as Context
863
  }
864
  const context = createEmptyContext(
3,130✔
865
    chapter,
866
    variant,
867
    languageOptions,
868
    externalSymbols,
869
    externalContext
870
  )
871

872
  importBuiltins(context, externalBuiltIns)
3,130✔
873
  importPrelude(context)
3,130✔
874
  importExternalSymbols(context, externalSymbols)
3,130✔
875

876
  return context
3,130✔
877
}
878

879
export default createContext
72✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc