fez-lisp 1.0.7 → 1.0.9
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/README.md +18 -18
- package/lib/baked/std.js +1 -1
- package/package.json +2 -2
- package/src/compiler.js +16 -3
- package/src/enums.js +1 -0
- package/src/interpreter.js +3 -3
- package/src/parser.js +2 -1
- package/src/tokeniser.js +197 -119
- package/src/utils.js +5 -5
package/package.json
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"name": "fez-lisp",
|
3
|
-
"description": "
|
3
|
+
"description": "Lisp interpreted & compiled to JavaScript",
|
4
4
|
"author": "AT290690",
|
5
|
-
"version": "1.0.
|
5
|
+
"version": "1.0.9",
|
6
6
|
"type": "module",
|
7
7
|
"main": "index.js",
|
8
8
|
"keywords": [
|
package/src/compiler.js
CHANGED
@@ -17,12 +17,20 @@ while(typeof result==='function')result=result()
|
|
17
17
|
return result
|
18
18
|
}`,
|
19
19
|
isNumber: `numberPredicate=(number)=>typeof number==='number'`,
|
20
|
-
isString: `stringPredicate=(string)=>typeof
|
20
|
+
isString: `stringPredicate=(string)=>typeof string==='string'`,
|
21
21
|
isLambda: `lambdaPredicate=(lambda)=>typeof lambda==='function'`,
|
22
22
|
isArray: `arrayPredicate=(array)=>Array.isArray(array)`,
|
23
23
|
isAtom: `atomPredicate=(value)=>typeof value==='number'||typeof value==='string'`,
|
24
24
|
error: `_error=(error)=>{
|
25
25
|
throw new Error(error)
|
26
|
+
}`,
|
27
|
+
set: `set=(array,index,value)=>{
|
28
|
+
array=[...array]
|
29
|
+
if (index < 0) {
|
30
|
+
const target = array.length + index
|
31
|
+
while (array.length !== target) array.pop()
|
32
|
+
} else array[index] = value;
|
33
|
+
return array
|
26
34
|
}`,
|
27
35
|
setArray: `setEffect=(array,index,value)=>{
|
28
36
|
if (index < 0) {
|
@@ -46,9 +54,9 @@ return result
|
|
46
54
|
case '${KEYWORDS.ANONYMOUS_FUNCTION}':
|
47
55
|
return ()=>value
|
48
56
|
case '${KEYWORDS.CHAR_CODE_TYPE}':
|
49
|
-
return String.fromCharCode(value)
|
50
|
-
case '${KEYWORDS.CHAR_TYPE}':
|
51
57
|
return value.charCodeAt(0)
|
58
|
+
case '${KEYWORDS.CHAR_TYPE}':
|
59
|
+
return String.fromCharCode(value)
|
52
60
|
default:
|
53
61
|
return 0
|
54
62
|
}
|
@@ -234,6 +242,9 @@ const compile = (tree, Variables) => {
|
|
234
242
|
: `(${parseArgs(Arguments, Variables, token)});`
|
235
243
|
: `(0);`
|
236
244
|
case KEYWORDS.ADDITION:
|
245
|
+
return Arguments.length
|
246
|
+
? `(${parseArgs(Arguments, Variables, token)});`
|
247
|
+
: `(0);`
|
237
248
|
case KEYWORDS.BITWISE_AND:
|
238
249
|
case KEYWORDS.BITWISE_OR:
|
239
250
|
case KEYWORDS.BITWISE_XOR:
|
@@ -309,6 +320,8 @@ const compile = (tree, Variables) => {
|
|
309
320
|
}
|
310
321
|
case KEYWORDS.SERIALISE:
|
311
322
|
return `_serialise(${compile(Arguments[0], Variables)});`
|
323
|
+
case KEYWORDS.SET_IMMUTABLE_ARRAY:
|
324
|
+
return `set(${parseArgs(Arguments, Variables)});`
|
312
325
|
case KEYWORDS.SET_ARRAY:
|
313
326
|
return `setEffect(${parseArgs(Arguments, Variables)});`
|
314
327
|
case KEYWORDS.NOT_COMPILED_BLOCK:
|
package/src/enums.js
CHANGED
package/src/interpreter.js
CHANGED
@@ -9,18 +9,18 @@ export const evaluate = (exp, env) => {
|
|
9
9
|
case WORD: {
|
10
10
|
const word = env[first[VALUE]]
|
11
11
|
if (word == undefined)
|
12
|
-
throw new ReferenceError(`Undefined variable ${first[VALUE]}
|
12
|
+
throw new ReferenceError(`Undefined variable ${first[VALUE]}`)
|
13
13
|
return word
|
14
14
|
}
|
15
15
|
case APPLY:
|
16
16
|
const apply = env[first[VALUE]]
|
17
17
|
if (apply == undefined)
|
18
18
|
throw new ReferenceError(
|
19
|
-
`Undefined (${KEYWORDS.ANONYMOUS_FUNCTION}) ${first[VALUE]}
|
19
|
+
`Undefined (${KEYWORDS.ANONYMOUS_FUNCTION}) ${first[VALUE]}`
|
20
20
|
)
|
21
21
|
if (typeof apply !== 'function')
|
22
22
|
throw new TypeError(
|
23
|
-
`${first[VALUE]} is not a (${KEYWORDS.ANONYMOUS_FUNCTION})
|
23
|
+
`${first[VALUE]} is not a (${KEYWORDS.ANONYMOUS_FUNCTION})`
|
24
24
|
)
|
25
25
|
return apply(rest, env)
|
26
26
|
case ATOM:
|
package/src/parser.js
CHANGED
@@ -46,7 +46,8 @@ export const parse = (source) => {
|
|
46
46
|
export const stringify = (ast) => {
|
47
47
|
if (ast == undefined) return '()'
|
48
48
|
else if (typeof ast === 'object')
|
49
|
-
if (Array.isArray(ast))
|
49
|
+
if (Array.isArray(ast))
|
50
|
+
return ast.length ? `(array ${ast.map(stringify).join(' ')})` : '()'
|
50
51
|
else
|
51
52
|
return `(array ${Object.entries(ast)
|
52
53
|
.map(([key, value]) => `("${key}" ${stringify(value)})`)
|