diff --git a/libs/cyclone/foreign.sld b/libs/cyclone/foreign.sld index 9b562a9f..a136356a 100644 --- a/libs/cyclone/foreign.sld +++ b/libs/cyclone/foreign.sld @@ -32,7 +32,7 @@ (er-macro-transformer (lambda (expr rename compare) (let ((name (cadr expr)) - (type (caddr expr))) + (type (cddr expr))) (unless (eval '(with-handler (lambda X #f) *foreign-types*)) (write "no foreign type table" (current-error-port)) (newline (current-error-port)) @@ -49,18 +49,26 @@ (lambda X #f) (hash-table-ref *foreign-types* (quote ,type-arg)) ))) + (c-ret-convert #f) ) (when c-type (write `(defined c type ,c-type) (current-error-port)) (newline (current-error-port)) - (set! type-arg c-type)) + (set! type-arg (car c-type)) + (if (= 3 (length c-type)) + (set! c-ret-convert (caddr c-type)))) ;(for-each ; (lambda (arg) ; (if (not (string? arg)) ; (error "c-value" "Invalid argument: string expected, received " arg))) ; (cdr expr)) - `((lambda () (Cyc-foreign-value ,code-arg ,(symbol->string type-arg)))))))) + + (if c-ret-convert + `((lambda () (,c-ret-convert (Cyc-foreign-value ,code-arg ,(symbol->string type-arg))))) + `((lambda () (Cyc-foreign-value ,code-arg ,(symbol->string type-arg)))) + ) + )))) (define-syntax c-code (er-macro-transformer diff --git a/libs/test-foreign.scm b/libs/test-foreign.scm index b66a854b..7a00aa43 100644 --- a/libs/test-foreign.scm +++ b/libs/test-foreign.scm @@ -12,11 +12,12 @@ (define *my-global* #f) (c-define-type my-integer integer) -(c-define-type my-integer2 integer) +(c-define-type my-integer-as-string integer string->number number->string) (test-group "foreign value" (test 3 (c-value "1 + 2" integer)) (test 4 (c-value "2 + 2" my-integer)) + (test "4" (c-value "2 + 2" my-integer-as-string)) ) (test-group "foreign code"