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

source-academy / js-slang / 14529259416

18 Apr 2025 03:46AM UTC coverage: 80.538%. Remained the same
14529259416

Pull #1757

github

web-flow
Merge 63eac9783 into fea2b4cad
Pull Request #1757: Language options

3458 of 4687 branches covered (73.78%)

Branch coverage included in aggregate %.

15 of 88 new or added lines in 6 files covered. (17.05%)

84 existing lines in 6 files now uncovered.

10811 of 13030 relevant lines covered (82.97%)

142544.19 hits per line

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

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

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

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

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

49
  public insert(environment: Environment): void {
50
    const tailEnvironment = environment.tail
611,701✔
51
    if (tailEnvironment === null) {
611,701✔
52
      if (this._root === null) {
3,667✔
53
        this._root = new EnvTreeNode(environment, null)
3,667✔
54
        this.map.set(environment, this._root)
3,667✔
55
      }
56
    } else {
57
      const parentNode = this.map.get(tailEnvironment)
608,034✔
58
      if (parentNode) {
608,034✔
59
        const childNode = new EnvTreeNode(environment, parentNode)
608,034✔
60
        parentNode.addChild(childNode)
608,034✔
61
        this.map.set(environment, childNode)
608,034✔
62
      }
63
    }
64
  }
65

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

71
export class EnvTreeNode {
70✔
72
  private _children: EnvTreeNode[] = []
611,702✔
73

74
  constructor(
75
    readonly environment: Environment,
611,702✔
76
    public parent: EnvTreeNode | null
611,702✔
77
  ) {}
78

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

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

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

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

97
  public addChild(newChild: EnvTreeNode): EnvTreeNode {
98
    this._children.push(newChild)
608,035✔
99
    return newChild
608,035✔
100
  }
101
}
102

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

121
const createEmptyDebugger = () => ({
3,665✔
122
  observers: { callbacks: Array<() => void>() },
123
  status: false,
124
  state: {
125
    it: (function* (): any {
UNCOV
126
      return
×
127
    })(),
128
    scheduler: new AsyncScheduler()
129
  }
130
})
131

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

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

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

178
export const ensureGlobalEnvironmentExist = (context: Context) => {
70✔
179
  if (!context.runtime) {
7,330!
UNCOV
180
    context.runtime = createEmptyRuntime()
×
181
  }
182
  if (!context.runtime.environments) {
7,330!
183
    context.runtime.environments = []
×
184
  }
185
  if (!context.runtime.environmentTree) {
7,330!
186
    context.runtime.environmentTree = new EnvTree()
×
187
  }
188
  if (context.runtime.environments.length === 0) {
7,330✔
189
    const globalEnvironment = createGlobalEnvironment()
3,665✔
190
    context.runtime.environments.push(globalEnvironment)
3,665✔
191
    context.runtime.environmentTree.insert(globalEnvironment)
3,665✔
192
  }
193
}
194

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

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

236
  function extractParameters(name: string): string[] {
237
    // if the function has no () in its name, it has no parameters
238
    if (!name.includes('(')) {
221,149✔
239
      return []
10✔
240
    }
241
    return name
221,139✔
242
      .split('(')[1]
243
      .split(')')[0]
244
      .split(',')
245
      .map(s => s.trim())
272,823✔
246
  }
247

248
  if (typeof value === 'function') {
260,224✔
249
    const funName = extractName(name)
221,149✔
250
    const funParameters = extractParameters(name)
221,149✔
251
    const repr = `function ${name} {\n\t[implementation hidden]\n}`
221,149✔
252
    value.toString = () => repr
221,149✔
253
    value.minArgsNeeded = minArgsNeeded
221,149✔
254
    value.funName = funName
221,149✔
255
    value.funParameters = funParameters
221,149✔
256

257
    defineSymbol(context, funName, value)
221,149✔
258
  } else {
259
    defineSymbol(context, name, value)
39,075✔
260
  }
261
}
262

263
export const importExternalSymbols = (context: Context, externalSymbols: string[]) => {
70✔
264
  ensureGlobalEnvironmentExist(context)
3,665✔
265

266
  externalSymbols.forEach(symbol => {
3,665✔
UNCOV
267
    defineSymbol(context, symbol, GLOBAL[symbol])
×
268
  })
269
}
270

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

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

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

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

365
    // Stream library
366
    defineBuiltin(context, 'stream(...values)', stream.stream, 0)
1,675✔
367
  }
368

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

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

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

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

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

419
      case Chapter.SCHEME_3:
420
        // Introduction to mutable values, streams
421

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

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

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

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

439
        defineBuiltin(context, 'vector$63$(v)', scheme_libs.vector$63$)
63✔
440

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

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

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

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

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

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

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

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

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

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

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

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

534
        // Scheme cxrs
535

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

565
        // Scheme symbols
566

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

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

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

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

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

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

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

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

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

605
        // Scheme equality predicates
606

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

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

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

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

643
        defineBuiltin(context, 'numerator(val)', scheme_libs.numerator)
75✔
644
        defineBuiltin(context, 'denominator(val)', scheme_libs.denominator)
75✔
645

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

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

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

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

680
        // special values for scm-slang
681

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

689
        // Scheme strings
690

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

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

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

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

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

749
      // Unary operator +
750
      defineBuiltin(context, '__py_unary_plus(x)', pylib.__py_unary_plus)
62✔
751

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

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

799
function importPrelude(context: Context) {
800
  let prelude = ''
3,665✔
801
  if (context.chapter >= 2) {
3,665✔
802
    prelude += listPrelude
1,995✔
803
    prelude += localImportPrelude
1,995✔
804
  }
805
  if (context.chapter >= 3) {
3,665✔
806
    prelude += streamPrelude
1,675✔
807
  }
808

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

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

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

874
  importBuiltins(context, externalBuiltIns)
3,665✔
875
  importPrelude(context)
3,665✔
876
  importExternalSymbols(context, externalSymbols)
3,665✔
877

878
  return context
3,665✔
879
}
880

881
export default createContext
70✔
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