diff --git a/test-foreign.scm b/test-foreign.scm index ebf5d46e..9185c5d1 100644 --- a/test-foreign.scm +++ b/test-foreign.scm @@ -15,43 +15,53 @@ (cdr expr)) `(Cyc-foreign-code ,@(cdr expr))))) -(pretty-print -( -;(define-syntax define-foreign-code -; (er-macro-transformer +;(pretty-print +;( +(define-syntax define-foreign-code + (er-macro-transformer (lambda (expr rename compare) (let* ((scm-fnc (cadr expr)) (c-fnc (cadddr expr)) (rv-type (caddr expr)) (arg-types (cddddr expr)) - (arg-syms + (arg-syms/unbox (map (lambda (type) - (mangle (gensym type))) + (let ((var (mangle (gensym 'arg)))) + (cons var (string-append "string_str(" var ")")))) arg-types)) - (arg-strings - (map - (lambda (sym) - (string-append " object " sym) - ) - arg-syms)) + ;(arg-strings + ; (map + ; (lambda (sym) + ; (string-append " object " sym) + ; ) + ; arg-syms)) ; TODO: append mangled args to other args ; cyclone> (string-join '("a" "b" "c") ",") ; "a,b,c" - (args "(void *data, int argc, closure _, object k)") + (args (string-append + "(void *data, int argc, closure _, object k " + (apply string-append + (map + (lambda (sym/unbox) + (string-append "," (car sym/unbox))) + arg-syms/unbox)) + ")")) (body ;; TODO: need to unbox all args, pass to C function, then box up the result (string-append - "return_closcall1(data, k, obj_int2obj(" "str" "));")) + "return_closcall1(data, k, obj_int2obj(" c-fnc "(" (string-join (map cdr arg-syms/unbox) ",") ")));")) ) `((define-c ,scm-fnc ,args ,body) ))) - '(define-foreign-lambda scm-strlen int "strlen" string dummy dummy) - list - list) +; '(define-foreign-lambda scm-strlen int "strlen" string) +; list +; list) ) +(define-foreign-lambda scm-strlen int "strlen" string) +(display (scm-strlen "testing 1, 2, 3")) (newline) ;(define-c foreign-value