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