fez-lisp 1.1.23 → 1.1.24
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 +6 -2
- package/src/interpreter.js +40 -1
- package/src/keywords.js +1 -1
- package/src/utils.js +0 -4
package/package.json
CHANGED
package/src/compiler.js
CHANGED
@@ -223,14 +223,18 @@ const compile = (tree, Drill) => {
|
|
223
223
|
const vars = InnerDrills.Variables.size
|
224
224
|
? `var ${[...InnerDrills.Variables].join(',')};`
|
225
225
|
: ''
|
226
|
-
|
226
|
+
const args = parseArgs(
|
227
227
|
functionArgs.map((node, index) =>
|
228
228
|
node[VALUE] === PLACEHOLDER
|
229
229
|
? leaf(node[TYPE], `_${index}`)
|
230
230
|
: leaf(node[TYPE], node[VALUE])
|
231
231
|
),
|
232
232
|
InnerDrills
|
233
|
-
)
|
233
|
+
)
|
234
|
+
// const $ = [${args}];
|
235
|
+
return `((${args})=>{${vars}return ${evaluatedBody
|
236
|
+
.toString()
|
237
|
+
.trimStart()}});`
|
234
238
|
}
|
235
239
|
case KEYWORDS.AND:
|
236
240
|
return `((${parseArgs(Arguments, Drill, '&&')}) ? 1 : 0);`
|
package/src/interpreter.js
CHANGED
@@ -317,9 +317,11 @@ const keywords = {
|
|
317
317
|
} ${stringifyArgs(args)})`
|
318
318
|
)
|
319
319
|
const localEnv = Object.create(env)
|
320
|
+
// localEnv[KEYWORDS.BLOCK] = block[KEYWORDS.BLOCK]
|
320
321
|
for (let i = 0; i < props.length; ++i) {
|
322
|
+
const value = evaluate(props[i], scope)
|
321
323
|
Object.defineProperty(localEnv, params[i][VALUE], {
|
322
|
-
value
|
324
|
+
value,
|
323
325
|
writable: true
|
324
326
|
})
|
325
327
|
}
|
@@ -902,7 +904,16 @@ keywords[KEYWORDS.DOC] = (args, env) => {
|
|
902
904
|
.map((x) => `(${x.join(' ')})`)
|
903
905
|
}
|
904
906
|
}
|
907
|
+
|
905
908
|
export const deSuggar = (ast) => {
|
909
|
+
if (ast.length === 0)
|
910
|
+
throw new SyntaxError(
|
911
|
+
`Top level ${KEYWORDS.NUMBER_TYPE} need to be wrapped in a (${KEYWORDS.IDENTITY})`
|
912
|
+
)
|
913
|
+
// for (const node of ast)
|
914
|
+
// if (node[0] && node[0][TYPE] === APPLY && node[0][VALUE] === KEYWORDS.BLOCK)
|
915
|
+
// throw new SyntaxError(`Top level (${KEYWORDS.BLOCK}) is not allowed`)
|
916
|
+
let prev = undefined
|
906
917
|
const evaluate = (exp) => {
|
907
918
|
const [first, ...rest] = isLeaf(exp) ? [exp] : exp
|
908
919
|
if (first != undefined) {
|
@@ -914,6 +925,33 @@ export const deSuggar = (ast) => {
|
|
914
925
|
case APPLY:
|
915
926
|
{
|
916
927
|
switch (first[VALUE]) {
|
928
|
+
case KEYWORDS.BLOCK:
|
929
|
+
{
|
930
|
+
if (
|
931
|
+
prev == undefined ||
|
932
|
+
(prev &&
|
933
|
+
prev[TYPE] === APPLY &&
|
934
|
+
prev[VALUE] !== KEYWORDS.ANONYMOUS_FUNCTION)
|
935
|
+
)
|
936
|
+
throw new SyntaxError(
|
937
|
+
`Can only use (${KEYWORDS.BLOCK}) as a body of a (${KEYWORDS.ANONYMOUS_FUNCTION})`
|
938
|
+
)
|
939
|
+
}
|
940
|
+
break
|
941
|
+
// case KEYWORDS.DEFINE_VARIABLE:
|
942
|
+
// {
|
943
|
+
// if (
|
944
|
+
// rest[1] &&
|
945
|
+
// rest[1][0] &&
|
946
|
+
// rest[1][0][TYPE] === APPLY &&
|
947
|
+
// rest[1][0][VALUE] === KEYWORDS.BLOCK
|
948
|
+
// ) {
|
949
|
+
// throw new SyntaxError(
|
950
|
+
// `Can't use (${KEYWORDS.BLOCK}) in (${KEYWORDS.DEFINE_VARIABLE})`
|
951
|
+
// )
|
952
|
+
// }
|
953
|
+
// }
|
954
|
+
break
|
917
955
|
case KEYWORDS.PIPE:
|
918
956
|
{
|
919
957
|
if (rest.length < 1)
|
@@ -957,6 +995,7 @@ export const deSuggar = (ast) => {
|
|
957
995
|
}
|
958
996
|
break
|
959
997
|
}
|
998
|
+
prev = first
|
960
999
|
}
|
961
1000
|
break
|
962
1001
|
default:
|
package/src/keywords.js
CHANGED
@@ -5,9 +5,9 @@ export const WORD = 1
|
|
5
5
|
export const ATOM = 2
|
6
6
|
export const PLACEHOLDER = '.'
|
7
7
|
export const KEYWORDS = {
|
8
|
-
RECURSION: 'rec',
|
9
8
|
NUMBER_TYPE: 'number',
|
10
9
|
ARRAY_TYPE: 'array',
|
10
|
+
IDENTITY: 'identity',
|
11
11
|
ARRAY_LENGTH: 'length',
|
12
12
|
IS_ATOM: 'atom?',
|
13
13
|
ADDITION: '+',
|
package/src/utils.js
CHANGED
@@ -233,10 +233,6 @@ export const fez = (source, options = {}) => {
|
|
233
233
|
if (!options.mutation) code = removeMutation(code)
|
234
234
|
if (!code.length && options.throw) throw new Error('Nothing to parse!')
|
235
235
|
const parsed = deSuggar(LISP.parse(code))
|
236
|
-
if (parsed.length === 0 && options.throw)
|
237
|
-
throw new Error(
|
238
|
-
'Top level expressions need to be wrapped in a (do) block'
|
239
|
-
)
|
240
236
|
const ast = [...treeShake(parsed, std), ...parsed]
|
241
237
|
// if (options.check) typeCheck(ast)
|
242
238
|
if (options.compile) {
|