forked from alex-eg/sex
Now these macro helpers take in account the possibility of typedefing one type to another, and correctly find the one intended
33 lines
1.0 KiB
Scheme
33 lines
1.0 KiB
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)))
|
|
|
|
(pub enum mood (cheerful grumpy))
|
|
|
|
(pub typedef greeting-t (struct greeting))
|
|
|
|
;;; 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"))
|