fez-lisp 1.2.11 → 1.2.13
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 +3 -3
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/compiler.js +4 -0
- package/src/interpreter.js +27 -18
- package/src/keywords.js +1 -2
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -107,6 +107,7 @@ const Helpers = {
|
|
107
107
|
length: 'length=(arr)=>arr.length',
|
108
108
|
__tco: `__tco=fn=>(...args)=>{let result=fn(...args);while(typeof result==='function')result=result();return result}`,
|
109
109
|
atomPredicate: `atomPredicate=(number)=>+(typeof number==='number')`,
|
110
|
+
lambdaPredicate: `lambdaPredicate=(fm)=>+(typeof fn==='function')`,
|
110
111
|
setEffect: `setEffect=(array,index,value)=>{if(index<0){const target=array.length+index;while(array.length!==target)array.pop()}else array[index] = value;return array}`
|
111
112
|
}
|
112
113
|
const semiColumnEdgeCases = new Set([
|
@@ -191,6 +192,9 @@ const compile = (tree, Drill) => {
|
|
191
192
|
case KEYWORDS.IS_ATOM:
|
192
193
|
Drill.Helpers.add('atomPredicate')
|
193
194
|
return `atomPredicate(${compile(Arguments[0], Drill)});`
|
195
|
+
case KEYWORDS.IS_LAMBDA:
|
196
|
+
Drill.Helpers.add('lambdaPredicate')
|
197
|
+
return `lambdaPredicate(${compile(Arguments[0], Drill)});`
|
194
198
|
case KEYWORDS.NUMBER_TYPE:
|
195
199
|
return '0'
|
196
200
|
case KEYWORDS.BOOLEAN_TYPE:
|
package/src/interpreter.js
CHANGED
@@ -101,6 +101,15 @@ const keywords = {
|
|
101
101
|
)
|
102
102
|
return +(typeof evaluate(args[0], env) === 'number')
|
103
103
|
},
|
104
|
+
[KEYWORDS.IS_LAMBDA]: (args, env) => {
|
105
|
+
if (args.length !== 1)
|
106
|
+
throw new RangeError(
|
107
|
+
`Invalid number of arguments for (${
|
108
|
+
KEYWORDS.IS_LAMBDA
|
109
|
+
}) (= 1 required) (${KEYWORDS.IS_LAMBDA} ${stringifyArgs(args)})`
|
110
|
+
)
|
111
|
+
return +(typeof evaluate(args[0], env) === 'function')
|
112
|
+
},
|
104
113
|
[KEYWORDS.ADDITION]: (args, env) => {
|
105
114
|
if (args.length < 2)
|
106
115
|
throw new RangeError(
|
@@ -180,6 +189,14 @@ const keywords = {
|
|
180
189
|
KEYWORDS.CONDITION
|
181
190
|
} ${stringifyArgs(args)})`
|
182
191
|
)
|
192
|
+
if (args.length % 2 !== 0)
|
193
|
+
throw new RangeError(
|
194
|
+
`Invalid number of arguments for (${
|
195
|
+
KEYWORDS.CONDITION
|
196
|
+
}), expected even number of arguments but got ${args.length} (${
|
197
|
+
KEYWORDS.CONDITION
|
198
|
+
} ${stringifyArgs(args)})`
|
199
|
+
)
|
183
200
|
for (let i = 0; i < args.length; i += 2) {
|
184
201
|
const condition = evaluate(args[i], env)
|
185
202
|
if (condition !== FALSE && condition !== TRUE)
|
@@ -802,18 +819,6 @@ export const deSuggar = (ast) => {
|
|
802
819
|
case APPLY:
|
803
820
|
{
|
804
821
|
switch (first[VALUE]) {
|
805
|
-
case KEYWORDS.BODY:
|
806
|
-
{
|
807
|
-
exp[0][1] = KEYWORDS.CALL_FUNCTION
|
808
|
-
exp[0][0] = APPLY
|
809
|
-
exp.length = 1
|
810
|
-
exp[1] = [
|
811
|
-
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
812
|
-
[[APPLY, KEYWORDS.BLOCK], ...rest]
|
813
|
-
]
|
814
|
-
deSuggar(exp)
|
815
|
-
}
|
816
|
-
break
|
817
822
|
case KEYWORDS.BLOCK:
|
818
823
|
{
|
819
824
|
if (
|
@@ -821,12 +826,16 @@ export const deSuggar = (ast) => {
|
|
821
826
|
(prev &&
|
822
827
|
prev[TYPE] === APPLY &&
|
823
828
|
prev[VALUE] !== KEYWORDS.ANONYMOUS_FUNCTION)
|
824
|
-
)
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
829
|
+
) {
|
830
|
+
exp[0][1] = KEYWORDS.CALL_FUNCTION
|
831
|
+
exp[0][0] = APPLY
|
832
|
+
exp.length = 1
|
833
|
+
exp[1] = [
|
834
|
+
[APPLY, KEYWORDS.ANONYMOUS_FUNCTION],
|
835
|
+
[[APPLY, KEYWORDS.BLOCK], ...rest]
|
836
|
+
]
|
837
|
+
deSuggar(exp)
|
838
|
+
}
|
830
839
|
}
|
831
840
|
break
|
832
841
|
// case KEYWORDS.DEFINE_VARIABLE:
|
package/src/keywords.js
CHANGED
@@ -14,6 +14,7 @@ export const KEYWORDS = {
|
|
14
14
|
IDENTITY: 'identity',
|
15
15
|
ARRAY_LENGTH: 'length',
|
16
16
|
IS_ATOM: 'atom?',
|
17
|
+
IS_LAMBDA: 'lambda?',
|
17
18
|
ADDITION: '+',
|
18
19
|
SUBTRACTION: '-',
|
19
20
|
MULTIPLICATION: '*',
|
@@ -28,7 +29,6 @@ export const KEYWORDS = {
|
|
28
29
|
BITWISE_UNSIGNED_RIGHT_SHIFT: '>>>',
|
29
30
|
GET_ARRAY: 'get',
|
30
31
|
BLOCK: 'do',
|
31
|
-
BODY: 'block',
|
32
32
|
ANONYMOUS_FUNCTION: 'lambda',
|
33
33
|
IF: 'if',
|
34
34
|
UNLESS: 'unless',
|
@@ -54,7 +54,6 @@ export const KEYWORDS = {
|
|
54
54
|
CLEAR_CONSOLE: 'clear!'
|
55
55
|
}
|
56
56
|
|
57
|
-
|
58
57
|
export const TYPES = {
|
59
58
|
[APPLY]: 'APPLY',
|
60
59
|
[WORD]: 'WORD',
|