fez-lisp 1.2.44 → 1.2.45
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/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/compiler.js +8 -18
- package/src/interpreter.js +12 -37
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -118,7 +118,7 @@ const Helpers = {
|
|
118
118
|
__tco: `__tco=fn=>(...args)=>{let result=fn(...args);while(typeof result==='function')result=result();return result}`,
|
119
119
|
atom_predicate: `atom_predicate=(number)=>+(typeof number==='number')`,
|
120
120
|
lambda_predicate: `lambda_predicate=(fm)=>+(typeof fn==='function')`,
|
121
|
-
set_effect: `set_effect=(array,index,value)
|
121
|
+
set_effect: `set_effect=function(array,index,value){if(arguments.length===1){array.pop()}else{array[index] = value};return array}`,
|
122
122
|
__error: `__error=(error)=>{throw new Error(error.map((x)=>String.fromCharCode(x)).join(''))}`
|
123
123
|
}
|
124
124
|
const semiColumnEdgeCases = new Set([
|
@@ -202,9 +202,8 @@ const compile = (tree, Drill) => {
|
|
202
202
|
} else if (prefix === KEYWORDS.CACHE) {
|
203
203
|
// memoization here
|
204
204
|
const name = lispToJavaScriptVariableName(n)
|
205
|
-
const newName = name.substring(
|
205
|
+
const newName = name.substring(KEYWORDS.CACHE.length + 1)
|
206
206
|
Drill.Variables.add(name)
|
207
|
-
Drill.Variables.add(newName)
|
208
207
|
const functionArgs = Arguments.at(-1).slice(1)
|
209
208
|
const body = functionArgs.pop()
|
210
209
|
deepRenameCache(n, newName, body)
|
@@ -213,17 +212,12 @@ const compile = (tree, Drill) => {
|
|
213
212
|
const vars = FunctionDrill.Variables.size
|
214
213
|
? `var ${[...FunctionDrill.Variables].join(',')};`
|
215
214
|
: ''
|
216
|
-
return `(${name}=function(){
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
__${newName}_map.set(__key, __res)
|
223
|
-
return __res
|
224
|
-
}})
|
225
|
-
return ${newName}(...arguments)
|
226
|
-
});`
|
215
|
+
return `(${name}=function(){var __${newName}_map = new Map();var ${newName}=(function(${parseArgs(
|
216
|
+
functionArgs,
|
217
|
+
Drill
|
218
|
+
)}){${vars};var __key=[...arguments].join(',');if(__${newName}_map.has(__key)){return __${newName}_map.get(__key)}else{var __res = ${evaluatedBody
|
219
|
+
.toString()
|
220
|
+
.trim()};__${newName}_map.set(__key, __res);return __res}});return ${newName}(...arguments)});`
|
227
221
|
} else {
|
228
222
|
const name = lispToJavaScriptVariableName(n)
|
229
223
|
Drill.Variables.add(name)
|
@@ -236,10 +230,6 @@ const compile = (tree, Drill) => {
|
|
236
230
|
case KEYWORDS.IS_LAMBDA:
|
237
231
|
Drill.Helpers.add('lambda_predicate')
|
238
232
|
return `lambda_predicate(${compile(Arguments[0], Drill)});`
|
239
|
-
case KEYWORDS.NUMBER_TYPE:
|
240
|
-
return '0'
|
241
|
-
case KEYWORDS.BOOLEAN_TYPE:
|
242
|
-
return '1'
|
243
233
|
case KEYWORDS.ARRAY_TYPE:
|
244
234
|
return `[${parseArgs(Arguments, Drill)}];`
|
245
235
|
case KEYWORDS.ARRAY_LENGTH:
|
package/src/interpreter.js
CHANGED
@@ -675,11 +675,11 @@ export const keywords = {
|
|
675
675
|
// return evaluate(inp, env)
|
676
676
|
// },
|
677
677
|
[KEYWORDS.SET_ARRAY]: (args, env) => {
|
678
|
-
if (args.length !==
|
678
|
+
if (args.length !== 1 && args.length !== 3)
|
679
679
|
throw new RangeError(
|
680
680
|
`Invalid number of arguments for (${
|
681
681
|
KEYWORDS.SET_ARRAY
|
682
|
-
}) (or
|
682
|
+
}) (or 1 3) required (${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
|
683
683
|
)
|
684
684
|
const array = evaluate(args[0], env)
|
685
685
|
if (!Array.isArray(array))
|
@@ -688,31 +688,17 @@ export const keywords = {
|
|
688
688
|
KEYWORDS.ARRAY_TYPE
|
689
689
|
}) but got (${array}) (${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
|
690
690
|
)
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
`Second argument of (${KEYWORDS.SET_ARRAY}) is outside of the (${
|
701
|
-
KEYWORDS.ARRAY_TYPE
|
702
|
-
}) bounds (index ${index} bounds ${array.length}) (${
|
703
|
-
KEYWORDS.SET_ARRAY
|
704
|
-
} ${stringifyArgs(args)})`
|
705
|
-
)
|
706
|
-
if (index < 0) {
|
707
|
-
if (args.length !== 2)
|
708
|
-
throw new RangeError(
|
709
|
-
`Invalid number of arguments for (${
|
710
|
-
KEYWORDS.SET_ARRAY
|
711
|
-
}) (if (< index 0) then 2 required) (${
|
712
|
-
KEYWORDS.SET_ARRAY
|
713
|
-
} ${stringifyArgs(args)})`
|
691
|
+
if (args.length === 1) {
|
692
|
+
array.pop()
|
693
|
+
} else {
|
694
|
+
const index = evaluate(args[1], env)
|
695
|
+
if (!Number.isInteger(index) || index < 0)
|
696
|
+
throw new TypeError(
|
697
|
+
`Second argument of (${KEYWORDS.SET_ARRAY}) must be a positive (${
|
698
|
+
KEYWORDS.NUMBER_TYPE
|
699
|
+
} integer) (${index}) (${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
|
714
700
|
)
|
715
|
-
if (index
|
701
|
+
if (index > array.length)
|
716
702
|
throw new RangeError(
|
717
703
|
`Second argument of (${KEYWORDS.SET_ARRAY}) is outside of the (${
|
718
704
|
KEYWORDS.ARRAY_TYPE
|
@@ -720,17 +706,6 @@ export const keywords = {
|
|
720
706
|
KEYWORDS.SET_ARRAY
|
721
707
|
} ${stringifyArgs(args)})`
|
722
708
|
)
|
723
|
-
const target = array.length + index
|
724
|
-
while (array.length !== target) array.pop()
|
725
|
-
} else {
|
726
|
-
if (args.length !== 3)
|
727
|
-
throw new RangeError(
|
728
|
-
`Invalid number of arguments for (${
|
729
|
-
KEYWORDS.SET_ARRAY
|
730
|
-
}) (if (>= index 0) then 3 required) (${
|
731
|
-
KEYWORDS.SET_ARRAY
|
732
|
-
} ${stringifyArgs(args)})`
|
733
|
-
)
|
734
709
|
const value = evaluate(args[2], env)
|
735
710
|
if (value == undefined)
|
736
711
|
throw new RangeError(
|