fez-lisp 1.5.94 → 1.5.95

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.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/src/check.js +29 -23
  3. package/src/types.js +12 -12
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.94",
5
+ "version": "1.5.95",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -32,7 +32,8 @@ import {
32
32
  MAX_ARGUMENT_RETRY,
33
33
  COLLECTION,
34
34
  ANY,
35
- formatType
35
+ formatType,
36
+ ANONYMOUS_FUNCTION_TYPE_PREFIX
36
37
  } from './types.js'
37
38
  import {
38
39
  getSuffix,
@@ -89,9 +90,11 @@ export const setPropToTypeRef = (stats, prop, value) =>
89
90
  value[TYPE_PROP][0] !== UNKNOWN &&
90
91
  (stats[prop] = value[TYPE_PROP])
91
92
  export const setReturnToAtom = (stats) =>
92
- isUnknownReturn(stats) && (stats[RETURNS] = ATOM)
93
+ isUnknownReturn(stats) && (stats[RETURNS][0] = ATOM)
93
94
  export const setTypeToAtom = (stats) =>
94
- isUnknownType(stats) && (stats[TYPE_PROP] = ATOM)
95
+ isUnknownType(stats) && (stats[TYPE_PROP][0] = ATOM)
96
+ export const setReturnToAbbstraction = (stats) =>
97
+ isUnknownReturn(stats) && (stats[RETURNS][0] = APPLY)
95
98
  export const setTypeRef = (stats, value) =>
96
99
  isUnknownType(stats) && (stats[TYPE_PROP] = value[TYPE_PROP])
97
100
  export const setReturnRef = (stats, value) =>
@@ -228,9 +231,7 @@ const getScopeNames = (scope) => {
228
231
  }
229
232
  const withScope = (name, scope) => {
230
233
  const chain = getScopeNames(scope)
231
- return `${chain.length === 1 ? '; ' : ''}${chain
232
- .map((x) => (Number.isInteger(+x) ? '::' : x))
233
- .join(' ')} ${name}`
234
+ return `${chain.length === 1 ? '; ' : ''}${chain.join(' ')} ${name}`
234
235
  }
235
236
  export const typeCheck = (ast, error = true) => {
236
237
  let scopeIndex = 0
@@ -369,25 +370,30 @@ export const typeCheck = (ast, error = true) => {
369
370
  )
370
371
  if (!env[returns[VALUE]]) return false
371
372
  else if (getType(env[returns[VALUE]][STATS]) === APPLY) {
372
- // ALWAYS APPLY
373
- // rest.at(-1)[0][TYPE] === APPLY
374
- // Here is upon application to store the result in the variable
375
- if (isUnknownType(env[name][STATS]))
376
- stack.unshift(() => {
377
- setTypeToReturn(
373
+ if (returns[TYPE] === WORD)
374
+ setReturnToAbbstraction(env[name][STATS])
375
+ else {
376
+ // ALWAYS APPLY
377
+ // rest.at(-1)[0][TYPE] === APPLY
378
+ // Here is upon application to store the result in the variable
379
+ if (isUnknownType(env[name][STATS]))
380
+ stack.unshift(() => {
381
+ setTypeToReturn(
382
+ env[name][STATS],
383
+ env[returns[VALUE]][STATS]
384
+ )
385
+ // env[name][STATS][TYPE_PROP][0] =
386
+ // env[returns[VALUE]][STATS][RETURNS][0]
387
+ // this seems to be able to be deleted
388
+ // env[name][STATS][TYPE_PROP][1] =
389
+ // env[returns[VALUE]][STATS][RETURNS][1]
390
+ })
391
+ else
392
+ setReturnRef(
378
393
  env[name][STATS],
379
394
  env[returns[VALUE]][STATS]
380
395
  )
381
- // env[name][STATS][TYPE_PROP][0] =
382
- // env[returns[VALUE]][STATS][RETURNS][0]
383
- // this seems to be able to be deleted
384
- // env[name][STATS][TYPE_PROP][1] =
385
- // env[returns[VALUE]][STATS][RETURNS][1]
386
- })
387
- setReturnRef(
388
- env[name][STATS],
389
- env[returns[VALUE]][STATS]
390
- )
396
+ }
391
397
  }
392
398
  break
393
399
  }
@@ -1035,7 +1041,7 @@ export const typeCheck = (ast, error = true) => {
1035
1041
  else {
1036
1042
  // ANONYMOUS LAMBDAS TYPE CHECKING
1037
1043
  const local = Object.create(env)
1038
- const lambdaName = `lambda::annonymous::${i}`
1044
+ const lambdaName = `${ANONYMOUS_FUNCTION_TYPE_PREFIX}${i}::${++scopeIndex}`
1039
1045
  check(
1040
1046
  [
1041
1047
  [APPLY, KEYWORDS.DEFINE_VARIABLE],
package/src/types.js CHANGED
@@ -19,7 +19,7 @@ export const UNKNOWN = -1
19
19
  export const COLLECTION = 3
20
20
  export const PREDICATE = 4
21
21
  export const ANY = 5
22
-
22
+ export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
23
23
  export const MAX_ARGUMENT_RETRY = 1
24
24
  export const MAX_RETRY_DEFINITION = 10
25
25
  export const toTypeNames = (type) => {
@@ -1167,18 +1167,18 @@ export const formatType = (name, env) => {
1167
1167
  ? `${isAnonymous ? '' : `(let ${name} `}(lambda ${
1168
1168
  stats[ARG_COUNT] === VARIADIC
1169
1169
  ? '... ' + STATIC_TYPES.UNKNOWN
1170
- : (stats[ARGUMENTS] ?? [])
1171
- .map(
1172
- (x, i) =>
1173
- `${
1174
- getType(x[STATS]) === APPLY
1175
- ? `${formatType(i, stats[ARGUMENTS])}`
1176
- : `${toTypeNames(getType(x[STATS]))}`
1177
- }`
1178
- )
1179
- .join(' ')
1170
+ : stats[ARGUMENTS]?.length
1171
+ ? stats[ARGUMENTS].map(
1172
+ (x, i) =>
1173
+ `${
1174
+ getType(x[STATS]) === APPLY
1175
+ ? `${formatType(i, stats[ARGUMENTS])}`
1176
+ : `${toTypeNames(getType(x[STATS]))}`
1177
+ }`
1178
+ ).join(' ') + ' '
1179
+ : ''
1180
1180
  // TODO format returned functions when type support is added
1181
- } (${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
1181
+ }(${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
1182
1182
  isAnonymous ? '' : ')'
1183
1183
  })`
1184
1184
  : `(let ${name} ${toTypeNames(getType(stats))})`