Can't you just delete the whole second binding for accs? Sam On Jul 3, 2014 8:11 PM, "Jens Axel Søgaard" <jensa...@soegaard.net> wrote:
> Thanks to all for the advice. It seems the following version of match > works for Whalesong: > > https://github.com/soegaard/whalesong-libs > > Admitted I have only made superfical tests. > > > In match/compiler.rkt I replaced > > (define (gen-clause k rows x xs esc) > <...> > ;; it's a structure > > [(box? k) > ;; all the rows are structures with the same predicate > (let* ([s (Row-first-pat (car rows))] > [accs (Struct-accessors s)] > [accs (if (Struct-complete? s) > (build-list (length accs) (λ (i) #`(λ (x) > (unsafe-struct-ref x #,i)))) > accs)] > [pred (Struct-pred s)]) > (compile-con-pat accs pred Struct-ps))] > <...>) > > with > > (define (gen-clause k rows x xs esc) > <...> > ;; it's a structure > [(box? k) > ;; all the rows are structures with the same predicate > (let* ([s (Row-first-pat (car rows))] > [accs (Struct-accessors s)] > [accs (if (Struct-complete? s) > (build-list (length accs) > (λ (i) (with-syntax ([a (list-ref accs > i)]) > #`(λ (x) (a x))))) ; [Whalesong] > accs)] > [pred (Struct-pred s)]) > (compile-con-pat accs pred Struct-ps))] > <...>) > > /Jens Axel > > 2014-07-03 15:12 GMT+02:00 Sam Tobin-Hochstadt <sa...@cs.indiana.edu>: > > The output of `match` when it uses `unsafe-struct-ref` can't be > > faithfully implemented safely. In particular, `match` has access to > > the accessor function, which may give you results that you can't get > > from safe reflection such as `struct->vector`. > > > > Instead, I think you should just implement `unsafe-struct-ref` to look > > inside the abstraction of structs, so that it violates the abstraction > > in the same way that it does in Racket. While this won't potentially > > crash in JavaScript, it will be unsafe relative to the abstractions of > > Racket, and thus deserves the name unsafe. > > > > Sam > > > > On Wed, Jul 2, 2014 at 9:06 PM, Jens Axel Søgaard <jensa...@soegaard.net> > wrote: > >> Is it possible to implement unsafe-struct-ref using safe constructs > only? > >> > >> The reason behind this peculiar question, is that I am porting > racket/match > >> to Whalesong. The match compiler uses various unsafe constructs that > Whalesong > >> doesn't implement. It is straightforward to replace, say, > >> unsafe-vector-ref with vector-ref. > >> > >> But unsafe-struct-ref ? > >> > >> It is okay to use all tricks in the book in phase 1 (Whalesong has > >> restrictions in phase 0 only). > >> > >> /Jens Axel > >> ____________________ > >> Racket Users list: > >> http://lists.racket-lang.org/users > > > > -- > -- > Jens Axel Søgaard >
____________________ Racket Users list: http://lists.racket-lang.org/users