;;; 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"))