~ 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