forked from alex-eg/sex
1. register imported types 2. protect against multiple imports (diamond, circular)
29 lines
948 B
Scheme
29 lines
948 B
Scheme
;;; A module. Everything marked `pub' forms its public interface;
|
|
;;; everything else is private to this file.
|
|
;;;
|
|
;;; Importing a module does not link it: it pastes the declarations, so
|
|
;;; the compiled object still has to be handed to the C compiler. See
|
|
;;; greet-app.sex.
|
|
|
|
(include stdio.h)
|
|
|
|
(pub var greet-count int 0)
|
|
|
|
(pub struct greeting ((text (* const char)) (times int)))
|
|
|
|
;;; Compile-time reflection across the module boundary: both the macro
|
|
;;; and the struct it asks about are exported, and the importing unit
|
|
;;; has to know the struct's fields to expand this.
|
|
(pub defmacro (describe-fields type)
|
|
`(do ,@(map-fields type
|
|
(lambda (name field-type)
|
|
`(printf "%s " ,(symbol->string name))))))
|
|
|
|
(pub fn greet ((name (* const char))) void
|
|
(++ greet-count)
|
|
(printf "hello, %s\n" name))
|
|
|
|
;;; Not `pub': invisible to importers, and static in the generated C.
|
|
(fn unused-helper () void
|
|
(printf "private\n"))
|