From: Dmitry Bogatov <kact...@gnu.org> The following code will cause error:
(define (foo x) (define x (* 2 x)) (+ x 12)) (display (foo 12)) instead displaying 36, since in (* 2 x) form variable x is bound, but have value *unspecified*. In this case `set!' must be used. * module/system/foreign/declarative.scm(default): replace `define' with `set!' * test-suite/tests/foreign-declarative.test: test encode/decode procedures of primitive foreign types are identity. --- module/system/foreign/declarative.scm | 5 ++--- test-suite/tests/foreign-declarative.test | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/module/system/foreign/declarative.scm b/module/system/foreign/declarative.scm index 65a6497..5b84c22 100644 --- a/module/system/foreign/declarative.scm +++ b/module/system/foreign/declarative.scm @@ -42,10 +42,9 @@ clone-proc free-proc) (define-syntax-rule (default <arg> <def>) - (define <arg> + (set! <arg> (with-proper-name (symbol-append name '<arg>) - (or (and (unspecified? <arg>) <def>) - <arg>)))) + (or <arg> <def>)))) (define-syntax-rule (default-unavailable <arg>) (default <arg> (lambda (x) (error "Unavailable" name '<arg> x)))) (define-syntax-rule (default-identity <arg>) diff --git a/test-suite/tests/foreign-declarative.test b/test-suite/tests/foreign-declarative.test index 2c696f9..eb2a47c 100644 --- a/test-suite/tests/foreign-declarative.test +++ b/test-suite/tests/foreign-declarative.test @@ -27,6 +27,10 @@ (define ft-clone-proc (@@ (system foreign declarative) ft-clone-proc)) (define ft-free-proc (@@ (system foreign declarative) ft-free-proc)) +(with-test-prefix "foreign-type primitives" + (pass-if "int: encoder is identity" + (equal? 15 ((ft-encode-proc int:) 15)))) + (define-foreign-type bogus:) (with-test-prefix "foreign-type defaults" (pass-if "clone-proc correctly defaults to identity" -- I may be not subscribed. Please, keep me in carbon copy.