process imported forms as toplevel, not as text

1. register imported types
2. protect against multiple imports (diamond, circular)
This commit is contained in:
2026-09-16 01:11:53 +03:00
parent 85bf1c163c
commit d0d0ea8e84
5 changed files with 32 additions and 13 deletions

View File

@@ -7,10 +7,14 @@
# module's object survives being passed after `--'. Get any of them
# wrong and this fails to link -- or, in the `pub var' case, links and
# quietly counts into a private copy.
#
# It also checks what only a second translation unit can check: that an
# imported type reaches the type database, by expanding a macro that
# reads the imported struct's fields.
SEXC ?= ../../sexc
EXPECTED = hello, world\nhello, sex\n2 greetings
EXPECTED = hello, world\nhello, sex\n2 greetings\ntext times
check:
@$(SEXC) greet.sex -c -o greet.o

View File

@@ -7,6 +7,9 @@
;;; as a prototype and `greet-count' as an extern. Both keep external
;;; linkage, so they refer to the one definition in greet.o rather than
;;; to private copies.
;;;
;;; Also check that import populates type-database, by means of
;;; describe-fields macro, which should work on imported type.
(include stdio.h)
@@ -16,4 +19,6 @@
(greet "world")
(greet "sex")
(printf "%d greetings\n" greet-count)
(describe-fields greeting)
(printf "\n")
(return 0))

View File

@@ -9,6 +9,16 @@
(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))