Maybe the type on the result of make-plot-snip ends up with types on
the methods of the snip and that makes the typed/untyped boundary be
at the point where those methods are called? (And those methods are
called a lot as the window does its work on callbacks)

Robby


On Tue, Dec 8, 2015 at 6:21 AM, Alex Harsanyi <[email protected]> wrote:
> Hi Vincent,
>
> Thanks for looking into this.  I changed the code so that make-plot-snip is
> now typed and the problem goes away.  I will now have to find a way to put
> this fix into my code, as the solution is not particularly elegant and
> relies on undocumented features (type-environment and parse-syntax).
>
> I inserted my fixed version below, in case you have any suggestions on how
> to improve it.
>
> However, I'm not sure I understand your explanation. I was expecting most of
> the interactions for drawing the window to be between the frame, the
> plot-canvas and the plot-snip.  The first two objects are created in an
> untyped environment and the plot-snip, while typed, is inserted into the
> snip-canvas in an untyped environment as well.  Adding a type declaration to
> make-plot-snip should not have helped much as the interaction between the
> snip-canvas and the plot-snip is an untyped-typed boundary.  So basically,
> adding type declaration to make-plot-snip fixes the problem, but I have no
> idea why.
>
> Best Regards,
> Alex,
>
> #lang typed/racket/gui
> (require plot) ; Racket 6.3
>
> ;; make-snip-frame is similar to the one in
> ;; C:\Program Files\Racket\share\pkgs\plot-gui-lib\plot\private\gui\gui.rkt
>
> (module glue typed-racket/base-env/extra-env-lang
>
>   (provide make-snip-frame)
>
>   (module types typed/racket/base
>     (require (only-in typed/racket/gui Snip% Frame%))
>     (provide (all-defined-out))
>     (define-type Make-Snip-Frame
>       (-> (Instance Snip%)
>           Positive-Real
>           Positive-Real
>           String
>           (Instance Frame%))))
>
>   (module untyped-functions racket/gui
>     (require mrlib/snip-canvas)
>     (provide make-snip-frame)
>
>     (define (make-snip-frame snip width height label)
>       (define frame
>         (new frame% [label label] [width (+ 20 width)] [height (+ 20
> height)]))
>       (new snip-canvas%
>            [parent frame]
>            [make-snip (lambda (w h) snip)]
>            [horiz-margin 5] [vert-margin 5]
>            [horizontal-inset 5] [vertical-inset 5])
>       frame))
>
>   (require 'types
>            (for-syntax (submod 'types #%type-decl))
>            'untyped-functions)
>
>   (type-environment
>    [make-snip-frame (parse-type #'Make-Snip-Frame)]))
>
> (require 'glue)
>
> ;; This works as expected when resizing the window and zooming the graph
> (define (plot-working)
>   (parameterize ([plot-width    150]
>                  [plot-height   150]
>                  [plot-x-label  #f]
>                  [plot-y-label  #f])
>     (send (plot-frame (function sqr -2 2)) show #t)))
>
> ;; This does not work in version 6.2 or newer but works fine in version
> 6.1.1.
> ;; Try resizing the frame and zooming the plot to see the problem.  Compare
> it
> ;; with the frame produced by `plot-working`
> (define (plot-not-working)
>   (parameterize ([plot-width    150]
>                  [plot-height   150]
>                  [plot-x-label  #f]
>                  [plot-y-label  #f])
>     ;; this is essentially what plot-frame does sans error checking
>     (send (make-snip-frame (plot-snip (function sqr -2 2)) 150 150 "hello")
> show #t)))
>
>
>
> On Tuesday, December 8, 2015 at 3:09:43 AM UTC+8, Vincent St-Amour wrote:
>>
>> Alex,
>>
>> I've looked into this a little bit more, and it looks like the
>> `not-working` function (which is, as you say, doing essentially the same
>> thing as `plot-frame`) is actually kind of working, but is actually
>> stuttering very badly.
>>
>> An important detail here is that `plot` is written in Typed Racket,
>> whereas your code uses regular, untyped Racket. Interfacing Typed Racket
>> and Racket code may involve a lot of dynamic checks, which can have
>> significant overhead, and cause that kind of stuttering.
>>
>> *Where* that boundary lies, though, matters a lot.
>>
>> If you use `plot-frame`, its (typed) implementation uses the (typed)
>> version of `make-snip-frame` from inside the `plot` library. The
>> boundary then lies between your driver code and `plot-frame`. That's not
>> a very heavily trafficked boundary, so the overhead is minimal.
>>
>> If you use your hand-rolled equivalent of `plot-frame`, you're using
>> your own, untyped version of `make-snip-frame`, so the boundary lies
>> between the typed `plot-snip` and your untyped `make-snip-frame`. That
>> seems to be a more trafficked boundary, hence the stuttering.
>>
>> (To complicate matters, Neil uses some tricks to add types to
>> `make-snip-frame` after the fact, without boundary overhead, which is
>> why the version you copied looked (and kind of was) untyped.)
>>
>> Just to confirm, I've converted your file to Typed Racket, and used the
>> typed version of `make-snip-frame`, and the problem goes away.
>>
>>
>> So the bottom line is, using `pict-snip` from untyped code may be too
>> slow to be usable. You may want to write the portion of your program
>> that uses it in Typed Racket.
>>
>> Vincent
>>
>>
>>
>>
>> On Sun, 06 Dec 2015 05:30:23 -0600,
>> Alex Harsanyi wrote:
>> >
>> > Hi Vincent,
>> >
>> > This is still a problem in Racket 6.3. I tried to debug the problem but
>> > I was unsuccessful. Tried to use a pasteboard% instead, but the
>> > plot-snip% did not work correctly with that either. Do you have any
>> > advice on where to start looking?
>> >
>> > What I'm trying to do is embed plot-snip% objects inside a GUI. Is there
>> > a way to do that? I could only find plot-frame which always creates a
>> > new frame.
>> >
>> > For reference, this is that application that is affected:
>> > https://github.com/alex-hhh/ActivityLog2. The last Racket version that
>> > works with this is 6.1.1
>> >
>> > Best Regards,
>> > Alex.
>> >
>> > On Tuesday, October 6, 2015 at 4:26:54 AM UTC+8, Vincent St-Amour wrote:
>> >
>> >     Hi Alex,
>> >
>> >     Sorry for the late response.
>> >
>> >     I can confirm the behavior you observed. I don't see anything wrong
>> >     with
>> >     your code at first glance, so I'm not sure what the problem is.
>> >
>> >     Neil: Any ideas?
>> >
>> >     Vincent
>> >
>> >
>> >
>> >     On Sun, 04 Oct 2015 20:36:35 -0500,
>> >     Alex Harsanyi wrote:
>> >     >
>> >     > Hi,
>> >     >
>> >     > I posted this question a while ago but I didn't receive any
>> >     response. I
>> >     > just retested the code with the current snapshot (6.2.900.17) and
>> >     it has
>> >     > the same behavior (bug?).
>> >     >
>> >     > Could someone please test this code on their machine and at least
>> >     > confirm whether it works correctly or not for them?
>> >     >
>> >     > If there's a bug in the code below, could you point out what it
>> >     is? As I
>> >     > mentioned, the code works fine in 6.1.1 and I cannot find anything
>> >     that
>> >     > has changed in this area in version 6.2.
>> >     >
>> >     > Note that in recent Racket snapshots snip-canvas% has moved, so,
>> >     in the
>> >     > code below, the "(require unstable/gui/snip)" should be replaced
>> >     with "
>> >     > (require mrlib/snip-canvas)".
>> >     >
>> >     > Thanks,
>> >     > Alex.
>> >     >
>> >     > On Friday, July 24, 2015 at 3:57:13 PM UTC+8, Alex Harsanyi wrote:
>> >     >
>> >     >
>> >     > Hi,
>> >     >
>> >     > I'm using the plot-snip function to have interactive plots inside
>> >     > other GUI elements in my application. This worked fine under
>> >     Racket
>> >     > 6.1.1 but fails under Racket 6.2 (bot versions are 64 bit on
>> >     > Windows). The program below illustrates the problem: the function
>> >     > `working` creates a plot window using plot-frame. The plot is
>> >     > resized correctly and the interactive zoom works as expected. The
>> >     > function `not-working` tries to do the same, but creates the plot
>> >     > using plot-snip than adds it to a snip canvas. It does essentially
>> >     > what plot-frame does, without the error checking (I copied out the
>> >     > functions from he plot package). With this version, the plot is
>> >     not
>> >     > resized correctly inside the window and zoom in and out does not
>> >     > work correctly. Both functions work as expected under Racket
>> >     version
>> >     > 6.1.1.
>> >     >
>> >     > The program makes use of snip-canvas% which is in unstable/gui,
>> >     but
>> >     > as far as I can tell, it has not changed between the two versions.
>> >     >
>> >     > Does anyone know what needs to be done to get this to work, or is
>> >     > this a bug in the plot package?
>> >     >
>> >     > Thanks,
>> >     > Alex.
>> >     >
>> >     > #lang racket/gui
>> >     > (require plot)
>> >     > (require unstable/gui/snip)
>> >     >
>> >     > ;; snip-frame% and make-snip-frame are copied from
>> >     > ;; C:\Program
>> >     > Files\Racket\share\pkgs\plot-gui-lib\plot\private\gui\gui.rkt
>> >     >
>> >     > (define snip-frame%
>> >     > (class frame%
>> >     > (define/override (on-traverse-char event)
>> >     > (define key-code (send event get-key-code))
>> >     > (case key-code
>> >     > [(escape) (send this show #f)]
>> >     > [else (super on-traverse-char event)]))
>> >     >
>> >     > (super-new)))
>> >     >
>> >     > (define (make-snip-frame snip width height label)
>> >     > (define (make-snip w h) snip)
>> >     >
>> >     > (define frame
>> >     > (new snip-frame% [label label] [width (+ 20 width)] [height (+ 20
>> >     > height)]))
>> >     >
>> >     > (new snip-canvas%
>> >     > [parent frame]
>> >     > [make-snip make-snip]
>> >     > [horiz-margin 5] [vert-margin 5]
>> >     > [horizontal-inset 5] [vertical-inset 5])
>> >     >
>> >     > frame)
>> >     >
>> >     > ;; This works as expected when resizing the window and zooming the
>> >     > graph
>> >     > (define (working)
>> >     > (parameterize ([plot-width 150]
>> >     > [plot-height 150]
>> >     > [plot-x-label #f]
>> >     > [plot-y-label #f])
>> >     > (send (plot-frame (function sqr -2 2)) show #t)))
>> >     >
>> >     > ;; This does not
>> >     > (define (not-working)
>> >     > (parameterize ([plot-width 150]
>> >     > [plot-height 150]
>> >     > [plot-x-label #f]
>> >     > [plot-y-label #f])
>> >     > ;; this is essentially what plot-frame does sans error checking
>> >     > (send (make-snip-frame (plot-snip (function sqr -2 2)) 200 200
>> >     > "hello") show #t)))
>> >     >
>> >     >
>> >     > --
>> >     > You received this message because you are subscribed to the Google
>> >     > Groups "Racket Developers" group.
>> >     > To unsubscribe from this group and stop receiving emails from it,
>> >     send
>> >     > an email to [email protected].
>> >     > To post to this group, send email to [email protected].
>> >     > To view this discussion on the web visit
>> >     >
>> >
>> > https://groups.google.com/d/msgid/racket-dev/c2517296-2a7a-4e49-b617-21cfac413710%
>> >    40googlegroups.com.
>> >     > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Racket Developers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/racket-dev/9969d282-294c-4549-a472-cf2ee94dd653%40googlegroups.com.
>
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-dev/CAL3TdOMDmm%2BKGG5d1vZWfOk7w9ZFJ%2BZ-aTnwtr27jC6quiNn9A%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to