1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 21:40:33 +02:00

Deprecate two-arg `record-constructor'

* module/ice-9/boot-9.scm (record-constructor): Deprecate the two-arg
  form.
This commit is contained in:
Andy Wingo 2019-10-22 13:59:33 +02:00
parent 0c8d20d2d0
commit f7b4055b16

View file

@ -1282,17 +1282,24 @@ VALUE."
(struct-ref obj (+ 1 vtable-offset-user)) (struct-ref obj (+ 1 vtable-offset-user))
(error 'not-a-record-type obj))) (error 'not-a-record-type obj)))
(define* (record-constructor rtd #:optional field-names) (define record-constructor
(if (not field-names) (case-lambda
(struct-ref rtd (+ 2 vtable-offset-user)) ((rtd)
(primitive-eval (struct-ref rtd (+ 2 vtable-offset-user)))
`(lambda ,field-names ((rtd field-names)
(make-struct/no-tail ',rtd (issue-deprecation-warning
,@(map (lambda (f) "Calling `record-constructor' with two arguments (the record type"
(if (memq f field-names) " and a list of field names) is deprecated. Instead, call with just"
f " one argument, and provide a wrapper around that constructor if"
#f)) " needed.")
(record-type-fields rtd))))))) (primitive-eval
`(lambda ,field-names
(make-struct/no-tail ',rtd
,@(map (lambda (f)
(if (memq f field-names)
f
#f))
(record-type-fields rtd))))))))
(define (record-predicate rtd) (define (record-predicate rtd)
(lambda (obj) (and (struct? obj) (eq? rtd (struct-vtable obj))))) (lambda (obj) (and (struct? obj) (eq? rtd (struct-vtable obj)))))