|
Update available-- possibly last before finalization
David Van Horn
(08 Dec 2004 20:40 UTC)
|
|
Re: Update available-- possibly last before finalization
Felix Winkelmann
(09 Dec 2004 06:27 UTC)
|
|
Re: Update available-- possibly last before finalization
Andre van Tonder
(09 Dec 2004 16:55 UTC)
|
|
Re: Update available-- possibly last before finalization
Felix Winkelmann
(10 Dec 2004 06:19 UTC)
|
|
Re: Update available-- possibly last before finalization
Andre van Tonder
(10 Dec 2004 11:48 UTC)
|
|
Re: Update available-- possibly last before finalization
Felix Winkelmann
(10 Dec 2004 13:03 UTC)
|
|
Re: Update available-- possibly last before finalization Andre van Tonder (10 Dec 2004 18:34 UTC)
|
|
Re: Update available-- possibly last before finalization
Felix Winkelmann
(13 Dec 2004 06:17 UTC)
|
On Fri, 10 Dec 2004, Felix Winkelmann wrote:
> Andre van Tonder wrote:
>> On Fri, 10 Dec 2004, Felix Winkelmann wrote:
>>
>>> From what my experiments show the current SRFI-57 reference
>>> implementation
>>> does *not* work on systems that provide a non-generative SRFI-9, or non-
>>> generative native records.
>>
>> I'm not sure why that should be. Would you mind saying a bit more on
>> this?
>
> Here a simple implementation of SRFI-9, using syntax-case:
>
> [code snipped]
Hi Felix,
The following modification of your code works, but is generative, and so
probably misses the point of what you were trying to achieve. To get
nongenerativity, the underlying SRFI-9-like interface should probably
be passed an extra identifier to be used as tag, instead of creating a
unique tag as done below.
Regards
Andre
(define <record> (list 'vector))
(define-syntax (srfi-9:define-record-type x)
(define (memi id ids)
(and (not (null? ids))
(or (free-identifier=? id (car ids))
(memi id (cdr ids)) ) ) )
(syntax-case x ()
[(_ t (conser vars ...) pred slots ...)
(syntax-case #'(slots ...) ()
[((slotnames . _) ...)
(with-syntax ([(slotvars ...) (map (lambda (sname)
(if (memi sname #'(vars ...))
sname
#'(void) ) )
#'(slotnames ...)) ] )
(with-syntax ([(accforms ...)
(let loop ([slots #'(slots ...)] [i 2])
(if (null? slots)
#'()
(with-syntax ([ii i]
[(rest ...) (loop (cdr slots)
(+ 1 i))] )
(syntax-case (car slots) ()
[(name get set)
#'((define (get x)
(vector-ref x ii) )
(define (set x y)
(vector-set! x ii y) )
rest ...) ]
[(name get)
#'((define (get x)
(vector-ref x ii) )
rest ...) ] ) ) ) ) ] )
#'(begin
(define generated-tag (cons #f #f))
(define (conser vars ...) (vector <record> generated-tag
slotvars ...))
(define (pred x) (and (vector? x)
(eq? <record> (vector-ref x 0))
(eq? generated-tag (vector-ref x
1))))
accforms ...) ) ) ] ) ] ) )