Is there a way to create new primitive types in Gambit? I'm using 3.0 but I'm interested in answers regarding either version.
In 3.0 and 4.0 you can use define-structure:
Gambit Version 3.0
(define-structure foo a b) (define x (make-foo 11 22)) x
#s(foo (a 11) (b 22))
(foo? x)
#t
(foo? car)
#f
(vector? x)
#f
If you really want to keep your procedural representation, you can access a procedure's "code" pointer to distinguish closures created from one lambda from closures created from another lambda. Here's some sample code:
(define eq-procedure-code? ; this handles compiled and interpreted code (lambda (proc1 proc2) (if (##closure? proc1) (and (##closure? proc2) (if (##interp-procedure? proc1) (and (##interp-procedure? proc2) (eq? (##interp-procedure-code proc1) (##interp-procedure-code proc2))) (eq? (##closure-code proc1) (##closure-code proc2)))) (eq? proc1 proc2))))
(define make-adder (lambda (x) (lambda (y) (+ x y))))
(define make-multiplier (lambda (x) (lambda (y) (* x y))))
(define f (make-adder 1)) (define g (make-adder 2)) (define h (make-multiplier 3))
(pp (eq-procedure-code? f car)) ; => #f (pp (eq-procedure-code? f g)) ; => #t (pp (eq-procedure-code? g h)) ; => #f
Marc Feeley