fez-lisp 1.6.58 → 1.6.60

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.6.58",
5
+ "version": "1.6.60",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -606,7 +606,7 @@ const resolveGetter = ({ rem, prop, name, env }) => {
606
606
 
607
607
  switch (array[TYPE]) {
608
608
  case APPLY:
609
- if (hasSubType(env[array[VALUE]][STATS])) {
609
+ if (hasSubReturn(env[array[VALUE]][STATS])) {
610
610
  const rightSub = getSubReturn(env[array[VALUE]][STATS])
611
611
  const isAtom = rightSub.has(NUMBER) || rightSub.has(BOOLEAN)
612
612
  const isCollection = rightSub.has(COLLECTION)
@@ -614,12 +614,12 @@ const resolveGetter = ({ rem, prop, name, env }) => {
614
614
  setPropToAtom(env[name][STATS], prop)
615
615
  setPropToSubReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
616
616
  } else if (!isAtom && isCollection) {
617
- setPropToReturn(env[name][STATS], prop, env[array[VALUE]][STATS])
618
- // TODO: handle this nested array overwrite better
619
- if (getSubReturn(env[array[VALUE]][STATS]).has(COLLECTION))
620
- setPropToSubReturn(env[name][STATS], prop, {
621
- [RETURNS]: [COLLECTION, UNKNOWN_SUBTYPE()]
622
- })
617
+ setPropToReturn(env[name][STATS], prop, {
618
+ [RETURNS]: [
619
+ env[array[VALUE]][STATS][RETURNS][1].types[0],
620
+ new SubType(env[array[VALUE]][STATS][RETURNS][1].types.slice(1))
621
+ ]
622
+ })
623
623
  } else return false
624
624
  } else return false
625
625
  break
@@ -713,10 +713,12 @@ const resolveSetter = (first, rest, env, stack) => {
713
713
  case APPLY:
714
714
  if (env[right[VALUE]]) {
715
715
  if (right[VALUE] === KEYWORDS.CREATE_ARRAY) {
716
- current[STATS][TYPE_PROP][1] = initArrayType({
716
+ const inner = initArrayType({
717
717
  rem: rest.at(-1),
718
718
  env
719
719
  })[RETURNS][1]
720
+ current[STATS][TYPE_PROP][0] = COLLECTION
721
+ if (!inner.has(UNKNOWN)) current[STATS][TYPE_PROP][1] = inner
720
722
  break
721
723
  }
722
724
  if (hasSubReturn(env[right[VALUE]][STATS])) {
@@ -782,7 +784,6 @@ const initArrayTypeRec = ({ rem, env }) => {
782
784
  const initArrayType = ({ rem, env }) => {
783
785
  const ret = initArrayTypeRec({ rem, env })
784
786
  const known = ret.find((x) => x[0] !== ANY && x[0] !== UNKNOWN)
785
- // console.log(known[0], ret[0])
786
787
  if (known && ret.length) {
787
788
  if (Array.isArray(ret[0][0])) {
788
789
  let head = ret[0][0]
@@ -796,6 +797,7 @@ const initArrayType = ({ rem, env }) => {
796
797
  if (head) subT.add(head[1].types[0])
797
798
  }
798
799
  const [main, sub] = ret[0]
800
+ if (isSubType(sub) && sub.types.at(-1) === COLLECTION) sub.types.pop()
799
801
  return {
800
802
  [TYPE_PROP]: [APPLY],
801
803
  [RETURNS]: [COLLECTION, new SubType(isSubType(sub) ? [...sub] : [main])]
package/src/keywords.js CHANGED
@@ -110,8 +110,8 @@ export const MUTATORS_SET = new Set([
110
110
  'array:set!',
111
111
  'push!',
112
112
  'array:append!',
113
- 'array:push!',
114
- 'var:set!'
113
+ 'array:push!'
114
+ // 'var:set!'
115
115
  ])
116
116
  export const GETTERS_SET = new Set([
117
117
  KEYWORDS.GET_ARRAY,
package/src/types.js CHANGED
@@ -91,49 +91,39 @@ export const toTypeNames = (type) => {
91
91
  return 'Atom'
92
92
  case NUMBER:
93
93
  return 'Number'
94
- // case ATOM:
95
- // return 'Atom'
96
94
  case UNKNOWN:
97
95
  return 'Unknown'
98
96
  case COLLECTION:
99
- // return 'Array'
100
97
  return 'Unknown[]'
101
98
  case ANY:
102
99
  return 'Any'
103
100
  default:
104
- break
101
+ return 'Unknown'
105
102
  }
106
103
  }
104
+
105
+ export const extractArrayType = (type) => {
106
+ const arr = [...type].filter((x) => x === '[')
107
+ return [type.split('[')[0], arr.length]
108
+ }
109
+ const fillArrayType = (n) => Array.from({ length: n - 1 }).fill(COLLECTION)
107
110
  export const toTypeCodes = (type) => {
108
- switch (type) {
111
+ const [t, n] = extractArrayType(type)
112
+ switch (t) {
109
113
  case 'Abstraction':
110
114
  return [APPLY]
111
115
  case 'Boolean':
116
+ if (n) return [COLLECTION, new SubType(fillArrayType(n).concat(BOOLEAN))]
112
117
  return [ATOM, BOOLEAN_SUBTYPE()]
113
118
  case 'Atom':
119
+ if (n) return [COLLECTION, new SubType(fillArrayType(n).concat(ATOM))]
114
120
  return [ATOM]
115
121
  case 'Number':
122
+ if (n) return [COLLECTION, new SubType(fillArrayType(n).concat(NUMBER))]
116
123
  return [ATOM, NUMBER_SUBTYPE()]
117
124
  case 'Unknown':
125
+ if (n) return [COLLECTION, new SubType(fillArrayType(n))]
118
126
  return [UNKNOWN]
119
- case 'Unknown[]':
120
- case 'Unknowns':
121
- // case 'Collection':
122
- return [COLLECTION, new SubType([ANY])]
123
- case 'Numbers':
124
- case 'Number[]':
125
- return [COLLECTION, NUMBER_SUBTYPE()]
126
- case 'Booleans':
127
- case 'Boolean[]':
128
- return [COLLECTION, BOOLEAN_SUBTYPE()]
129
- // case 'Collections':
130
- // case 'Collection[]':
131
- case 'Unknown[][]':
132
- return [COLLECTION, COLLECTION_SUBTYPE()]
133
- case 'Boolean[][]':
134
- return [COLLECTION, new SubType([COLLECTION, BOOLEAN])]
135
- case 'Number[][]':
136
- return [COLLECTION, new SubType([COLLECTION, NUMBER])]
137
127
  case 'Any':
138
128
  return [ANY]
139
129
  default:
@@ -1539,3 +1529,12 @@ export const filteredDefinedTypes = (program, lib, libT) => {
1539
1529
  export const definedTypes = (T) => fromSourceToType(T)
1540
1530
  export const withStdDefinedTypes = (ast) =>
1541
1531
  withCtxTypes(definedTypes(filteredDefinedTypes(ast, std, stdT)))
1532
+
1533
+ export const extractTypes = (source) => {
1534
+ let types
1535
+ const src = source.replaceAll(/\(the.+\)/g, (match, token) => {
1536
+ types = match
1537
+ return ''
1538
+ })
1539
+ return [src, types]
1540
+ }
package/src/utils.js CHANGED
@@ -21,6 +21,7 @@ import { type, typeCheck, withScope } from './check.js'
21
21
  import stdT from '../lib/baked/std-T.js'
22
22
  import {
23
23
  definedTypes,
24
+ extractTypes,
24
25
  filteredDefinedTypes,
25
26
  formatAstTypes,
26
27
  withCtxTypes
@@ -380,8 +381,8 @@ export const init = () => {
380
381
  console.log('Added directory src in root')
381
382
  writeFileSync('./src/main.lisp', '')
382
383
  console.log('Added file main.lisp in src')
383
- writeFileSync('./src/types.lisp', '')
384
- console.log('Added file types.lisp in src')
384
+ // writeFileSync('./src/types.lisp', '')
385
+ // console.log('Added file types.lisp in src')
385
386
  writeFileSync(
386
387
  'index.js',
387
388
  `import { compile, enhance, parse, LISP, UTILS } from "fez-lisp";
@@ -406,16 +407,17 @@ export const dev = (source, types) => {
406
407
  };
407
408
  export const comp = (source) => compile(enhance(parse(source)));
408
409
  const file = readFileSync("./src/main.lisp", "utf-8");
410
+ const [src, typ] = UTILS.extractTypes(file);
409
411
  switch (process.argv[2]) {
410
412
  case "comp":
411
413
  writeFileSync(
412
414
  "./src/main.js",
413
- "var _ = " + comp(file) + "; console.log(_)"
415
+ "var _ = " + comp(src) + "; console.log(_)"
414
416
  );
415
417
  break;
416
418
  case "dev":
417
419
  default:
418
- dev(file, readFileSync("./src/types.lisp", "utf-8"));
420
+ dev(src, typ);
419
421
  break;
420
422
  }
421
423
  `
@@ -424,7 +426,7 @@ switch (process.argv[2]) {
424
426
  console.log(
425
427
  `Done!
426
428
 
427
- Write code in main.lisp and types (if any) in types.lisp
429
+ Write code in main.lisp
428
430
  Run node index.js with the following flags:
429
431
  - dev (static type check and run time validations)
430
432
  - comp (compile Fez to JavaScript file main.js)
@@ -440,6 +442,7 @@ That's it! You are all set!
440
442
  }
441
443
 
442
444
  export const UTILS = {
445
+ extractTypes,
443
446
  init,
444
447
  debug,
445
448
  startDebug,