GNU bug report logs - #11196
missing constructor procedure in new srfi-9 records

Previous Next

Package: guile;

Reported by: Klaus Stehle <klaus.stehle <at> uni-tuebingen.de>

Date: Sat, 7 Apr 2012 20:02:02 UTC

Severity: normal

Done: ludo <at> gnu.org (Ludovic Courtès)

Bug is archived. No further changes may be made.

Full log


Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Klaus Stehle <klaus.stehle <at> uni-tuebingen.de>
To: bug-guile <at> gnu.org
Subject: missing constructor procedure in new srfi-9 records
Date: Sat, 7 Apr 2012 21:54:34 +0200 (CEST)
Hi,

;;;; A short example script to describe the problem:

(use-modules (srfi srfi-9))

;; A simple record definition for example
(define-record-type my-record
  (make-my-record one two)
  my-record?
  (one my-one)
  (two my-two))

;; "Normal" construction is working well
(define r1 (make-my-record "1" "2"))

;; This should also work, but it doesn't!
(define r2 ((record-constructor my-record) "1" "2"))
=> ERROR

;; Where's the constructor procedure?
(display (record-constructor my-record)) (newline)

=> #f


The bug is located in the new srfi-9.scm which forgets to set the
record's constructor procedure.
The following patch may help (hoping not to introduce new problems):



--- srfi-9.scm  2012-04-06 16:52:02.000000000 +0200
+++ srfi-9.scm  2012-04-06 17:14:36.000000000 +0200
@@ -188,7 +188,9 @@
        (let* ((fields      (field-identifiers #'(field-spec ...)))
               (field-count (length fields))
               (layout      (string-concatenate (make-list field-count 
"pw")))
-              (indices     (field-indices (map syntax->datum fields))))
+              (indices     (field-indices (map syntax->datum fields)))
+              (ctor-proc   (syntax-case #'constructor-spec ()
+                             ((func args ...) (syntax func)))))
          #`(begin
              (define type-name
                (let ((rtd (make-struct/no-tail
@@ -204,7 +206,7 @@
                     (eq? (struct-vtable obj) type-name)))

              #,(constructor #'type-name #'constructor-spec indices)
-
+             (struct-set! type-name (+ 2 vtable-offset-user) #,ctor-proc)
              #,@(accessors #'type-name #'(field-spec ...) indices)))))))

 ;;; srfi-9.scm ends here




Cheers,
Klaus Stehle


----------------------------
guile --version
guile (GNU Guile) 2.0.5

uname -srm
Linux 2.6.32-5-amd64 x86_64




This bug report was last modified 13 years and 41 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.