This commit is contained in:
Justin Ethier 2020-04-17 20:01:06 -04:00
parent dfde2007b8
commit 7c2da7b4fd

View file

@ -1,4 +1,7 @@
(import (scheme base) (scheme write)) (import
(scheme base)
(scheme write)
(scheme cyclone pretty-print))
(define-syntax foreign-code (define-syntax foreign-code
(er-macro-transformer (er-macro-transformer
@ -10,23 +13,41 @@
(cdr expr)) (cdr expr))
`(Cyc-foreign-code ,@(cdr expr))))) `(Cyc-foreign-code ,@(cdr expr)))))
(define-syntax define-foreign-code (pretty-print
(er-macro-transformer (
;(define-syntax define-foreign-code
; (er-macro-transformer
(lambda (expr rename compare) (lambda (expr rename compare)
(let* ((scm-fnc (cadr expr)) (let* ((scm-fnc (cadr expr))
(c-fnc (cadddr expr)) (c-fnc (cadddr expr))
(rv-type (caddr expr)) (rv-type (caddr expr))
(arg-types (cddddr expr)) (arg-types (cddddr expr))
; (str (symbol->string sym)) (arg-syms (map gensym arg-types)) ;; TODO: need mangled strings, no syms!!!
; (lib_fnc_str (string-append "_" str)) (arg-mangled "TODO") ;; TODO: convert above
; (lib_fnc (string->symbol lib_fnc_str)) ;; Internal library function (arg-strings
; (args "(void *data, int argc, closure _, object k)") (map
; (body (lambda (sym)
; (string-append (string-append " object " sym)
; "return_closcall1(data, k, obj_int2obj(" str "));"))
) )
`((define-c ,lib_fnc ,args ,body) 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)")
(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" "));"))
)
`((define-c ,scm-fnc ,args ,body)
)))
'(define-foreign-lambda scm-strlen int "strlen" string dummy dummy)
list
list)
)
(newline)
;(define-c foreign-value ;(define-c foreign-value
; "(void *data, int argc, closure _, object k, object code, object type)" ; "(void *data, int argc, closure _, object k, object code, object type)"
@ -34,7 +55,7 @@
; return_closcall1(data, k, obj_int2obj(code ; return_closcall1(data, k, obj_int2obj(code
; ") ; ")
(define-foreign-lambda scm-strlen int "strlen" string) ;(define-foreign-lambda scm-strlen int "strlen" string)
;(write (Cyc-foreign-value "errno" "3")) ;(write (Cyc-foreign-value "errno" "3"))
;(newline) ;(newline)