On 30-Jul-07, at 10:32 AM, James Long wrote:
Here's the main the problem I'm trying to solve: I'm trying to figure out how to export records or types (or anything that uses macro rewriting). my system will use records extensively, using define-structure or define-type. Obviously I don't want to have to manually export every function that define-type creates.
I suppose there's an argument to be made that the module owning a record type should be the only thing with complete access to it, and it should delegate control by exporting getter/setter functions and constructors. However, it seems like that could get tedious.
Just define your own define-type like macro that does what you want:
(my-define-type bar a b c)
should expand to
(##namespace ("bar#" make-bar bar? bar-a bar-a-set! bar-b bar-b-set!)) (define-type bar a b c)
If you want to experiment with different namespace separators in gsi, just compile this file:
;; File: "gambcext.scm"
(declare (block))
(define ##namespace-separators '(## #:)) (set! ##namespace-separators ##namespace-separators)
(define (##full-name? sym) ;; full name if it contains a namespace separator (let ((str (##symbol->string sym))) (let loop ((i (##fixnum.- (##string-length str) 1))) (if (##fixnum.< i 0) #f (if (##memq (##string-ref str i) ##namespace-separators) #t (loop (##fixnum.- i 1)))))))
(define (##valid-prefix? str)
;; non-null name followed by a namespace separator at end is ;; valid as is the special prefix ""
(let ((l (##string-length str))) (or (##fixnum.= l 0) (and (##not (##fixnum.< l 2)) (##memq (##string-ref str (##fixnum.- l 1)) ##namespace-separators)))))
and put it in the Gambit installation directory so that it is automatically loaded. You can change the namespace-separators at run time with a
(set! ##namespace-separators '(## #: ...))
Marc