(cont.next)(world);
});
+factor.words["alien-invoke"] = new Word("alien-invoke", "primitive", function(world, next) {
+ var stack = world.data_stack.stack;
+ var arg_types = stack.pop();
+ var method_name = stack.pop();
+ var library_name = stack.pop();
+ var return_values = stack.pop();
+ var obj = stack.pop();
+ var args = [ ];
+ for(var i = 0; i < arg_types.length; ++i) {
+ args[i] = stack.pop();
+ }
+ var v = obj[method_name].apply(obj, args);
+ if(return_values.length > 0)
+ stack.push(v);
+ next(world);
+});
+
Factor.prototype.define_word = function(name, source, func, world, next) {
factor.words[name] = new Word(name, source, function(world, next) {
var old = world.next;
TUPLE: ast-define name stack-effect expression ;
TUPLE: ast-expression values ;
TUPLE: ast-word value ;
-TUPLE: ast-alien return method args ;
TUPLE: ast-comment ;
TUPLE: ast-stack-effect in out ;
LAZY: 'string' ( -- parser )
'quote' sp [
CHAR: " = not
- ] satisfy <+> [ >string <ast-string> ] <@ &> 'quote' <& ;
+ ] satisfy <*> [ >string <ast-string> ] <@ &> 'quote' <& ;
: identifier-middle? ( ch -- bool )
[ blank? not ] keep
LAZY: 'atom' ( -- parser )
'identifier' 'number' <|> 'string' <|> ;
-LAZY: 'alien' ( -- parser )
- 'array' [ ast-array-elements ] <@
- 'string' [ ast-string-value ] <@ <&>
- 'array' [ ast-array-elements ] <@ <:&>
- "alien-invoke" token sp <& [ first3 <ast-alien> ] <@ ;
-
LAZY: 'comment' ( -- parser )
"#!" token sp
"!" token sp <|> [
LAZY: 'expression' ( -- parser )
'comment'
- 'alien' sp <|>
'quotation' sp <|>
'array' sp <|>
'define' sp <|>
M: ast-expression (compile)
ast-expression-values do-expressions ;
-M: ast-alien (compile)
- "world.call_alien(" ,
- dup ast-alien-return empty? not [
- "true," ,
- ] [
- "false," ,
- ] if
- dup ast-alien-method "\"" , , "\"," ,
- "factor.data_stack.stack.pop(), [" ,
- ast-alien-args [ drop "factor.data_stack.stack.pop()" , ] [ "," , ] interleave
- "],world," , ;
-
M: ast-word (literal)
"factor.words[\"" ,
ast-word-value ,
'expression' parse car parse-result-parsed ;
M: quotation fjsc-parse ( object -- ast )
- (parse-factor-quotation) ;
+ (parse-factor-quotation) <ast-expression> ;
: fjsc-compile ( ast -- string )
[