]> gitweb.factorcode.org Git - factor.git/commitdiff
fjsc: add alien-invoke
authorchris.double <chris.double@double.co.nz>
Fri, 15 Dec 2006 06:59:47 +0000 (06:59 +0000)
committerchris.double <chris.double@double.co.nz>
Fri, 15 Dec 2006 06:59:47 +0000 (06:59 +0000)
libs/fjsc/fjsc.factor
libs/fjsc/tests.factor

index 1dccf4ba7ede86dfc5f08b116b203c39d7bc7a42..635db934adba46bd6bd7d762a0079f2df0bbe199 100644 (file)
@@ -11,6 +11,7 @@ TUPLE: ast-quotation expression ;
 TUPLE: ast-array elements ;
 TUPLE: ast-define name expression ;
 TUPLE: ast-expression values ;
+TUPLE: ast-alien return object method args ;
 
 LAZY: 'digit' ( -- parser )
   [ digit? ] satisfy [ digit> ] <@ ;
@@ -80,8 +81,16 @@ LAZY: 'array' ( -- parser )
 LAZY: 'atom' ( -- parser )
   'identifier' 'number' <|> 'string' <|> ;
 
+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> ] <@ ;
+
 LAZY: 'expression' ( -- parser )
   'define' sp 
+  'alien' sp <|>
   'atom' sp <|> 
   'quotation' sp <|> 
   'array' sp <|>
@@ -152,6 +161,20 @@ M: ast-expression (literal)
 M: ast-expression (compile)
   ast-expression-values [ (compile) ] [ ";" , ] interleave ;
 
+M: ast-alien (compile)
+  dup ast-alien-return empty? not [
+    "factor.data_stack.push(" ,
+  ] when
+  dup ast-alien-object ,       
+  "." ,
+  dup ast-alien-method ,
+  "(" ,
+  dup ast-alien-args [ drop "factor.data_stack.pop()" , ] [ "," , ] interleave 
+  ")" ,
+  ast-alien-return empty? not [
+    ")" ,
+  ] when ;
+  
 : fjsc-compile ( ast -- string )
   [
     [ (compile) ] { } make [ write ] each
index de1d73b39234e4f89b63f204d2a9fec5009d998c..11f451d133da3a8bd4752374725a3d68db72d045 100644 (file)
@@ -36,3 +36,10 @@ IN: temporary
   ": 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
+] 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
+] unit-test