fez-lisp 1.1.11 → 1.1.12
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/compiler.js +1 -2
- package/src/interpreter.js +16 -10
- package/src/keywords.js +1 -1
- package/src/utils.js +5 -4
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -66,7 +66,6 @@ const lispToJavaScriptVariableName = (name) =>
|
|
66
66
|
)
|
67
67
|
)
|
68
68
|
const Helpers = {
|
69
|
-
__string: `__string=(...args)=>{const str=args.flat();str.isString=true;return str}`,
|
70
69
|
__add: `__add=(...numbers)=>{return numbers.reduce((a,b)=>a+b,0)}`,
|
71
70
|
__sub: `__sub=(...numbers)=>{return numbers.reduce((a,b)=>a-b,0)}`,
|
72
71
|
__mult: `__mult=(...numbers)=>{return numbers.reduce((a,b)=>a*b,1)}`,
|
@@ -95,6 +94,7 @@ const Helpers = {
|
|
95
94
|
return args.at(-1) ? 1 : 0
|
96
95
|
}`,
|
97
96
|
logEffect: `logEffect=(msg)=>{console.log(msg);return msg}`,
|
97
|
+
logStringEffect: `logStringEffect=(msg)=>{console.log(msg.map(x=>String.fromCharCode(x)).join(''));return msg}`,
|
98
98
|
clearEffect: `clearEffect=()=>{console.clear();return 0}`,
|
99
99
|
array_cons: `array_cons=(A, ...B)=> B.reduce((a, b) => a.concat(b), A)`,
|
100
100
|
car: 'car=(arr)=>arr.at(0)',
|
@@ -105,7 +105,6 @@ const Helpers = {
|
|
105
105
|
numberPredicate: `numberPredicate=(number)=>+(typeof number==='number')`,
|
106
106
|
lambdaPredicate: `lambdaPredicate=(lambda)=>+(typeof lambda==='function')`,
|
107
107
|
arrayPredicate: `arrayPredicate=(array)=>+Array.isArray(array)`,
|
108
|
-
error: `error=(error)=>{throw new Error(error)}`,
|
109
108
|
array_setEffect: `array_setEffect=(array,index,value)=>{if(index<0){const target=array.length+index;while(array.length!==target)array.pop()}else array[index] = value;return array}`
|
110
109
|
}
|
111
110
|
const semiColumnEdgeCases = new Set([
|
package/src/interpreter.js
CHANGED
@@ -197,11 +197,6 @@ const keywords = {
|
|
197
197
|
if (evaluate(args[i], env)) return evaluate(args[i + 1], env)
|
198
198
|
return 0
|
199
199
|
},
|
200
|
-
[KEYWORDS.STRING_TYPE]: (args, env) => {
|
201
|
-
const str = args.flatMap((x) => evaluate(x, env))
|
202
|
-
str.isString = true
|
203
|
-
return str
|
204
|
-
},
|
205
200
|
[KEYWORDS.ARRAY_TYPE]: (args, env) => {
|
206
201
|
if (!args.length) return []
|
207
202
|
const isCapacity =
|
@@ -906,15 +901,26 @@ const keywords = {
|
|
906
901
|
return array
|
907
902
|
},
|
908
903
|
[KEYWORDS.LOG]: (args, env) => {
|
909
|
-
if (
|
904
|
+
if (args.length !== 1)
|
910
905
|
throw new RangeError(
|
911
|
-
`Invalid number of arguments to (${KEYWORDS.LOG}) (
|
906
|
+
`Invalid number of arguments to (${KEYWORDS.LOG}) (= 1 required) (${
|
912
907
|
KEYWORDS.LOG
|
913
908
|
} ${stringifyArgs(args)})`
|
914
909
|
)
|
915
|
-
const
|
916
|
-
console.log(
|
917
|
-
return
|
910
|
+
const expression = evaluate(args[0], env)
|
911
|
+
console.log(expression)
|
912
|
+
return expression
|
913
|
+
},
|
914
|
+
[KEYWORDS.LOG_STRING]: (args, env) => {
|
915
|
+
if (args.length !== 1)
|
916
|
+
throw new RangeError(
|
917
|
+
`Invalid number of arguments to (${
|
918
|
+
KEYWORDS.LOG_STRING
|
919
|
+
}) (= 1 required) (${KEYWORDS.LOG_STRING} ${stringifyArgs(args)})`
|
920
|
+
)
|
921
|
+
const expression = evaluate(args[0], env)
|
922
|
+
console.log(expression.map((x) => String.fromCharCode(x)).join(''))
|
923
|
+
return expression
|
918
924
|
},
|
919
925
|
[KEYWORDS.CLEAR_CONSOLE]: (args) => {
|
920
926
|
if (args.length)
|
package/src/keywords.js
CHANGED
@@ -6,7 +6,6 @@ export const ATOM = 2
|
|
6
6
|
export const PLACEHOLDER = '.'
|
7
7
|
export const KEYWORDS = {
|
8
8
|
NUMBER_TYPE: 'number',
|
9
|
-
STRING_TYPE: 'string',
|
10
9
|
ARRAY_TYPE: 'array',
|
11
10
|
ARRAY_LENGTH: 'length',
|
12
11
|
IS_ARRAY: 'array?',
|
@@ -50,6 +49,7 @@ export const KEYWORDS = {
|
|
50
49
|
TEST_CASE: 'case',
|
51
50
|
TEST_BED: 'assert',
|
52
51
|
LOG: 'log!',
|
52
|
+
LOG_STRING: 'log-string!',
|
53
53
|
CLEAR_CONSOLE: 'clear!',
|
54
54
|
SET_ARRAY: 'array:set!',
|
55
55
|
DOC: 'fez-manual'
|
package/src/utils.js
CHANGED
@@ -12,7 +12,7 @@ export const replaceStrings = (source) => {
|
|
12
12
|
for (const q of quotes)
|
13
13
|
source = source.replaceAll(
|
14
14
|
q,
|
15
|
-
`(
|
15
|
+
`(array ${[...q]
|
16
16
|
.slice(1, -1)
|
17
17
|
.map((x) => x.charCodeAt(0))
|
18
18
|
.join(' ')})`
|
@@ -134,7 +134,7 @@ export const handleUnbalancedQuotes = (source) => {
|
|
134
134
|
}
|
135
135
|
export const removeMutation = (source) => source.replace(new RegExp(/!/g), 'ǃ')
|
136
136
|
export const treeShake = (ast, libs) => {
|
137
|
-
const deps = libs.reduce((a, x) => a.
|
137
|
+
const deps = libs.reduce((a, x) => a.set(x.at(1)[VALUE], x), new Map())
|
138
138
|
const visited = new Set()
|
139
139
|
const dfs = (tree) => {
|
140
140
|
if (!isLeaf(tree)) tree.forEach(dfs)
|
@@ -145,13 +145,14 @@ export const treeShake = (ast, libs) => {
|
|
145
145
|
) {
|
146
146
|
visited.add(tree[VALUE])
|
147
147
|
// Recursively explore the dependencies of the current node
|
148
|
-
const dependency =
|
148
|
+
const dependency = deps.get(tree[VALUE])
|
149
149
|
if (dependency) dfs(dependency.at(-1))
|
150
150
|
}
|
151
151
|
}
|
152
152
|
dfs(ast)
|
153
153
|
// Filter out libraries that are not in the visited set
|
154
|
-
return libs.filter((x) => visited.has(x.at(1)[VALUE]))
|
154
|
+
// return libs.filter((x) => visited.has(x.at(1)[VALUE]))
|
155
|
+
return [...visited].reverse().map((x) => deps.get(x))
|
155
156
|
}
|
156
157
|
export const dfs = (tree, callback) => {
|
157
158
|
if (!isLeaf(tree)) for (const leaf of tree) dfs(leaf)
|