TUPLE: ast-array elements ;
TUPLE: ast-define name expression ;
TUPLE: ast-expression values ;
-TUPLE: ast-alien return object method args ;
+TUPLE: ast-alien return method args ;
LAZY: 'digit' ( -- parser )
[ digit? ] satisfy [ digit> ] <@ ;
LAZY: 'alien' ( -- parser )
'array' [ ast-array-elements ast-expression-values [ ast-string-value ] map ] <@
'string' [ ast-string-value ] <@ <&>
- 'string' [ ast-string-value ] <@ <:&>
'array' [ ast-array-elements ast-expression-values [ ast-string-value ] map ] <@ <:&>
- "alien-invoke" token sp <& [ first4 <ast-alien> ] <@ ;
+ "alien-invoke" token sp <& [ first3 <ast-alien> ] <@ ;
LAZY: 'expression' ( -- parser )
'define' sp
dup ast-alien-return empty? not [
"factor.data_stack.push(" ,
] when
- dup ast-alien-object ,
- "." ,
dup ast-alien-method ,
- "(" ,
+ ".apply(" ,
+ "factor.data_stack.pop(), [" ,
dup ast-alien-args [ drop "factor.data_stack.pop()" , ] [ "," , ] interleave
- ")" ,
+ "])" ,
ast-alien-return empty? not [
")" ,
] when ;
": foo 123 \"hello\" ;" 'expression' parse car parse-result-parsed fjsc-compile
] unit-test
-{ "window.alert(factor.data_stack.pop())" } [
- "{ } \"window\" \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile
+{ "alert.apply(factor.data_stack.pop(), [factor.data_stack.pop()])" } [
+ "{ } \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile
] unit-test
-{ "factor.data_stack.push(window.alert(factor.data_stack.pop()))" } [
- "{ \"string\" } \"window\" \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile
+{ "factor.data_stack.push(alert.apply(factor.data_stack.pop(), [factor.data_stack.pop()]))" } [
+ "{ \"string\" } \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile
] unit-test