fez-lisp 1.2.44 → 1.2.46

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.2.44",
5
+ "version": "1.2.46",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
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)=>{if(index<0){const target=array.length+index;while(array.length!==target)array.pop()}else array[index] = value;return array}`,
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(2)
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(){const __${newName}_map = new Map();
217
- var ${newName} = (function(${parseArgs(functionArgs, Drill)}){${vars};
218
- var __key = [...arguments].join(',')
219
- if (__${newName}_map.has(__key)) return __${newName}_map.get(__key)
220
- else {
221
- const __res = ${evaluatedBody.toString().trim()}
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:
@@ -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 !== 2 && args.length !== 3)
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 2 3) required (${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
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
- const index = evaluate(args[1], env)
692
- if (!Number.isInteger(index))
693
- throw new TypeError(
694
- `Second argument of (${KEYWORDS.SET_ARRAY}) must be an (${
695
- KEYWORDS.NUMBER_TYPE
696
- } integer) (${index}) (${KEYWORDS.SET_ARRAY} ${stringifyArgs(args)})`
697
- )
698
- if (index > array.length)
699
- throw new RangeError(
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 * -1 > array.length)
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(