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 +1 -1
- package/src/check.js +27 -16
- package/src/keywords.js +3 -2
- package/src/macros.js +5 -0
- package/src/parser.js +0 -4
package/package.json
CHANGED
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 '
|
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]: [
|
126
|
-
[RETURNS]: [
|
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]: [
|
148
|
-
[RETURNS]: [
|
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]: [
|
170
|
-
[RETURNS]: [
|
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]: [
|
192
|
-
[RETURNS]: [
|
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 (
|
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] !==
|
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
|
-
|
1974
|
-
|
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: '
|
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: '
|
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
|