~ chicken-core (chicken-5) 5a0282c3b77e218baa038a9e0ab35fcd6e5fc23e
commit 5a0282c3b77e218baa038a9e0ab35fcd6e5fc23e Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Mar 24 09:30:10 2011 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Mar 24 09:30:10 2011 -0400 added experimental instantiate+define functor instantiation syntax suggested by syn diff --git a/expand.scm b/expand.scm index ffc746b9..ceae9a95 100644 --- a/expand.scm +++ b/expand.scm @@ -1313,13 +1313,36 @@ (##sys#er-transformer (lambda (x r c) (let ((len (length x))) + (##sys#check-syntax 'module x '(_ symbol _ . #(_ 1))) (cond ((and (fx>= len 4) (c (r '=) (caddr x))) (let* ((x (##sys#strip-syntax x)) (name (cadr x)) (app (cadddr x))) (cond ((symbol? app) - (##sys#register-module-alias name app) - '(##core#undefined)) + (cond ((fx> len 4) + ;; suggested by syn + ;; + ;; (module NAME = FUNCTORNAME BODY ...) + ;; ~> + ;; (begin + ;; (module _NAME * BODY ...) + ;; (module NAME = (FUNCTORNAME _NAME))) + ;; + ;; - the use of "_NAME" is a bit stupid, but it must be + ;; externally visible to generate an import library from + ;; and compiling "NAME" separately may need an import-lib + ;; for stuff in "BODY" (say, syntax needed by syntax exported + ;; from the functor, or something like this...) + (let ((mtmp (string->symbol + (##sys#string-append + "_" + (symbol->string name))))) + `(##core#begin + (,(r 'module) ,mtmp * ,@(cddddr x)) + (##core#module ,name = (,app ,mtmp))))) + (else + (##sys#register-module-alias name app) + '(##core#undefined)))) (else (##sys#check-syntax 'module x '(_ symbol _ (symbol . #(_ 1)))) @@ -1328,7 +1351,6 @@ (car app) ; functor name (cdr app)))))) ; functor arguments (else - (##sys#check-syntax 'module x '(_ symbol _ . #(_ 0))) ;;XXX use module name in "loc" argument? (let ((exports (##sys#validate-exportsTrap