fez-lisp 1.5.42 → 1.5.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.5.42",
5
+ "version": "1.5.44",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -13,6 +13,7 @@ import {
13
13
  VALUE,
14
14
  WORD
15
15
  } from './keywords.js'
16
+ import { OPTIMIZED_PREFIX } from './macros.js'
16
17
  import { isLeaf } from './parser.js'
17
18
  import {
18
19
  getSuffix,
@@ -30,6 +31,7 @@ const SCOPE_NAME = '__scope__'
30
31
  const SUB_TYPE = 'subType'
31
32
  const TYPE_PROP = 'type'
32
33
  const PREDICATE = 3
34
+ const COLLECTION = 4
33
35
  const RETRY_COUNT = 1
34
36
  const DEFINITON_RETRY_COUNT = 1
35
37
  const SUB = 2
@@ -43,6 +45,8 @@ const toTypeNames = (type) => {
43
45
  return 'Uknown'
44
46
  case PREDICATE:
45
47
  return 'Predicate'
48
+ case COLLECTION:
49
+ return 'Collection'
46
50
  }
47
51
  }
48
52
  export const typeCheck = (ast) => {
@@ -53,7 +57,7 @@ export const typeCheck = (ast) => {
53
57
  retried: 0,
54
58
  [ARGS]: [
55
59
  [UNKNOWN, PLACEHOLDER],
56
- [APPLY, PLACEHOLDER]
60
+ [COLLECTION, PLACEHOLDER]
57
61
  ],
58
62
  [ARGS_COUNT]: 2,
59
63
  [RETURNS]: UNKNOWN
@@ -63,8 +67,9 @@ export const typeCheck = (ast) => {
63
67
  [STATS]: {
64
68
  type: APPLY,
65
69
  retried: 0,
66
- [ARGS_COUNT]: VARIADIC,
67
- [RETURNS]: APPLY
70
+ [ARGS_COUNT]: 1,
71
+ [ARGS]: [[COLLECTION, PLACEHOLDER]],
72
+ [RETURNS]: COLLECTION
68
73
  }
69
74
  },
70
75
  [DEBUG.ASSERT]: {
@@ -128,7 +133,7 @@ export const typeCheck = (ast) => {
128
133
  type: APPLY,
129
134
  retried: 0,
130
135
  [ARGS_COUNT]: VARIADIC,
131
- [RETURNS]: APPLY
136
+ [RETURNS]: COLLECTION
132
137
  }
133
138
  },
134
139
  [KEYWORDS.LOOP]: {
@@ -278,7 +283,7 @@ export const typeCheck = (ast) => {
278
283
  retried: 0,
279
284
  [ARGS_COUNT]: 2,
280
285
  [ARGS]: [
281
- [UNKNOWN, PLACEHOLDER],
286
+ [COLLECTION, PLACEHOLDER],
282
287
  [ATOM, PLACEHOLDER]
283
288
  ],
284
289
  [RETURNS]: UNKNOWN
@@ -290,11 +295,11 @@ export const typeCheck = (ast) => {
290
295
  retried: 0,
291
296
  [ARGS_COUNT]: 3,
292
297
  [ARGS]: [
293
- [UNKNOWN, PLACEHOLDER],
298
+ [COLLECTION, PLACEHOLDER],
294
299
  [ATOM, PLACEHOLDER],
295
300
  [UNKNOWN, PLACEHOLDER]
296
301
  ],
297
- [RETURNS]: UNKNOWN
302
+ [RETURNS]: COLLECTION
298
303
  }
299
304
  },
300
305
  [KEYWORDS.POP_ARRAY]: {
@@ -302,8 +307,8 @@ export const typeCheck = (ast) => {
302
307
  type: APPLY,
303
308
  retried: 0,
304
309
  [ARGS_COUNT]: 1,
305
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
306
- [RETURNS]: UNKNOWN
310
+ [ARGS]: [[COLLECTION, PLACEHOLDER]],
311
+ [RETURNS]: COLLECTION
307
312
  }
308
313
  },
309
314
  [KEYWORDS.ARRAY_LENGTH]: {
@@ -311,7 +316,7 @@ export const typeCheck = (ast) => {
311
316
  type: APPLY,
312
317
  retried: 0,
313
318
  [ARGS_COUNT]: 1,
314
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
319
+ [ARGS]: [[COLLECTION, PLACEHOLDER]],
315
320
  [RETURNS]: ATOM
316
321
  }
317
322
  },
@@ -454,7 +459,7 @@ export const typeCheck = (ast) => {
454
459
  type: APPLY,
455
460
  retried: 0,
456
461
  [ARGS_COUNT]: 1,
457
- [ARGS]: [[UNKNOWN, PLACEHOLDER]],
462
+ [ARGS]: [[COLLECTION, PLACEHOLDER]],
458
463
  [RETURNS]: UNKNOWN
459
464
  }
460
465
  }
@@ -534,31 +539,64 @@ export const typeCheck = (ast) => {
534
539
  } else {
535
540
  switch (returns[VALUE]) {
536
541
  case KEYWORDS.IF:
537
- const re = rem.slice(2)
538
- if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
539
- env[name][STATS][RETURNS] = ATOM
540
- // if (
541
- // re[0][VALUE] === FALSE ||
542
- // re[0][VALUE] === TRUE ||
543
- // re[1][VALUE] === FALSE ||
544
- // re[1][VALUE] === TRUE
545
- // ) {
546
- // env[name][STATS][SUB_TYPE] = PREDICATE
547
- // }
548
- } else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
549
- env[name][STATS][RETURNS] =
550
- env[re[0][0][VALUE]][STATS][RETURNS]
551
- env[name][STATS][SUB_TYPE] =
552
- env[re[0][0][VALUE]][STATS][SUB_TYPE]
553
- } else {
554
- if (env[re[0][VALUE]]) {
555
- env[name][STATS][RETURNS] =
556
- env[re[0][VALUE]][STATS].type
542
+ {
543
+ const re = rem.slice(2)
544
+ if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM) {
545
+ env[name][STATS][prop] = ATOM
546
+ // if (
547
+ // re[0][VALUE] === FALSE ||
548
+ // re[0][VALUE] === TRUE ||
549
+ // re[1][VALUE] === FALSE ||
550
+ // re[1][VALUE] === TRUE
551
+ // ) {
552
+ // env[name][STATS][SUB_TYPE] = PREDICATE
553
+ // }
554
+ } else if (!isLeaf(re[0]) && env[re[0][0][VALUE]]) {
555
+ env[name][STATS][prop] =
556
+ env[re[0][0][VALUE]][STATS][RETURNS]
557
557
  env[name][STATS][SUB_TYPE] =
558
- env[re[0][VALUE]][STATS][SUB_TYPE]
558
+ env[re[0][0][VALUE]][STATS][SUB_TYPE]
559
+
560
+ if (
561
+ re[0][0][TYPE] === APPLY &&
562
+ // turn off typechecks for optimized functions
563
+ !name.startsWith(OPTIMIZED_PREFIX)
564
+ ) {
565
+ switch (re[0][0][VALUE]) {
566
+ case KEYWORDS.ANONYMOUS_FUNCTION:
567
+ // env[name][STATS][prop] =
568
+ // env[re[0][0][VALUE]][STATS][RETURNS]
569
+ // env[name][STATS][SUB_TYPE] =
570
+ // env[re[0][0][VALUE]][STATS][SUB_TYPE]
571
+
572
+ env[name][STATS][RETURNS] = UNKNOWN
573
+ env[name][STATS][ARGS_COUNT] =
574
+ re[0].length - 2
575
+ // check(
576
+ // [
577
+ // [APPLY, KEYWORDS.DEFINE_VARIABLE],
578
+ // [WORD, name],
579
+ // re[0]
580
+ // ],
581
+ // env,
582
+ // scope
583
+ // )
584
+ break
585
+ }
586
+ }
587
+ // env[name][STATS] = env[re[0][0][VALUE]][STATS]
559
588
  } else {
560
- env[name][STATS][RETURNS] = UNKNOWN
561
- // env[name][STATS][RETURNS] = APPLY
589
+ if (env[re[0][VALUE]]) {
590
+ env[name][STATS][prop] =
591
+ env[re[0][VALUE]][STATS].type
592
+ env[name][STATS][SUB_TYPE] =
593
+ env[re[0][VALUE]][STATS][SUB_TYPE]
594
+ // env[name][STATS] = env[name][STATS]
595
+ // env[re[0][VALUE]][STATS][SUB_TYPE]
596
+ } else {
597
+ env[name][STATS][prop] = UNKNOWN
598
+ // env[name][STATS][RETURNS] = APPLY
599
+ }
562
600
  }
563
601
  }
564
602
  break
@@ -789,6 +827,13 @@ export const typeCheck = (ast) => {
789
827
  isPredicate
790
828
  )
791
829
  }
830
+ } else {
831
+ // TIODO finish this
832
+ const body = rest.at(-1)
833
+ const rem = hasBlock(body) ? body.at(-1) : body
834
+ const returns = isLeaf(rem) ? rem : rem[0]
835
+ resolveRetunType(returns, rem, TYPE_PROP, isPredicate)
836
+ // console.log({ name })
792
837
  }
793
838
  if (env[right[VALUE]]?.[STATS]?.[SUB_TYPE]) {
794
839
  if (
@@ -1105,7 +1150,7 @@ export const typeCheck = (ast) => {
1105
1150
  // console.log(env[CAR][STATS], expectedArgs[i][TYPE])
1106
1151
  errorStack.set(
1107
1152
  key.str,
1108
- `Incorrect type of arguments for special form (${
1153
+ `Incorrect type of argument (${i}) for special form (${
1109
1154
  first[VALUE]
1110
1155
  }). Expected (${toTypeNames(
1111
1156
  expectedArgs[i][TYPE]
@@ -1226,7 +1271,7 @@ export const typeCheck = (ast) => {
1226
1271
  args[i][STATS].type
1227
1272
  )}) but got (${toTypeNames(T)}) (${stringifyArgs(
1228
1273
  exp
1229
- )})`
1274
+ )}) (check #30)`
1230
1275
  )
1231
1276
  } else {
1232
1277
  // env[rest[i][VALUE]][STATS] THiss SHOULD BE
@@ -1284,6 +1329,7 @@ export const typeCheck = (ast) => {
1284
1329
  }
1285
1330
  }
1286
1331
  })
1332
+ // console.log(env)
1287
1333
  for (const r of rest) check(r, env, scope)
1288
1334
  break
1289
1335
  }
package/src/macros.js CHANGED
@@ -33,6 +33,7 @@ export const OPTIMIZATIONS = {
33
33
  RECURSION: 'recursive',
34
34
  CACHE: 'memoized'
35
35
  }
36
+ export const OPTIMIZED_PREFIX = 'optimized-lambda::'
36
37
  const deepTransform = (predicate, transform, tree) => {
37
38
  if (!isLeaf(tree))
38
39
  for (const leaf of tree) {
@@ -530,7 +531,7 @@ export const deSuggarAst = (ast, scope) => {
530
531
  )
531
532
  }
532
533
  const args = last.slice(1, -1)
533
- const newName = `*${performance
534
+ const newName = `${OPTIMIZED_PREFIX}*${performance
534
535
  .now()
535
536
  .toString()
536
537
  .replace('.', 0)}*`
@@ -631,7 +632,7 @@ export const deSuggarAst = (ast, scope) => {
631
632
  )
632
633
  }
633
634
  const args = last.slice(1, -1)
634
- const newName = `*${performance
635
+ const newName = `${OPTIMIZED_PREFIX}*${performance
635
636
  .now()
636
637
  .toString()
637
638
  .replace('.', 0)}*`
package/src/parser.js CHANGED
@@ -11,6 +11,10 @@ export const LISP = {
11
11
  const cursor = source[i]
12
12
  if (cursor === '(') {
13
13
  const temp = []
14
+ if (head == undefined)
15
+ throw new SyntaxError(
16
+ `Failed to parse due to invalid lisp programm near ${acc}`
17
+ )
14
18
  head.push(temp)
15
19
  stack.push(head)
16
20
  head = temp