fez-lisp 1.5.94 → 1.5.98

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/src/evaluator.js CHANGED
@@ -13,10 +13,8 @@ export const evaluate = (exp, env = keywords) => {
13
13
  switch (head[TYPE]) {
14
14
  case WORD: {
15
15
  const word = env[value]
16
- if (word == undefined) {
16
+ if (word == undefined)
17
17
  throw new ReferenceError(`Accessing undefined variable ${value}`)
18
- }
19
-
20
18
  return word
21
19
  }
22
20
  case APPLY: {
package/src/types.js CHANGED
@@ -5,8 +5,10 @@ import {
5
5
  DEBUG,
6
6
  KEYWORDS,
7
7
  PLACEHOLDER,
8
- STATIC_TYPES
8
+ STATIC_TYPES,
9
+ VALUE
9
10
  } from './keywords.js'
11
+ import { stringifyArgs } from './utils.js'
10
12
  export const ARG_COUNT = 'argumentsN'
11
13
  export const VARIADIC = Infinity
12
14
  export const STATS = '__stats__'
@@ -19,7 +21,7 @@ export const UNKNOWN = -1
19
21
  export const COLLECTION = 3
20
22
  export const PREDICATE = 4
21
23
  export const ANY = 5
22
-
24
+ export const ANONYMOUS_FUNCTION_TYPE_PREFIX = 'lambda::annonymous::'
23
25
  export const MAX_ARGUMENT_RETRY = 1
24
26
  export const MAX_RETRY_DEFINITION = 10
25
27
  export const toTypeNames = (type) => {
@@ -29,7 +31,6 @@ export const toTypeNames = (type) => {
29
31
  case ATOM:
30
32
  return 'Atom'
31
33
  case UNKNOWN:
32
- // case ANY:
33
34
  return 'Unknown'
34
35
  case PREDICATE:
35
36
  return 'Predicate'
@@ -44,10 +45,10 @@ export const toTypeNames = (type) => {
44
45
  export const SPECIAL_FORM_TYPES = {
45
46
  [SCOPE_NAME]: ';',
46
47
  // [ORDER]: 0,
47
- [toTypeNames(APPLY)]: {
48
+ [STATIC_TYPES.ABSTRACTION]: {
48
49
  [STATS]: {
49
50
  [TYPE_PROP]: [APPLY],
50
- [SIGNATURE]: toTypeNames(APPLY),
51
+ [SIGNATURE]: STATIC_TYPES.ABSTRACTION,
51
52
  retried: Infinity,
52
53
  [ARG_COUNT]: 1,
53
54
  [ARGUMENTS]: [
@@ -66,10 +67,10 @@ export const SPECIAL_FORM_TYPES = {
66
67
  [RETURNS]: [APPLY]
67
68
  }
68
69
  },
69
- [toTypeNames(ATOM)]: {
70
+ [STATIC_TYPES.ATOM]: {
70
71
  [STATS]: {
71
72
  [TYPE_PROP]: [APPLY],
72
- [SIGNATURE]: toTypeNames(ATOM),
73
+ [SIGNATURE]: STATIC_TYPES.ATOM,
73
74
  retried: Infinity,
74
75
  [ARG_COUNT]: 1,
75
76
  [ARGUMENTS]: [
@@ -88,10 +89,10 @@ export const SPECIAL_FORM_TYPES = {
88
89
  [RETURNS]: [ATOM]
89
90
  }
90
91
  },
91
- [toTypeNames(PREDICATE)]: {
92
+ [STATIC_TYPES.PREDICATE]: {
92
93
  [STATS]: {
93
94
  [TYPE_PROP]: [APPLY, PREDICATE],
94
- [SIGNATURE]: toTypeNames(PREDICATE),
95
+ [SIGNATURE]: STATIC_TYPES.PREDICATE,
95
96
  retried: Infinity,
96
97
  [ARG_COUNT]: 1,
97
98
  [ARGUMENTS]: [
@@ -110,10 +111,10 @@ export const SPECIAL_FORM_TYPES = {
110
111
  [RETURNS]: [ATOM, PREDICATE]
111
112
  }
112
113
  },
113
- [toTypeNames(COLLECTION)]: {
114
+ [STATIC_TYPES.COLLECTION]: {
114
115
  [STATS]: {
115
116
  [TYPE_PROP]: [APPLY],
116
- [SIGNATURE]: toTypeNames(COLLECTION),
117
+ [SIGNATURE]: STATIC_TYPES.COLLECTION,
117
118
  retried: Infinity,
118
119
  [ARG_COUNT]: 1,
119
120
  [ARGUMENTS]: [
@@ -132,10 +133,10 @@ export const SPECIAL_FORM_TYPES = {
132
133
  [RETURNS]: [COLLECTION]
133
134
  }
134
135
  },
135
- [toTypeNames(UNKNOWN)]: {
136
+ [STATIC_TYPES.UNKNOWN]: {
136
137
  [STATS]: {
137
138
  [TYPE_PROP]: [APPLY],
138
- [SIGNATURE]: toTypeNames(UNKNOWN),
139
+ [SIGNATURE]: STATIC_TYPES.UNKNOWN,
139
140
  retried: Infinity,
140
141
  [ARG_COUNT]: 1,
141
142
  [ARGUMENTS]: [
@@ -154,6 +155,28 @@ export const SPECIAL_FORM_TYPES = {
154
155
  [RETURNS]: [UNKNOWN]
155
156
  }
156
157
  },
158
+ [STATIC_TYPES.ANY]: {
159
+ [STATS]: {
160
+ [TYPE_PROP]: [APPLY],
161
+ [SIGNATURE]: STATIC_TYPES.ANY,
162
+ retried: Infinity,
163
+ [ARG_COUNT]: 1,
164
+ [ARGUMENTS]: [
165
+ {
166
+ [STATS]: {
167
+ retried: Infinity,
168
+ [SIGNATURE]: PLACEHOLDER,
169
+ [TYPE_PROP]: [UNKNOWN],
170
+ [RETURNS]: [UNKNOWN],
171
+
172
+ [ARGUMENTS]: [],
173
+ [ARG_COUNT]: 0
174
+ }
175
+ }
176
+ ],
177
+ [RETURNS]: [ANY]
178
+ }
179
+ },
157
180
  [DEBUG.LOG]: {
158
181
  [STATS]: {
159
182
  [TYPE_PROP]: [APPLY],
@@ -1167,20 +1190,41 @@ export const formatType = (name, env) => {
1167
1190
  ? `${isAnonymous ? '' : `(let ${name} `}(lambda ${
1168
1191
  stats[ARG_COUNT] === VARIADIC
1169
1192
  ? '... ' + 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(' ')
1193
+ : stats[ARGUMENTS]?.length
1194
+ ? stats[ARGUMENTS].map(
1195
+ (x, i) =>
1196
+ `${
1197
+ getType(x[STATS]) === APPLY
1198
+ ? `${formatType(i, stats[ARGUMENTS])}`
1199
+ : `${toTypeNames(getType(x[STATS]))}`
1200
+ }`
1201
+ ).join(' ') + ' '
1202
+ : ''
1180
1203
  // TODO format returned functions when type support is added
1181
- } (${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
1204
+ }(${KEYWORDS.BLOCK} ${toTypeNames(getReturn(stats))})${
1182
1205
  isAnonymous ? '' : ')'
1183
1206
  })`
1184
1207
  : `(let ${name} ${toTypeNames(getType(stats))})`
1185
1208
  : name
1186
1209
  }
1210
+
1211
+ export const validateLambda = (exp, name) => {
1212
+ if (exp.length === 1)
1213
+ throw new TypeError(
1214
+ `Incorrect number of arguments for (${
1215
+ KEYWORDS.ANONYMOUS_FUNCTION
1216
+ }). Expected at least 1 (the lambda body) but got 1 (${stringifyArgs(
1217
+ exp
1218
+ )})`
1219
+ )
1220
+ if (name)
1221
+ for (let i = 0; i < exp.length - 1; ++i)
1222
+ if (exp[i][VALUE] === name)
1223
+ throw new TypeError(
1224
+ `Arguments of (${
1225
+ KEYWORDS.ANONYMOUS_FUNCTION
1226
+ }) Should not have the same name as they were declared (${stringifyArgs(
1227
+ exp
1228
+ )})`
1229
+ )
1230
+ }