fez-lisp 1.5.54 → 1.5.56

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.54",
5
+ "version": "1.5.56",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  PLACEHOLDER,
9
9
  PREDICATE_SUFFIX,
10
10
  SPECIAL_FORMS_SET,
11
+ STATIC_TYPES_SET,
11
12
  TRUE,
12
13
  TYPE,
13
14
  VALUE,
@@ -37,7 +38,7 @@ const DEFINITON_RETRY_COUNT = 1
37
38
  const toTypeNames = (type) => {
38
39
  switch (type) {
39
40
  case APPLY:
40
- return 'Application'
41
+ return 'Abstraction'
41
42
  case ATOM:
42
43
  return 'Atom'
43
44
  case UNKNOWN:
@@ -122,8 +123,8 @@ export const typeCheck = (ast) => {
122
123
  [STATS]: {
123
124
  retried: RETRY_COUNT,
124
125
  [SIGNATURE]: PLACEHOLDER,
125
- [TYPE_PROP]: [APPLY],
126
- [RETURNS]: [APPLY],
126
+ [TYPE_PROP]: [UNKNOWN],
127
+ [RETURNS]: [UNKNOWN],
127
128
  [ARGS_COUNT]: [],
128
129
  [ARGUMENTS]: [],
129
130
  [ARGS_COUNT]: 0
@@ -144,8 +145,8 @@ export const typeCheck = (ast) => {
144
145
  [STATS]: {
145
146
  retried: RETRY_COUNT,
146
147
  [SIGNATURE]: PLACEHOLDER,
147
- [TYPE_PROP]: [ATOM],
148
- [RETURNS]: [ATOM],
148
+ [TYPE_PROP]: [UNKNOWN],
149
+ [RETURNS]: [UNKNOWN],
149
150
  [ARGS_COUNT]: [],
150
151
  [ARGUMENTS]: [],
151
152
  [ARGS_COUNT]: 0
@@ -166,8 +167,8 @@ export const typeCheck = (ast) => {
166
167
  [STATS]: {
167
168
  retried: RETRY_COUNT,
168
169
  [SIGNATURE]: PLACEHOLDER,
169
- [TYPE_PROP]: [APPLY, PREDICATE],
170
- [RETURNS]: [APPLY, PREDICATE],
170
+ [TYPE_PROP]: [UNKNOWN],
171
+ [RETURNS]: [UNKNOWN],
171
172
  [ARGS_COUNT]: [],
172
173
  [ARGUMENTS]: [],
173
174
  [ARGS_COUNT]: 0
@@ -188,8 +189,8 @@ export const typeCheck = (ast) => {
188
189
  [STATS]: {
189
190
  retried: RETRY_COUNT,
190
191
  [SIGNATURE]: PLACEHOLDER,
191
- [TYPE_PROP]: [COLLECTION],
192
- [RETURNS]: [COLLECTION],
192
+ [TYPE_PROP]: [UNKNOWN],
193
+ [RETURNS]: [UNKNOWN],
193
194
  [ARGS_COUNT]: [],
194
195
  [ARGUMENTS]: [],
195
196
  [ARGS_COUNT]: 0
@@ -1233,7 +1234,7 @@ export const typeCheck = (ast) => {
1233
1234
  const [first, ...rest] = isLeaf(exp) ? [exp] : exp
1234
1235
  if (first === undefined) {
1235
1236
  throw new TypeError(
1236
- `(lambda) invocation with missing (Application) name () Provide an (Application) name as the (1) argument.`
1237
+ `(lambda) invocation with missing (Abstraction) name () Provide an (Abstraction) name as the (1) argument.`
1237
1238
  )
1238
1239
  }
1239
1240
  switch (first[TYPE]) {
@@ -1896,17 +1897,18 @@ export const typeCheck = (ast) => {
1896
1897
  }
1897
1898
 
1898
1899
  if (first[TYPE] === APPLY && isSpecial) {
1900
+ const isCast = STATIC_TYPES_SET.has(first[VALUE])
1899
1901
  const expectedArgs = env[first[VALUE]][STATS][ARGUMENTS]
1900
1902
  for (let i = 0; i < rest.length; ++i) {
1901
1903
  const PRED_TYPE = args[i][STATS][TYPE_PROP][1]
1902
1904
  const MAIN_TYPE = expectedArgs[i][STATS][TYPE_PROP][0]
1903
- if (MAIN_TYPE === UNKNOWN) continue
1905
+ if (MAIN_TYPE === UNKNOWN && !isCast) continue
1904
1906
  if (!isLeaf(rest[i])) {
1905
1907
  const CAR = rest[i][0][VALUE]
1906
1908
  const isKnown =
1907
1909
  env[CAR] &&
1908
1910
  env[CAR][STATS][RETURNS][0] !== UNKNOWN
1909
- if (isKnown) {
1911
+ if (isKnown && !isCast) {
1910
1912
  if (env[CAR][STATS][RETURNS][0] !== MAIN_TYPE) {
1911
1913
  errorStack.add(
1912
1914
  `Incorrect type of argument (${i}) for special form (${
@@ -1941,7 +1943,7 @@ export const typeCheck = (ast) => {
1941
1943
  const isKnown =
1942
1944
  env[CAR] &&
1943
1945
  env[CAR][STATS][TYPE_PROP][0] !== UNKNOWN
1944
- if (isKnown) {
1946
+ if (isKnown && !isCast) {
1945
1947
  if (
1946
1948
  MAIN_TYPE !==
1947
1949
  env[CAR][STATS][TYPE_PROP][0]
@@ -1957,7 +1959,9 @@ export const typeCheck = (ast) => {
1957
1959
  )
1958
1960
  } else if (
1959
1961
  PRED_TYPE &&
1960
- env[CAR][STATS][RETURNS][1] !== PRED_TYPE
1962
+ env[CAR][STATS][RETURNS][1] !==
1963
+ PRED_TYPE &&
1964
+ !isCast
1961
1965
  )
1962
1966
  errorStack.add(
1963
1967
  `Incorrect type of argument (${i}) for special form (${
@@ -1970,8 +1974,15 @@ export const typeCheck = (ast) => {
1970
1974
  )}) (${stringifyArgs(exp)}) (check #6)`
1971
1975
  )
1972
1976
  } else if (env[rest[i][VALUE]]) {
1973
- env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
1974
- MAIN_TYPE
1977
+ if (isCast) {
1978
+ env[rest[i][VALUE]][STATS][TYPE_PROP] =
1979
+ root[first[VALUE]][STATS][RETURNS]
1980
+ root[first[VALUE]][STATS][RETURNS] =
1981
+ root[first[VALUE]][STATS][RETURNS]
1982
+ } else {
1983
+ env[rest[i][VALUE]][STATS][TYPE_PROP][0] =
1984
+ MAIN_TYPE
1985
+ }
1975
1986
  }
1976
1987
  }
1977
1988
  break
package/src/keywords.js CHANGED
@@ -9,12 +9,13 @@ export const PLACEHOLDER = '.'
9
9
  export const MUTATION_SUFFIX = '!'
10
10
  export const PREDICATE_SUFFIX = '?'
11
11
  export const STATIC_TYPES = {
12
- APPLICATION: 'Application',
12
+ APPLICATION: 'Abstraction',
13
13
  UNKNOWN: 'Unknown',
14
14
  ATOM: 'Atom',
15
15
  COLLECTION: 'Collection',
16
16
  PREDICATE: 'Predicate'
17
17
  }
18
+ export const STATIC_TYPES_SET = new Set(Object.values(STATIC_TYPES))
18
19
  export const KEYWORDS = {
19
20
  LOOP: 'loop',
20
21
  CREATE_ARRAY: 'array',
@@ -70,7 +71,7 @@ export const DEBUG = {
70
71
  SIGNATURE: '?',
71
72
  LIST_THEMES: 'theme?',
72
73
  SET_THEME: 'theme!',
73
- TYPE_SIGNATURE: 'type?'
74
+ TYPE_SIGNATURE: 't?'
74
75
  }
75
76
 
76
77
  export const SPECIAL_FORMS_SET = new Set(
package/src/macros.js CHANGED
@@ -863,6 +863,11 @@ const iron = (scope) => {
863
863
  for (let i = 0; i < copy.length; ++i) scope[i] = copy[i]
864
864
  }
865
865
  }
866
+ export const seeIfProgramIsInvalid = (source) => {
867
+ if (source.includes('()') || source.includes(',') || source.includes(';'))
868
+ throw new SyntaxError(`Failed to parse due to invalid lisp programm near`)
869
+ return source
870
+ }
866
871
  export const replaceQuotes = (source) =>
867
872
  source
868
873
  .replaceAll(/\[/g, `(${KEYWORDS.CREATE_ARRAY} `)
package/src/parser.js CHANGED
@@ -11,10 +11,6 @@ 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
- )
18
14
  head.push(temp)
19
15
  stack.push(head)
20
16
  head = temp