;;; big
+(external <)
+(external print)
(print (if (< 1 42)
"big"
"small"))
;;; 10
;;; 10
;;; [object Foo]
-
+(external print)
+(external-class Object ())
(define-class Foo (Object) (x y))
(define-method init ([self Foo] x)
+++ /dev/null
-;;; [class A]
-;;; [class B]
-;;; [class C]
-
-(define-class A (Object) ())
-(define-class B (Object) ())
-(define-class C (Object) ())
-(print A)
-(print B)
-(print C)
\ No newline at end of file
;;; 54
;;; 0.3333333333333333
;;; 3.2
+(external +)
+(external +.)
+(external -)
+(external *)
+(external /)
+(external print)
(print (+ -1 2))
(print (- 4 (+ 1 2)))
;;
;; expect output:
;;; Hello,world!!
+(external print)
(print "Hello,world!!")
\ No newline at end of file
;;; 3
;;; 2
+(external +)
+(external print)
+
(let ((inc (lambda (x) (+ 1 x))))
(print (inc 2)))
;;; inner scope: 10
;;; outer scope: 42
+(external print)
+
(let ((x 42))
(let ((x 10))
(print "inner scope:" x))
;;; 1
;;; 2
;;; 3
+(external-class Object ())
(define-class List (Object) ())
(define-class Cons (List) (head tail))
;;; true
;;; false
;;; 42.5
+(external print)
(print 42)
(print "Thanks for all the fish")
(print #t)
;;; 3628800
;;; 3628800
+(external *)
+(external +)
+(external -)
+(external print)
+(external =)
+(external <=)
+
+
;; check if not recursion
(let ([f (lambda (n) (print "not rec"))])
(let ([f (lambda (n) (if (= n 0)
;;; 42
;;; 10
;;; 1
+(external-class Object ())
+(external print)
(define-class Foo (Object) (x y z))
(define foo (new Foo))
let to_string =
function
- #Ast.stmt as stmt ->
- Ast.to_string_stmt stmt
+ | #BindCheck.stmt as stmt ->
+ BindCheck.to_string_stmt stmt
| `DefineClass (name,super,attrs) ->
Printf.sprintf "Class (%s,%s,%s)"
(Node.to_string id name)
Printf.sprintf "Metod (%s,((%s %s) %s),%s)"
(show f) (show self) (show klass)
(string_of_list (List.map show args)) (Ast.to_string body)
- | _ ->
- ""
+
eq_ident obj obj' &&
(List.for_all2 eq_ident args args') &&
eq_expr body body'
+
+ | `External name , `External name' ->
+ eq_ident name name'
+ | `ExternalClass ({value=name},methods), `ExternalClass ({value=name'},methods') ->
+ name = name' && List.for_all2 eq_ident methods methods'
| a,b ->
eq_stmt a b
trans [define_class "Foo" ("bar","Baz") [];
define_method "f" "self" "Foo" ["x"] (int 42);
`Expr (`Call [var "f";var "obj";int 10])]);
+ "invoke" >::
+ (fun () ->
+ ok [`ExternalClass (node ("","Foo"),[node "f"]);
+ `Expr (`Invoke (var "obj",node "f",[int 10]))] @@
+ trans [`ExternalClass (node ("","Foo"),[node "f"]);
+ `Expr (`Call [var "f";var "obj";int 10])]);
"invoke deep" >::
(fun () ->
ok [`Expr (`If (`Invoke (var "obj",node "f",[int 10]),
ok [`Define (node "f",`Lambda ([node "x"],
`Block [int 42]))]
"(define (f x) 42)");
+ "external" >::
+ (fun () ->
+ ok [`External (node "x")] "(external x)");
+ "external-class" >::
+ (fun () ->
+ ok [`ExternalClass (node ("","X"),[node "f"; node "g"; node "h"])]
+ "(external-class X (f g h))");
"bug()" >::
(fun () ->
ok [`Expr (int 10);