mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-09 22:17:33 +02:00
Added c-define-type
This commit is contained in:
parent
8fef2ec1ab
commit
4a6919e153
2 changed files with 31 additions and 1 deletions
|
@ -9,7 +9,8 @@
|
||||||
(define-library (cyclone foreign)
|
(define-library (cyclone foreign)
|
||||||
(import
|
(import
|
||||||
(scheme base)
|
(scheme base)
|
||||||
;(scheme write) ;; TODO: debugging only!
|
(scheme eval)
|
||||||
|
(scheme write) ;; TODO: debugging only!
|
||||||
;(scheme cyclone pretty-print)
|
;(scheme cyclone pretty-print)
|
||||||
(scheme cyclone util)
|
(scheme cyclone util)
|
||||||
)
|
)
|
||||||
|
@ -20,15 +21,40 @@
|
||||||
c-define
|
c-define
|
||||||
c->scm
|
c->scm
|
||||||
scm->c
|
scm->c
|
||||||
|
c-define-type
|
||||||
)
|
)
|
||||||
(begin
|
(begin
|
||||||
|
;;
|
||||||
|
;;(eval `(define *foreign-types* (list)))
|
||||||
|
|
||||||
|
;; (c-define-type name type (pack (unpack)))
|
||||||
|
(define-syntax c-define-type
|
||||||
|
(er-macro-transformer
|
||||||
|
(lambda (expr rename compare)
|
||||||
|
(let ((name (cadr expr))
|
||||||
|
(type (caddr expr)))
|
||||||
|
(unless (eval '(with-handler (lambda X #f) *foreign-types*))
|
||||||
|
(write "no foreign type table" (current-error-port))
|
||||||
|
(newline (current-error-port))
|
||||||
|
(eval `(define *foreign-types* (make-hash-table))))
|
||||||
|
(eval `(hash-table-set! *foreign-types* (quote ,name) (quote ,type)))
|
||||||
|
#f))))
|
||||||
|
|
||||||
(define-syntax c-value
|
(define-syntax c-value
|
||||||
(er-macro-transformer
|
(er-macro-transformer
|
||||||
(lambda (expr rename compare)
|
(lambda (expr rename compare)
|
||||||
(let* ((code-arg (cadr expr))
|
(let* ((code-arg (cadr expr))
|
||||||
(type-arg (caddr expr))
|
(type-arg (caddr expr))
|
||||||
|
(c-type (eval `(with-handler
|
||||||
|
(lambda X #f)
|
||||||
|
(hash-table-ref *foreign-types* (quote ,type-arg))
|
||||||
|
)))
|
||||||
)
|
)
|
||||||
|
(when c-type
|
||||||
|
(write `(defined c type ,c-type) (current-error-port))
|
||||||
|
(newline (current-error-port))
|
||||||
|
(set! type-arg c-type))
|
||||||
|
|
||||||
;(for-each
|
;(for-each
|
||||||
; (lambda (arg)
|
; (lambda (arg)
|
||||||
; (if (not (string? arg))
|
; (if (not (string? arg))
|
||||||
|
|
|
@ -11,8 +11,12 @@
|
||||||
|
|
||||||
(define *my-global* #f)
|
(define *my-global* #f)
|
||||||
|
|
||||||
|
(c-define-type my-integer integer)
|
||||||
|
(c-define-type my-integer2 integer)
|
||||||
|
|
||||||
(test-group "foreign value"
|
(test-group "foreign value"
|
||||||
(test 3 (c-value "1 + 2" integer))
|
(test 3 (c-value "1 + 2" integer))
|
||||||
|
(test 4 (c-value "2 + 2" my-integer))
|
||||||
)
|
)
|
||||||
|
|
||||||
(test-group "foreign code"
|
(test-group "foreign code"
|
||||||
|
|
Loading…
Add table
Reference in a new issue