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

source-academy / js-slang / 19107814654

05 Nov 2025 03:50PM UTC coverage: 76.655%. Remained the same
19107814654

Pull #1833

github

web-flow
Merge 8fcc9f8c7 into f40371c98
Pull Request #1833: November 2025 maintenance

3501 of 4761 branches covered (73.53%)

Branch coverage included in aggregate %.

7085 of 9049 relevant lines covered (78.3%)

191615.52 hits per line

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

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

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

32
export class EnvTree {
33
  private _root: EnvTreeNode | null = null
4,110✔
34
  private map = new Map<Environment, EnvTreeNode>()
4,110✔
35

36
  get root(): EnvTreeNode | null {
37
    return this._root
3✔
38
  }
39

40
  public insert(environment: Environment): void {
41
    const tailEnvironment = environment.tail
458,287✔
42
    if (tailEnvironment === null) {
458,287✔
43
      if (this._root === null) {
3,091!
44
        this._root = new EnvTreeNode(environment, null)
3,091✔
45
        this.map.set(environment, this._root)
3,091✔
46
      }
47
    } else {
48
      const parentNode = this.map.get(tailEnvironment)
455,196✔
49
      if (parentNode) {
455,196!
50
        const childNode = new EnvTreeNode(environment, parentNode)
455,196✔
51
        parentNode.addChild(childNode)
455,196✔
52
        this.map.set(environment, childNode)
455,196✔
53
      }
54
    }
55
  }
56

57
  public getTreeNode(environment: Environment): EnvTreeNode | undefined {
58
    return this.map.get(environment)
5✔
59
  }
60
}
61

62
export class EnvTreeNode {
63
  private _children: EnvTreeNode[] = []
458,288✔
64

65
  constructor(
66
    readonly environment: Environment,
458,288✔
67
    public parent: EnvTreeNode | null
458,288✔
68
  ) {}
69

70
  get children(): EnvTreeNode[] {
71
    return this._children
3✔
72
  }
73

74
  public resetChildren(newChildren: EnvTreeNode[]): void {
75
    this.clearChildren()
1✔
76
    this.addChildren(newChildren)
1✔
77
    newChildren.forEach(c => (c.parent = this))
3✔
78
  }
79

80
  private clearChildren(): void {
81
    this._children = []
1✔
82
  }
83

84
  private addChildren(newChildren: EnvTreeNode[]): void {
85
    this._children.push(...newChildren)
1✔
86
  }
87

88
  public addChild(newChild: EnvTreeNode): EnvTreeNode {
89
    this._children.push(newChild)
455,197✔
90
    return newChild
455,197✔
91
  }
92
}
93

94
const createEmptyRuntime = () => ({
3,093✔
95
  break: false,
96
  debuggerOn: true,
97
  isRunning: false,
98
  environmentTree: new EnvTree(),
99
  environments: [],
100
  value: undefined,
101
  nodes: [],
102
  control: null,
103
  stash: null,
104
  transformers: new Transformers(),
105
  objectCount: 0,
106
  envSteps: -1,
107
  envStepsTotal: 0,
108
  breakpointSteps: [],
109
  changepointSteps: []
110
})
111

112
const createEmptyDebugger = () => ({
3,093✔
113
  observers: { callbacks: Array<() => void>() },
114
  status: false,
115
  state: {
116
    it: (function* (): any {
117
      return
3,093✔
118
    })()
119
  }
120
})
121

122
export const createGlobalEnvironment = (): Environment => ({
3,091✔
123
  tail: null,
124
  name: 'global',
125
  head: {},
126
  heap: new Heap(),
127
  id: '-1'
128
})
129

130
const createNativeStorage = (): NativeStorage => ({
3,093✔
131
  builtins: new Map(),
132
  previousProgramsIdentifiers: new Set(),
133
  operators: new Map(Object.entries(operators)),
134
  maxExecTime: JSSLANG_PROPERTIES.maxExecTime,
135
  evaller: null,
136
  loadedModules: {},
137
  loadedModuleTypes: {}
138
})
139

140
export const createEmptyContext = <T>(
70✔
141
  chapter: Chapter,
142
  variant: Variant = Variant.DEFAULT,
3,093✔
143
  languageOptions: LanguageOptions = {},
3,093✔
144
  externalSymbols: string[],
145
  externalContext?: T
146
): Context<T> => {
147
  return {
3,093✔
148
    chapter,
149
    externalSymbols,
150
    errors: [],
151
    externalContext,
152
    runtime: createEmptyRuntime(),
153
    numberOfOuterEnvironments: 1,
154
    prelude: null,
155
    debugger: createEmptyDebugger(),
156
    nativeStorage: createNativeStorage(),
157
    executionMethod: 'auto',
158
    variant,
159
    languageOptions,
160
    moduleContexts: {},
161
    unTypecheckedCode: [],
162
    typeEnvironment: createTypeEnvironment(chapter),
163
    previousPrograms: [],
164
    shouldIncreaseEvaluationTimeout: false
165
  }
166
}
167

168
export const ensureGlobalEnvironmentExist = (context: Context) => {
70✔
169
  if (!context.runtime) {
6,178!
170
    context.runtime = createEmptyRuntime()
×
171
  }
172
  if (!context.runtime.environments) {
6,178!
173
    context.runtime.environments = []
×
174
  }
175
  if (!context.runtime.environmentTree) {
6,178!
176
    context.runtime.environmentTree = new EnvTree()
×
177
  }
178
  if (context.runtime.environments.length === 0) {
6,178✔
179
    const globalEnvironment = createGlobalEnvironment()
3,089✔
180
    context.runtime.environments.push(globalEnvironment)
3,089✔
181
    context.runtime.environmentTree.insert(globalEnvironment)
3,089✔
182
  }
183
}
184

185
export const defineSymbol = (context: Context, name: string, value: Value) => {
70✔
186
  const globalEnvironment = context.runtime.environments[0]
219,671✔
187
  Object.defineProperty(globalEnvironment.head, name, {
219,671✔
188
    value,
189
    writable: false,
190
    enumerable: true
191
  })
192
  context.nativeStorage.builtins.set(name, value)
219,671✔
193
  const typeEnv = context.typeEnvironment[0]
219,671✔
194
  // if the global type env doesn't already have the imported symbol,
195
  // we set it to a type var T that can typecheck with anything.
196
  if (!typeEnv.declKindMap.has(name)) {
219,671✔
197
    typeEnv.typeMap.set(name, tForAll(tVar('T1')))
33,283✔
198
    typeEnv.declKindMap.set(name, 'const')
33,283✔
199
  }
200
}
201

202
export function defineBuiltin(
203
  context: Context,
204
  name: string, // enforce minArgsNeeded
205
  value: Value,
206
  minArgsNeeded: number
207
): void
208
export function defineBuiltin(
209
  context: Context,
210
  name: string,
211
  value: Value,
212
  minArgsNeeded?: number
213
): void
214
// Defines a builtin in the given context
215
// If the builtin is a function, wrap it such that its toString hides the implementation
216
export function defineBuiltin(
217
  context: Context,
218
  name: string,
219
  value: Value,
220
  minArgsNeeded: undefined | number = undefined
219,671✔
221
) {
222
  function extractName(name: string): string {
223
    return name.split('(')[0].trim()
186,792✔
224
  }
225

226
  function extractParameters(name: string): string[] {
227
    // if the function has no () in its name, it has no parameters
228
    if (!name.includes('(')) {
186,792✔
229
      return []
17✔
230
    }
231
    return name
186,775✔
232
      .split('(')[1]
233
      .split(')')[0]
234
      .split(',')
235
      .map(s => s.trim())
230,463✔
236
  }
237

238
  if (typeof value === 'function') {
219,671✔
239
    const funName = extractName(name)
186,792✔
240
    const funParameters = extractParameters(name)
186,792✔
241
    const repr = `function ${name} {\n\t[implementation hidden]\n}`
186,792✔
242
    value.toString = () => repr
186,792✔
243
    value.minArgsNeeded = minArgsNeeded
186,792✔
244
    value.funName = funName
186,792✔
245
    value.funParameters = funParameters
186,792✔
246

247
    defineSymbol(context, funName, value)
186,792✔
248
  } else {
249
    defineSymbol(context, name, value)
32,879✔
250
  }
251
}
252

253
export const importExternalSymbols = (context: Context, externalSymbols: string[]) => {
70✔
254
  ensureGlobalEnvironmentExist(context)
3,089✔
255

256
  externalSymbols.forEach(symbol => {
3,089✔
257
    defineSymbol(context, symbol, GLOBAL[symbol as keyof typeof GLOBAL])
×
258
  })
259
}
260

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

296
  if (context.chapter >= 1) {
3,089✔
297
    defineBuiltin(context, 'get_time()', misc.get_time)
2,944✔
298
    defineBuiltin(context, 'display(val, prepend = undefined)', display, 1)
2,944✔
299
    defineBuiltin(context, 'raw_display(str, prepend = undefined)', rawDisplay, 1)
2,944✔
300
    defineBuiltin(context, 'stringify(val, indent = 2, maxLineLength = 80)', stringify, 1)
2,944✔
301
    defineBuiltin(context, 'error(str, prepend = undefined)', misc.error_message, 1)
2,944✔
302
    defineBuiltin(context, 'prompt(str)', prompt)
2,944✔
303
    defineBuiltin(context, 'is_number(val)', misc.is_number)
2,944✔
304
    defineBuiltin(context, 'is_string(val)', misc.is_string)
2,944✔
305
    defineBuiltin(context, 'is_function(val)', misc.is_function)
2,944✔
306
    defineBuiltin(context, 'is_boolean(val)', misc.is_boolean)
2,944✔
307
    defineBuiltin(context, 'is_undefined(val)', misc.is_undefined)
2,944✔
308
    defineBuiltin(context, 'parse_int(str, radix)', misc.parse_int)
2,944✔
309
    defineBuiltin(context, 'char_at(str, index)', misc.char_at)
2,944✔
310
    defineBuiltin(context, 'arity(f)', misc.arity)
2,944✔
311
    defineBuiltin(context, 'undefined', undefined)
2,944✔
312
    defineBuiltin(context, 'NaN', NaN)
2,944✔
313
    defineBuiltin(context, 'Infinity', Infinity)
2,944✔
314
    // Define all Math libraries
315
    const mathLibraryNames = Object.getOwnPropertyNames(Math)
2,944✔
316
    // Short param names for stringified version of math functions
317
    const parameterNames = [...'abcdefghijklmnopqrstuvwxyz']
2,944✔
318
    for (const name of mathLibraryNames) {
2,944✔
319
      const value = Math[name as keyof typeof Math]
126,592✔
320
      if (typeof value === 'function') {
126,592✔
321
        let paramString: string
322
        let minArgsNeeded = undefined
103,040✔
323
        if (name === 'max' || name === 'min') {
103,040✔
324
          paramString = '...values'
5,888✔
325
          minArgsNeeded = 0
5,888✔
326
        } else {
327
          paramString = parameterNames.slice(0, value.length).join(', ')
97,152✔
328
        }
329
        defineBuiltin(context, `math_${name}(${paramString})`, value, minArgsNeeded)
103,040✔
330
      } else {
331
        defineBuiltin(context, `math_${name}`, value)
23,552✔
332
      }
333
    }
334
  }
335

336
  if (context.chapter >= 2) {
3,089✔
337
    // List library
338
    defineBuiltin(context, 'pair(left, right)', list.pair)
1,590✔
339
    defineBuiltin(context, 'is_pair(val)', list.is_pair)
1,590✔
340
    defineBuiltin(context, 'head(xs)', list.head)
1,590✔
341
    defineBuiltin(context, 'tail(xs)', list.tail)
1,590✔
342
    defineBuiltin(context, 'is_null(val)', list.is_null)
1,590✔
343
    defineBuiltin(context, 'list(...values)', list.list, 0)
1,590✔
344
    defineBuiltin(context, 'draw_data(...xs)', visualiseList, 1)
1,590✔
345
    defineBuiltin(context, 'display_list(val, prepend = undefined)', displayList, 0)
1,590✔
346
    defineBuiltin(context, 'is_list(val)', list.is_list)
1,590✔
347
  }
348

349
  if (context.chapter >= 3) {
3,089✔
350
    defineBuiltin(context, 'set_head(xs, val)', list.set_head)
1,315✔
351
    defineBuiltin(context, 'set_tail(xs, val)', list.set_tail)
1,315✔
352
    defineBuiltin(context, 'array_length(arr)', misc.array_length)
1,315✔
353
    defineBuiltin(context, 'is_array(val)', misc.is_array)
1,315✔
354

355
    // Stream library
356
    defineBuiltin(context, 'stream(...values)', stream.stream, 0)
1,315✔
357
  }
358

359
  if (context.chapter >= 4) {
3,089✔
360
    defineBuiltin(context, 'parse(program_string)', (str: string) =>
1,143✔
361
      parser.parse(str, createContext(context.chapter))
71✔
362
    )
363
    defineBuiltin(context, 'tokenize(program_string)', (str: string) =>
1,143✔
364
      parser.tokenize(str, createContext(context.chapter))
3✔
365
    )
366
    defineBuiltin(
1,143✔
367
      context,
368
      'apply_in_underlying_javascript(fun, args)',
369
      (fun: Function, args: Value) => fun.apply(fun, list_to_vector(args))
5✔
370
    )
371

372
    // Continuations for explicit-control variant
373
    if (context.chapter >= 4) {
1,143!
374
      defineBuiltin(
1,143✔
375
        context,
376
        'call_cc(f)',
377
        context.variant === Variant.EXPLICIT_CONTROL
24!
378
          ? call_with_current_continuation
379
          : (f: any) => {
380
              throw new Error('call_cc is only available in Explicit-Control variant')
×
381
            }
382
      )
383
    }
384
  }
385

386
  if (context.chapter === Chapter.LIBRARY_PARSER) {
3,089✔
387
    defineBuiltin(context, 'is_object(val)', misc.is_object)
308✔
388
    defineBuiltin(context, 'is_NaN(val)', misc.is_NaN)
308✔
389
    defineBuiltin(context, 'has_own_property(obj, prop)', misc.has_own_property)
308✔
390
    defineBuiltin(context, 'alert(val)', alert)
308✔
391
    defineBuiltin(context, 'timed(fun)', (f: Function) =>
308✔
392
      misc.timed(context, f, context.externalContext, externalBuiltIns.rawDisplay)
×
393
    )
394
  }
395

396
  if (context.chapter <= +Chapter.SCHEME_1 && context.chapter >= +Chapter.FULL_SCHEME) {
3,089✔
397
    switch (context.chapter) {
75!
398
      case Chapter.FULL_SCHEME:
399
        // Introduction to eval
400
        // eval metaprocedure
401
        defineBuiltin(context, '$scheme_ZXZhbA$61$$61$(xs)', cset_eval)
56✔
402

403
      case Chapter.SCHEME_4:
404
        // Introduction to call/cc
405
        defineBuiltin(context, 'call$47$cc(f)', call_with_current_continuation)
62✔
406

407
      case Chapter.SCHEME_3:
408
        // Introduction to mutable values, streams
409

410
        // Scheme pair mutation
411
        defineBuiltin(context, 'set$45$car$33$(pair, val)', scheme_libs.set$45$car$33$)
63✔
412
        defineBuiltin(context, 'set$45$cdr$33$(pair, val)', scheme_libs.set$45$cdr$33$)
63✔
413

414
        // Scheme list mutation
415
        defineBuiltin(context, 'list$45$set$33$(xs, n, val)', scheme_libs.list$45$set$33$)
63✔
416
        //defineBuiltin(context, 'filter$33$(pred, xs)', scheme_libs.filterB);
417

418
        // Scheme promises
419
        defineBuiltin(context, 'make$45$promise(thunk)', scheme_libs.make$45$promise)
63✔
420
        defineBuiltin(context, 'promise$63$(p)', scheme_libs.promise$63$)
63✔
421
        defineBuiltin(context, 'force(p)', scheme_libs.force)
63✔
422

423
        // Scheme vectors
424
        defineBuiltin(context, 'vector(...vals)', scheme_libs.vector, 0)
63✔
425
        defineBuiltin(context, 'make$45$vector(n, val)', scheme_libs.make$45$vector, 1)
63✔
426

427
        defineBuiltin(context, 'vector$63$(v)', scheme_libs.vector$63$)
63✔
428

429
        defineBuiltin(context, 'vector$45$length(v)', scheme_libs.vector$45$length)
63✔
430
        defineBuiltin(context, 'vector$45$empty$63$(v)', scheme_libs.vector$45$empty$63$)
63✔
431

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

434
        defineBuiltin(context, 'vector$45$set$33$(v, k, val)', scheme_libs.vector$45$set$33$)
63✔
435
        defineBuiltin(
63✔
436
          context,
437
          'vector$45$fill$33$(v, val, start, end)',
438
          scheme_libs.vector$45$fill$33$,
439
          2
440
        )
441
        defineBuiltin(context, 'list$45$$62$vector(xs)', scheme_libs.list$45$$62$vector)
63✔
442

443
      case Chapter.SCHEME_2:
444
        // Scheme pairs
445
        defineBuiltin(context, 'cons(left, right)', scheme_libs.cons)
64✔
446
        defineBuiltin(context, 'xcons(right, left)', scheme_libs.xcons)
64✔
447
        defineBuiltin(context, 'pair$63$(val)', scheme_libs.pair$63$)
64✔
448
        defineBuiltin(context, 'not$45$pair$63$(val)', scheme_libs.not$45$pair$63$)
64✔
449
        defineBuiltin(context, 'car(xs)', scheme_libs.car)
64✔
450
        defineBuiltin(context, 'cdr(xs)', scheme_libs.cdr)
64✔
451

452
        // Scheme lists
453
        defineBuiltin(context, 'list(...vals)', scheme_libs.list, 0)
64✔
454
        defineBuiltin(context, 'list$42$(...vals)', scheme_libs.list$42$, 1)
64✔
455
        defineBuiltin(context, 'cons$42$(...vals)', scheme_libs.cons$42$, 1)
64✔
456
        defineBuiltin(context, 'circular$45$list(...vals)', scheme_libs.circular$45$list, 0)
64✔
457
        defineBuiltin(context, 'make$45$list(n, val)', scheme_libs.make$45$list, 1)
64✔
458

459
        defineBuiltin(context, 'circular$45$list$63$(val)', scheme_libs.circular$45$list$63$)
64✔
460
        defineBuiltin(context, 'proper$45$list$63$(val)', scheme_libs.proper$45$list$63$)
64✔
461
        defineBuiltin(context, 'dotted$45$list$63$(val)', scheme_libs.dotted$45$list$63$)
64✔
462
        defineBuiltin(context, 'null$63$(val)', scheme_libs.null$63$)
64✔
463
        defineBuiltin(context, 'null$45$list$63$(val)', scheme_libs.null$45$list$63$)
64✔
464
        defineBuiltin(context, 'list$63$(val)', scheme_libs.list$63$)
64✔
465

466
        defineBuiltin(context, 'list$45$tabulate(n, f)', scheme_libs.list$45$tabulate)
64✔
467
        defineBuiltin(context, 'list$45$tail(xs, n)', scheme_libs.list$45$tail)
64✔
468
        defineBuiltin(context, 'list$45$ref(xs, k)', scheme_libs.list$45$ref)
64✔
469
        defineBuiltin(context, 'last(xs)', scheme_libs.last)
64✔
470
        defineBuiltin(context, 'last$45$pair(xs)', scheme_libs.last$45$pair)
64✔
471

472
        defineBuiltin(context, 'first(xs)', scheme_libs.first)
64✔
473
        defineBuiltin(context, 'second(xs)', scheme_libs.second)
64✔
474
        defineBuiltin(context, 'third(xs)', scheme_libs.third)
64✔
475
        defineBuiltin(context, 'fourth(xs)', scheme_libs.fourth)
64✔
476
        defineBuiltin(context, 'fifth(xs)', scheme_libs.fifth)
64✔
477
        defineBuiltin(context, 'sixth(xs)', scheme_libs.sixth)
64✔
478
        defineBuiltin(context, 'seventh(xs)', scheme_libs.seventh)
64✔
479
        defineBuiltin(context, 'eighth(xs)', scheme_libs.eighth)
64✔
480
        defineBuiltin(context, 'ninth(xs)', scheme_libs.ninth)
64✔
481
        defineBuiltin(context, 'tenth(xs)', scheme_libs.tenth)
64✔
482

483
        // some of these functions will be represented
484
        // using the preludes
485
        // defineBuiltin(context, 'filter(pred, xs)', scheme_libs.filter)
486
        defineBuiltin(context, 'r7rs$45$map(f, ...xss)', scheme_libs.map, 2)
64✔
487
        defineBuiltin(context, 'r7rs$45$fold(f, init, ...xss)', scheme_libs.fold, 3)
64✔
488
        defineBuiltin(
64✔
489
          context,
490
          'r7rs$45$fold$45$right(f, init, ...xss)',
491
          scheme_libs.fold$45$right,
492
          3
493
        )
494
        defineBuiltin(context, 'r7rs$45$fold$45$left(f, init, ...xss)', scheme_libs.fold$45$left, 3)
64✔
495
        //defineBuiltin(context, 'reduce(f, ridentity, xs)', scheme_libs.reduce)
496
        //defineBuiltin(context, 'reduce$45$right(f, ridentity, xs)', scheme_libs.reduce$45$right)
497
        //defineBuiltin(context, 'reduce$45$left(f, ridentity, xs)', scheme_libs.reduce$45$left)
498

499
        defineBuiltin(context, 'any(xs)', scheme_libs.any)
64✔
500
        defineBuiltin(context, 'list$45$copy(xs)', scheme_libs.list$45$copy)
64✔
501
        defineBuiltin(context, 'length(xs)', scheme_libs.length)
64✔
502
        defineBuiltin(context, 'length$43$(xs)', scheme_libs.length$43$)
64✔
503
        defineBuiltin(context, 'r7rs$45$append(...xss)', scheme_libs.append, 0)
64✔
504
        defineBuiltin(context, 'concatenate(xss)', scheme_libs.concatenate)
64✔
505
        defineBuiltin(context, 'reverse(xs)', scheme_libs.reverse)
64✔
506
        defineBuiltin(context, 'take(xs, n)', scheme_libs.take)
64✔
507
        defineBuiltin(context, 'take$45$right(xs, n)', scheme_libs.take$45$right)
64✔
508
        defineBuiltin(context, 'drop(xs, n)', scheme_libs.drop)
64✔
509
        defineBuiltin(context, 'drop$45$right(xs, n)', scheme_libs.drop$45$right)
64✔
510

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

513
        /*
514
        defineBuiltin(context, 'memq(item, xs)', scheme_libs.memq)
515
        defineBuiltin(context, 'memv(item, xs)', scheme_libs.memv)
516
        defineBuiltin(context, 'member(item, xs)', scheme_libs.member)
517
        defineBuiltin(context, 'assq(item, xs)', scheme_libs.assq)
518
        defineBuiltin(context, 'assv(item, xs)', scheme_libs.assv)
519
        defineBuiltin(context, 'assoc(item, xs)', scheme_libs.assoc)
520
        */
521

522
        // Scheme cxrs
523

524
        defineBuiltin(context, 'caar(xs)', scheme_libs.caar)
64✔
525
        defineBuiltin(context, 'cadr(xs)', scheme_libs.cadr)
64✔
526
        defineBuiltin(context, 'cdar(xs)', scheme_libs.cdar)
64✔
527
        defineBuiltin(context, 'cddr(xs)', scheme_libs.cddr)
64✔
528
        defineBuiltin(context, 'caaar(xs)', scheme_libs.caaar)
64✔
529
        defineBuiltin(context, 'caadr(xs)', scheme_libs.caadr)
64✔
530
        defineBuiltin(context, 'cadar(xs)', scheme_libs.cadar)
64✔
531
        defineBuiltin(context, 'caddr(xs)', scheme_libs.caddr)
64✔
532
        defineBuiltin(context, 'cdaar(xs)', scheme_libs.cdaar)
64✔
533
        defineBuiltin(context, 'cdadr(xs)', scheme_libs.cdadr)
64✔
534
        defineBuiltin(context, 'cddar(xs)', scheme_libs.cddar)
64✔
535
        defineBuiltin(context, 'cdddr(xs)', scheme_libs.cdddr)
64✔
536
        defineBuiltin(context, 'caaaar(xs)', scheme_libs.caaaar)
64✔
537
        defineBuiltin(context, 'caaadr(xs)', scheme_libs.caaadr)
64✔
538
        defineBuiltin(context, 'caadar(xs)', scheme_libs.caadar)
64✔
539
        defineBuiltin(context, 'caaddr(xs)', scheme_libs.caaddr)
64✔
540
        defineBuiltin(context, 'cadaar(xs)', scheme_libs.cadaar)
64✔
541
        defineBuiltin(context, 'cadadr(xs)', scheme_libs.cadadr)
64✔
542
        defineBuiltin(context, 'caddar(xs)', scheme_libs.caddar)
64✔
543
        defineBuiltin(context, 'cadddr(xs)', scheme_libs.cadddr)
64✔
544
        defineBuiltin(context, 'cdaaar(xs)', scheme_libs.cdaaar)
64✔
545
        defineBuiltin(context, 'cdaadr(xs)', scheme_libs.cdaadr)
64✔
546
        defineBuiltin(context, 'cdadar(xs)', scheme_libs.cdadar)
64✔
547
        defineBuiltin(context, 'cdaddr(xs)', scheme_libs.cdaddr)
64✔
548
        defineBuiltin(context, 'cddaar(xs)', scheme_libs.cddaar)
64✔
549
        defineBuiltin(context, 'cddadr(xs)', scheme_libs.cddadr)
64✔
550
        defineBuiltin(context, 'cdddar(xs)', scheme_libs.cdddar)
64✔
551
        defineBuiltin(context, 'cddddr(xs)', scheme_libs.cddddr)
64✔
552

553
        // Scheme symbols
554

555
        defineBuiltin(context, 'symbol$63$(val)', scheme_libs.symbol$63$)
64✔
556
        defineBuiltin(context, 'symbol$61$$63$(sym1, sym2)', scheme_libs.symbol$61$$63$)
64✔
557
        //defineBuiltin(context, 'symbol$45$$62$string(str)', scheme_libs.symbol$45$$62$string)
558
        defineBuiltin(context, 'string$45$$62$symbol(sym)', scheme_libs.string$45$$62$symbol)
64✔
559

560
        // Scheme strings
561
        defineBuiltin(context, 'string$45$$62$list(str)', scheme_libs.string$45$$62$list)
64✔
562
        defineBuiltin(context, 'list$45$$62$string(xs)', scheme_libs.list$45$$62$string)
64✔
563

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

567
      case Chapter.SCHEME_1:
568
        // Display
569
        defineBuiltin(
75✔
570
          context,
571
          'display(val, prepend = undefined)',
572
          (val: any, ...str: string[]) => display(schemeVisualise(val), ...str),
×
573
          1
574
        )
575
        defineBuiltin(context, 'newline()', () => display(''))
75✔
576

577
        // I/O
578
        defineBuiltin(context, 'read(str)', () => prompt(''))
75✔
579

580
        // Error
581
        defineBuiltin(context, 'error(str, prepend = undefined)', misc.error_message, 1)
75✔
582

583
        // Scheme truthy and falsy value evaluator
584
        defineBuiltin(context, 'truthy(val)', scheme_libs.truthy)
75✔
585

586
        // Scheme conversion from vector to list, defined here as
587
        // it is used to support variadic functions
588
        defineBuiltin(context, 'vector$45$$62$list(v)', scheme_libs.vector$45$$62$list)
75✔
589

590
        // Scheme function to build numbers
591
        defineBuiltin(context, 'make_number(n)', scheme_libs.make_number)
75✔
592

593
        // Scheme equality predicates
594

595
        defineBuiltin(context, 'eq$63$(...vals)', scheme_libs.eq$63$)
75✔
596
        defineBuiltin(context, 'eqv$63$(...vals)', scheme_libs.eqv$63$)
75✔
597
        defineBuiltin(context, 'equal$63$(...vals)', scheme_libs.equal$63$)
75✔
598

599
        // Scheme basic arithmetic
600
        defineBuiltin(context, '$43$(...vals)', scheme_libs.$43$, 0)
75✔
601
        defineBuiltin(context, '$42$(...vals)', scheme_libs.$42$, 0)
75✔
602
        defineBuiltin(context, '$45$(...vals)', scheme_libs.$45$, 1)
75✔
603
        defineBuiltin(context, '$47$(...vals)', scheme_libs.$47$, 1)
75✔
604

605
        // Scheme comparison
606
        defineBuiltin(context, '$61$(...vals)', scheme_libs.$61$, 2)
75✔
607
        defineBuiltin(context, '$60$(...vals)', scheme_libs.$60$, 2)
75✔
608
        defineBuiltin(context, '$62$(...vals)', scheme_libs.$62$, 2)
75✔
609
        defineBuiltin(context, '$60$$61$(...vals)', scheme_libs.$60$$61$, 2)
75✔
610
        defineBuiltin(context, '$62$$61$(...vals)', scheme_libs.$62$$61$, 2)
75✔
611

612
        // Scheme math functions
613
        defineBuiltin(context, 'number$63$(val)', scheme_libs.number$63$)
75✔
614
        defineBuiltin(context, 'complex$63$(val)', scheme_libs.complex$63$)
75✔
615
        defineBuiltin(context, 'real$63$(val)', scheme_libs.real$63$)
75✔
616
        defineBuiltin(context, 'rational$63$(val)', scheme_libs.rational$63$)
75✔
617
        defineBuiltin(context, 'integer$63$(val)', scheme_libs.integer$63$)
75✔
618
        defineBuiltin(context, 'exact$63$(val)', scheme_libs.exact$63$)
75✔
619
        defineBuiltin(context, 'inexact$63$(val)', scheme_libs.inexact$63$)
75✔
620
        //defineBuiltin(context, 'exact$45$integer$63$(val)', scheme_libs.exact_integerQ)
621
        defineBuiltin(context, 'zero$63$(val)', scheme_libs.zero$63$)
75✔
622
        defineBuiltin(context, 'infinity$63$(val)', scheme_libs.infinity$63$)
75✔
623
        defineBuiltin(context, 'nan$63$(val)', scheme_libs.nan$63$)
75✔
624
        defineBuiltin(context, 'negative$63$(val)', scheme_libs.negative$63$)
75✔
625
        defineBuiltin(context, 'odd$63$(val)', scheme_libs.odd$63$)
75✔
626
        defineBuiltin(context, 'even$63$(val)', scheme_libs.even$63$)
75✔
627
        defineBuiltin(context, 'max(...vals)', scheme_libs.max, 0)
75✔
628
        defineBuiltin(context, 'min(...vals)', scheme_libs.min, 0)
75✔
629
        defineBuiltin(context, 'abs(val)', scheme_libs.abs)
75✔
630

631
        defineBuiltin(context, 'numerator(val)', scheme_libs.numerator)
75✔
632
        defineBuiltin(context, 'denominator(val)', scheme_libs.denominator)
75✔
633

634
        defineBuiltin(context, 'quotient(n, d)', scheme_libs.quotient)
75✔
635
        defineBuiltin(context, 'modulo(n, d)', scheme_libs.modulo)
75✔
636
        defineBuiltin(context, 'remainder(n, d)', scheme_libs.remainder)
75✔
637
        defineBuiltin(context, 'gcd(...vals)', scheme_libs.gcd, 0)
75✔
638
        defineBuiltin(context, 'lcm(...vals)', scheme_libs.lcm, 0)
75✔
639
        defineBuiltin(context, 'square(val)', scheme_libs.square)
75✔
640
        defineBuiltin(context, 'floor(val)', scheme_libs.floor)
75✔
641
        defineBuiltin(context, 'ceiling(val)', scheme_libs.ceiling)
75✔
642
        defineBuiltin(context, 'truncate(val)', scheme_libs.truncate)
75✔
643
        defineBuiltin(context, 'round(val)', scheme_libs.round)
75✔
644
        defineBuiltin(context, 'sqrt(val)', scheme_libs.sqrt)
75✔
645
        defineBuiltin(context, 'expt(base, exp)', scheme_libs.expt)
75✔
646
        defineBuiltin(context, 'exp(val)', scheme_libs.exp)
75✔
647
        defineBuiltin(context, 'log(val)', scheme_libs.log)
75✔
648
        defineBuiltin(context, 'sqrt(val)', scheme_libs.sqrt)
75✔
649
        defineBuiltin(context, 'sin(val)', scheme_libs.sin)
75✔
650
        defineBuiltin(context, 'cos(val)', scheme_libs.cos)
75✔
651
        defineBuiltin(context, 'tan(val)', scheme_libs.tan)
75✔
652
        defineBuiltin(context, 'asin(val)', scheme_libs.asin)
75✔
653
        defineBuiltin(context, 'acos(val)', scheme_libs.acos)
75✔
654
        defineBuiltin(context, 'atan(n, m)', scheme_libs.atan, 1)
75✔
655

656
        defineBuiltin(context, 'make$45$rectangular(real, imag)', scheme_libs.make$45$rectangular)
75✔
657
        defineBuiltin(context, 'make$45$polar(mag, ang)', scheme_libs.make$45$polar)
75✔
658
        defineBuiltin(context, 'real$45$part(val)', scheme_libs.real$45$part)
75✔
659
        defineBuiltin(context, 'imag$45$part(val)', scheme_libs.imag$45$part)
75✔
660
        defineBuiltin(context, 'magnitude(val)', scheme_libs.magnitude)
75✔
661
        defineBuiltin(context, 'angle(val)', scheme_libs.angle)
75✔
662

663
        defineBuiltin(context, 'math$45$pi', scheme_libs.PI)
75✔
664
        defineBuiltin(context, 'math$45$e', scheme_libs.E)
75✔
665

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

668
        // special values for scm-slang
669

670
        // Scheme booleans
671
        defineBuiltin(context, 'boolean$63$(val)', scheme_libs.boolean$63$)
75✔
672
        defineBuiltin(context, 'boolean$61$$63$(x, y)', scheme_libs.boolean$61$$63$)
75✔
673
        defineBuiltin(context, 'and(...vals)', scheme_libs.and, 0)
75✔
674
        defineBuiltin(context, 'or(...vals)', scheme_libs.or, 0)
75✔
675
        defineBuiltin(context, 'not(val)', scheme_libs.not)
75✔
676

677
        // Scheme strings
678

679
        defineBuiltin(context, 'string$63$(val)', scheme_libs.string$63$)
75✔
680
        defineBuiltin(context, 'make$45$string(n, char)', scheme_libs.make$45$string, 1)
75✔
681
        defineBuiltin(context, 'string(...vals)', scheme_libs.string, 0)
75✔
682
        defineBuiltin(context, 'string$45$length(str)', scheme_libs.string$45$length)
75✔
683
        defineBuiltin(context, 'string$45$ref(str, k)', scheme_libs.string$45$ref)
75✔
684
        defineBuiltin(context, 'string$61$$63$(str1, str2)', scheme_libs.string$61$$63$)
75✔
685
        defineBuiltin(context, 'string$60$$63$(str1, str2)', scheme_libs.string$60$$63$)
75✔
686
        defineBuiltin(context, 'string$62$$63$(str1, str2)', scheme_libs.string$62$$63$)
75✔
687
        defineBuiltin(context, 'string$60$$61$$63$(str1, str2)', scheme_libs.string$60$$61$$63$)
75✔
688
        defineBuiltin(context, 'string$62$$61$$63$(str1, str2)', scheme_libs.string$62$$61$$63$)
75✔
689
        defineBuiltin(context, 'substring(str, start, end)', scheme_libs.substring, 2)
75✔
690
        defineBuiltin(context, 'string$45$append(...vals)', scheme_libs.string$45$append, 0)
75✔
691
        defineBuiltin(context, 'string$45$copy(str)', scheme_libs.string$45$copy)
75✔
692
        defineBuiltin(context, 'string$45$map(f, str)', scheme_libs.string$45$map)
75✔
693
        defineBuiltin(context, 'string$45$for$45$each(f, str)', scheme_libs.string$45$for$45$each)
75✔
694
        defineBuiltin(context, 'string$45$$62$number(str)', scheme_libs.string$45$$62$number)
75✔
695

696
        // Scheme procedures
697
        defineBuiltin(context, 'procedure$63$(val)', scheme_libs.procedure$63$)
75✔
698
        defineBuiltin(context, 'compose(...fns)', scheme_libs.compose, 0)
75✔
699

700
        // Special values
701
        defineBuiltin(context, 'undefined', undefined)
75✔
702
        break
75✔
703
      default:
704
      //should be unreachable
705
    }
706
  }
707

708
  if (context.chapter <= Chapter.PYTHON_1 && context.chapter >= Chapter.PYTHON_1) {
3,089✔
709
    if (context.chapter == Chapter.PYTHON_1) {
45!
710
      // Display
711
      defineBuiltin(context, 'get_time()', misc.get_time)
45✔
712
      defineBuiltin(context, 'print(val)', display, 1)
45✔
713
      defineBuiltin(context, 'raw_print(str)', rawDisplay, 1)
45✔
714
      defineBuiltin(context, 'str(val)', (val: any) => stringify(val, 2, 80), 1)
45✔
715
      defineBuiltin(context, 'error(str)', misc.error_message, 1)
45✔
716
      defineBuiltin(context, 'prompt(str)', prompt)
45✔
717
      defineBuiltin(context, 'is_float(val)', pylib.is_float)
45✔
718
      defineBuiltin(context, 'is_int(val)', pylib.is_int)
45✔
719
      defineBuiltin(context, 'is_string(val)', misc.is_string)
45✔
720
      defineBuiltin(context, 'is_function(val)', misc.is_function)
45✔
721
      defineBuiltin(context, 'is_boolean(val)', misc.is_boolean)
45✔
722
      defineBuiltin(context, 'is_None(val)', list.is_null)
45✔
723
      defineBuiltin(context, 'parse_int(str, radix)', misc.parse_int)
45✔
724
      defineBuiltin(context, 'char_at(str, index)', misc.char_at)
45✔
725
      defineBuiltin(context, 'arity(f)', misc.arity)
45✔
726
      defineBuiltin(context, 'None', null)
45✔
727

728
      // Binary operators
729
      defineBuiltin(context, '__py_adder(x, y)', pylib.__py_adder)
45✔
730
      defineBuiltin(context, '__py_minuser(x, y)', pylib.__py_minuser)
45✔
731
      defineBuiltin(context, '__py_multiplier(x, y)', pylib.__py_multiplier)
45✔
732
      defineBuiltin(context, '__py_divider(x, y)', pylib.__py_divider)
45✔
733
      defineBuiltin(context, '__py_modder(x, y)', pylib.__py_modder)
45✔
734
      defineBuiltin(context, '__py_powerer(x, y)', pylib.__py_powerer)
45✔
735
      defineBuiltin(context, '__py_floorer(x, y)', pylib.__py_floorer)
45✔
736

737
      // Unary operator +
738
      defineBuiltin(context, '__py_unary_plus(x)', pylib.__py_unary_plus)
45✔
739

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

777
      // Math constants
778
      defineBuiltin(context, 'math_e', Math.E)
45✔
779
      defineBuiltin(context, 'math_inf', Infinity)
45✔
780
      defineBuiltin(context, 'math_nan', NaN)
45✔
781
      defineBuiltin(context, 'math_pi', Math.PI)
45✔
782
      defineBuiltin(context, 'math_tau', Math.PI * 2)
45✔
783
    }
784
  }
785
}
786

787
function importPrelude(context: Context) {
788
  let prelude = ''
3,089✔
789
  if (context.chapter >= 2) {
3,089✔
790
    prelude += listPrelude
1,590✔
791
    prelude += localImportPrelude
1,590✔
792
  }
793
  if (context.chapter >= 3) {
3,089✔
794
    prelude += streamPrelude
1,315✔
795
  }
796

797
  if (context.chapter <= +Chapter.SCHEME_1 && context.chapter >= +Chapter.FULL_SCHEME) {
3,089✔
798
    // Scheme preludes
799
    // scheme 1 is the "highest" scheme chapter, so we can just check if it's less than or equal to scheme 1
800
    if (context.chapter <= +Chapter.SCHEME_1) {
75!
801
      prelude += scheme1Prelude
75✔
802
    }
803
    if (context.chapter <= +Chapter.SCHEME_2) {
75✔
804
      prelude += scheme2Prelude
64✔
805
    }
806
    if (context.chapter <= +Chapter.SCHEME_3) {
75✔
807
      prelude += scheme3Prelude
63✔
808
    }
809
    if (context.chapter <= +Chapter.SCHEME_4) {
75✔
810
      prelude += scheme4Prelude
62✔
811
    }
812
    if (context.chapter <= +Chapter.FULL_SCHEME) {
75✔
813
      prelude += schemeFullPrelude
56✔
814
    }
815
  }
816
  if (prelude !== '') {
3,089✔
817
    context.prelude = prelude
1,665✔
818
  }
819
}
820

821
const defaultBuiltIns: CustomBuiltIns = {
70✔
822
  rawDisplay: misc.rawDisplay,
823
  // See issue #5
824
  prompt: misc.rawDisplay,
825
  // See issue #11
826
  alert: misc.rawDisplay,
827
  visualiseList: (_v: Value) => {
828
    throw new Error('List visualizer is not enabled')
×
829
  }
830
}
831

832
const createContext = <T>(
70✔
833
  chapter: Chapter = Chapter.SOURCE_1,
3,240✔
834
  variant: Variant = Variant.DEFAULT,
3,240✔
835
  languageOptions: LanguageOptions = {},
3,240✔
836
  externalSymbols: string[] = [],
3,240✔
837
  externalContext?: T,
838
  externalBuiltIns: CustomBuiltIns = defaultBuiltIns
3,240✔
839
): Context => {
840
  if (chapter === Chapter.FULL_JS || chapter === Chapter.FULL_TS) {
3,240✔
841
    // fullJS will include all builtins and preludes of source 4
842
    return {
151✔
843
      ...createContext(
844
        Chapter.SOURCE_4,
845
        variant,
846
        languageOptions,
847
        externalSymbols,
848
        externalContext,
849
        externalBuiltIns
850
      ),
851
      chapter
852
    } as Context
853
  }
854
  const context = createEmptyContext(
3,089✔
855
    chapter,
856
    variant,
857
    languageOptions,
858
    externalSymbols,
859
    externalContext
860
  )
861

862
  importBuiltins(context, externalBuiltIns)
3,089✔
863
  importPrelude(context)
3,089✔
864
  importExternalSymbols(context, externalSymbols)
3,089✔
865

866
  return context
3,089✔
867
}
868

869
export default createContext
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