~ chicken-core (chicken-5) cef399243a2531d36831b8dcd25b834e627450f6
commit cef399243a2531d36831b8dcd25b834e627450f6
Merge: 074fdfc6 9ab3a617
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Apr 9 13:47:19 2011 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Sat Apr 9 13:47:19 2011 +0200
resolved conflicts
diff --cc chicken-syntax.scm
index 998f5874,04e6658c..ef8f9292
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@@ -1110,27 -1110,65 +1110,84 @@@
(##core#let-compiler-syntax (binding ...) body ...)))))
+;;; type-declaration syntax
+
+(##sys#extend-macro-environment ;XXX not documented yet
+ ': '()
+ (##sys#er-transformer
+ (lambda (x r c)
+ (##sys#check-syntax ': x '(_ symbol _ . _))
+ (if (memq #:csi ##sys#features)
+ '(##core#undefined)
+ (let* ((type1 (##sys#strip-syntax (caddr x)))
+ (name1 (cadr x))
+ (type (##compiler#validate-type type1 (##sys#strip-syntax name1))))
+ (cond ((not type)
+ (syntax-error ': "invalid type syntax" name1 type1))
+ (else
+ `(##core#declare
+ (type (,name1 ,type ,@(cdddr x)))))))))))
+
+
+ ;;; interface definition
+
+ (##sys#extend-macro-environment
+ 'define-interface '()
+ (##sys#er-transformer
+ (lambda (x r c)
+ (##sys#check-syntax 'define-interface x '(_ symbol _))
+ (let ((name (##sys#strip-syntax (cadr x)))
+ (%quote (r 'quote)))
+ (when (eq? '* name)
+ (##sys#syntax-error-hook
+ 'define-interface "`*' is not allowed as a name for an interface"))
+ `(,(r 'begin-for-syntax)
+ (##sys#register-interface
+ (,%quote ,name)
+ (,%quote ,(let ((exps (##sys#strip-syntax (caddr x))))
+ (cond ((eq? '* exps) '*)
+ ((symbol? exps) `(#:interface ,exps))
+ ((list? exps)
+ (##sys#validate-exports exps 'define-interface))
+ (else
+ (##sys#syntax-error-hook
+ 'define-interface "invalid exports" (caddr x))))))))))))
+
+
+ ;;; functor definition
+
+ (##sys#extend-macro-environment
+ 'functor '()
+ (##sys#er-transformer
+ (lambda (x r c)
+ (##sys#check-syntax 'functor x '(_ (symbol . #((symbol _) 0)) _ . _))
+ (let* ((x (##sys#strip-syntax x))
+ (head (cadr x))
+ (name (car head))
+ (exps (caddr x))
+ (body (cdddr x))
+ (registration
+ `(##sys#register-functor
+ ',name
+ ',(map (lambda (arg)
+ (let ((argname (car arg))
+ (exps (##sys#validate-exports (cadr arg) 'functor)))
+ (cons argname exps)))
+ (cdr head))
+ ',(##sys#validate-exports exps 'functor)
+ ',body)))
+ `(##core#module
+ ,name
+ #t
+ (import scheme chicken)
+ (begin-for-syntax ,registration))))))
+
+
+ ;; capture current macro env
+
(##sys#macro-subset me0 ##sys#default-macro-environment)))
+
;; register features
(eval-when (compile load eval)
diff --cc rules.make
index 43069955,8ad51102..5eed53fc
--- a/rules.make
+++ b/rules.make
@@@ -35,11 -35,10 +35,11 @@@ VPATH=$(SRCDIR
SETUP_API_OBJECTS_1 = setup-api setup-download
-LIBCHICKEN_OBJECTS_1 = \
+LIBCHICKEN_SCHEME_OBJECTS_1 = \
library eval data-structures ports files extras lolevel utils tcp srfi-1 srfi-4 srfi-13 \
srfi-14 srfi-18 srfi-69 $(POSIXFILE) irregex scheduler \
- profiler stub expand chicken-syntax chicken-ffi-syntax
- profiler stub expand modules chicken-syntax chicken-ffi-syntax runtime
++ profiler stub expand modules chicken-syntax chicken-ffi-syntax
+LIBCHICKEN_OBJECTS_1 = $(LIBCHICKEN_SCHEME_OBJECTS_1) runtime
LIBCHICKEN_SHARED_OBJECTS = $(LIBCHICKEN_OBJECTS_1:=$(O))
LIBCHICKEN_STATIC_OBJECTS = $(LIBCHICKEN_OBJECTS_1:=-static$(O))
Trap