Marc Feeley wrote:
Another way to avoid name clashes is to use Gambit's "namespace" declaration.
Sure. That's what I've been meaning to tell Brad Lucier: don't misuse the namespacing feature (by using the ## namespace) as decoration for unsafe function names. Use e.g. @ instead. Example:
(##namespace ("foo#"))
(define (@string-copy! s1 start1 s2 start2 len) (let lp ((i 0)) (if (##fixnum.>= i len) s1 (begin (##string-set! s1 (##fixnum.+ start1 i) (##string-ref s2 (##fixnum.+ start2 i))) (lp (##fixnum.+ i 1))))))
(##namespace (""))
(foo#@string-copy! a b c d)
;; (Or put @string-copy! into the "" or whatever namespace or use snow (or use chjmodule until I've looked into merging with snow))
The @ is my visual indicator that a function does not check the type (or sometimes also the lengths) of it's arguments. It is visually somewhat similar to ##, but doesn't interfere with namespacing.
Christian.
(PS. I've recently referred to "namespaces" using the colon, in the context of SXML templates, example |xhtml:p|; I consider it best to use colons for user visible namespacing, and only use the # based namespacing behind the scence for package separation. This allows flexibility: import some html handling package with a "user-namespace" prefix like |xhtml:| into package foo, |xhtml:p| is then actually |foo#xhtml:p| there, and distinct from someone else writing a bar package who imports some other html handling package providing |p| as |bar#xhtml:p|. (Well in the example I mention from lately those were not actually bindings, but just syntax handled by the custom expander, but I hope the idea gets through.))