[racket-dev] feature request: thread-safe memoize-evt

2015-01-28 Thread Jan Dvořák
Hi,

I would like to ask for another extension of the Racket's event handling
system. A `memoize-evt` constructor with following semantics:

Given a base event E_b, memoize-evt will produce a memoizing event E_m.
Synchronizing on E_m from any number of threads will block until a
single value is produced by E_b. This value is then stored inside the
E_m. From that moment on, E_m will always be immediately ready for
synchronization and produce the stored value in all waiting threads.

The single-threaded implementation is a trivial guard-evt + replace-evt
+ (wrap-evt always-evt) combo, but for thread-safety a temporary thread
would be needed to wait for the base event and the solution would have
different semantics then rest of the event system.

A lower-level approach would also be possible; create something along
the lines of a dynamic-wind-evt that would, with some cleverness, allow
for generic thread-safe events via locking. Or create a locked-wrap-evt
constructor that will not be ready until it's handler finishes.

Hoping that I am not being too bothersome,
from Prague with thanks,
Jan Dvorak


_
  Racket Developers list:
  http://lists.racket-lang.org/dev


Re: [racket-dev] dev Digest, Vol 72, Issue 31

2015-01-28 Thread Byron Davies
My apologies, especially to Matt, for letting this thread go cold.  I was
busy preparing a Racket-based demo for this morning -- and it went very
well.  As mentioned, I'm working on weakest precondition analysis for
finding latent faults in programs. Our goal is to do this for all kinds of
software, including machine language, but for proof of concept I'm doing it
*in* Racket *on* Racket programs.  Racket's language building tools,
including syntax and the syntax browser, have been very useful for this
problem.

Regarding transparency, thank you, Matt, for suggesting an alternative
approach.  I've played with your examples a bit, trying to see how I could
use this during debugging.  I have also read the Reflection and Security
chapter in the reference to learn more about inspectors in general.

Your code, commented:

(define orig-i (current-inspector))  ; saves the original inspector
(define sub-i (make-inspector orig-i))  ;make a new inspector whose parent
is the original inspector

(current-inspector sub-i)  ;makes the new inspector the current inspector
(struct a (x))  ; creates a structure using the new inspector as the
default inspector
(define v (a 1))  ; creates an instance of the new structure
(current-inspector orig-i) ;reverts the inspector to the original (the
parent of the new inspector)

I see how this works, but I'm a little confused about why it works.  I see
that the new inspector is a child of the old one, and I read in the
reference chapter that access is determined not by the inspector in force
at creation time, but by the parent of that inspector, i.e., the old
inspector. I can't find any description of the power of an inspector,
except that the parent is more powerful.

Are there degrees of power? Or if you have access to the parent do you have
all the power you can have? I see that the inspector gives you access to
the data in a structure instance, but does it also give you access to
meta-data, so that I know that the name of the first field in struct a is x?

I also don't understand how the root inspector works.  I have found that
setting (current-inspector root-inspector) delivers endless left parens for
the (a 1) example, presumably because the display function recursively
tries to inspect the components of the struct, all the way down.

Finally, does this also work for classes?

Date: Thu, 22 Jan 2015 05:36:18 -0700
From: Matthew Flatt mfl...@cs.utah.edu
To: Byron Davies byrondav...@starshine.us
Cc: dev@racket-lang.org
Subject: Re: [racket-dev] Full transparency
Message-ID: 20150122123620.2daa1650...@mail-svr1.cs.utah.edu
Content-Type: text/plain; charset=UTF-8

I don't think you want to do anything with the compiler or macros.
Instead, it's a matter of having a sufficiently powerful inspector
(which is the concept of inspectability turned into a language
construct).

If you have just

 (struct a (x))
 (a 1)

then the result will print as `#a`. But if you use

 (define orig-i (current-inspector))
 (define sub-i (make-inspector orig-i))

 (current-inspector sub-i)
 (struct a (x))
 (define v (a 1))
 (current-inspector orig-i)

 v

Then, the result will print as `(a 1)`. That's because the structure
declaration is creates under an inspector `sub-i` (which is the current
inspector at the time) that is subordinate to the inspector `orig-i`
that is in place when the structure instance is printed.

The current inspector is determined dynamically, which means that if
you're loading some code, you can set the inspector while loading the
code. For example, if a.rkt is

 #lang racket/base
 (provide v)

 (struct a (x))
 (define v (a 1))

then

 (define v
   (parameterize ([current-inspector (make-inspector)])
 (dynamic-require a.rkt 'v)))
 v

will print the `a` instance transparently.


To protect libraries, there's no safe way to access a root inspector
that controls all structure types when you start Racket. Nothing is
safe from unsafe code, though, and here's an unsafe way to access the
root inspector:

 #lang racket/base
 (require ffi/unsafe)

 (define-cstruct _Scheme_Inspector
   ([stag _short]
[keyex _short]
[depth _int]
[superior _racket]))

 (define root-inspector
   (Scheme_Inspector-superior
((get-ffi-obj 'scheme_get_initial_inspector
  #f
  (_fun - (_gcable _Scheme_Inspector-pointer))

Using `root-inspector`, you can inspect any structure instance.

At Wed, 21 Jan 2015 23:46:10 -0700, Byron Davies wrote:
 Nice parry!  What may be straightforward to you may not be so obvious to
 me.  But I'll take a look.

 I'm deep into a project using Racket for weakest precondition analysis.
 Every time I'm debugging it seems like I have to write another
 special-purpose accessor, or export some existing accessor up through
 multiple levels in order to get at the data I need at the top-level.  I
 remember how easy it was with the Lisp Machine to navigate through data no
 matter what it was.

 The Lisp Machine offered total transparency, 

[racket-dev] Switching to Google Groups

2015-01-28 Thread John Clements
Dear developers,

PLT would like to get out of the mailing-list administration game.

Accordingly, we’re planning to switch to Google Groups. Rather than
starting with our largest list, the Racket Users list, we’ve chosen to
begin with the dev list, because … well, you’re probably more tolerant,
if^H^H when something goes wrong.

We would like the transition to be as smooth as possible, and we can use
your help with this.  Specifically, Google has a daily cap on the number of
e-mail addresses that can be bulk-added to a mailing list. For this reason,
it would speed the transition greatly if you could take a moment to sign up
for the new group yourself, using this URL:

https://groups.google.com/forum/#!forum/racket-dev

We plan to disable signup for the old group now, and to halt delivery of
mail to the existing group address tomorrow. You can post to the new group
(after signing up) by sending mail to

racket-...@googlegroups.com

We plan to manually add or invite the members who do not add themselves,
but the daily cap will mean that these users are likely to miss one or more
days of postings to this list. Naturally, those posts will be archived, as
part of the group.

The archive of the existing list will continue to exist, though new
messages will not be added to it.

Let us know if you run into problems!

Many thanks,

John Clements  PLT
_
  Racket Developers list:
  http://lists.racket-lang.org/dev


Re: [racket-dev] Switching to Google Groups

2015-01-28 Thread Vincent St-Amour
In case anyone would like to use a non-gmail address for sign up, you
can sign up from this URL:
https://groups.google.com/forum/#!forum/racket-dev/join

The regular sign up button wouldn't let me.

Vincent


At Wed, 28 Jan 2015 16:47:58 -0800,
John Clements wrote:
 
 
 Dear developers,
 
 PLT would like to get out of the mailing-list administration game.
 
 Accordingly, we’re planning to switch to Google Groups. Rather than
 starting with our largest list, the Racket Users list, we’ve chosen to
 begin with the dev list, because … well, you’re probably more tolerant,
 if^H^H when something goes wrong.
 
 We would like the transition to be as smooth as possible, and we can use
 your help with this. Specifically, Google has a daily cap on the number
 of e-mail addresses that can be bulk-added to a mailing list. For this
 reason, it would speed the transition greatly if you could take a moment
 to sign up for the new group yourself, using this URL:
 
 https://groups.google.com/forum/#!forum/racket-dev
 
 We plan to disable signup for the old group now, and to halt delivery of
 mail to the existing group address tomorrow. You can post to the new
 group (after signing up) by sending mail to
 
 racket-...@googlegroups.com
 
 We plan to manually add or invite the members who do not add themselves,
 but the daily cap will mean that these users are likely to miss one or
 more days of postings to this list. Naturally, those posts will be
 archived, as part of the group.
 
 The archive of the existing list will continue to exist, though new
 messages will not be added to it.
 
 Let us know if you run into problems!
 
 Many thanks,
 
 John Clements  PLT
 _
   Racket Developers list:
   http://lists.racket-lang.org/dev
_
  Racket Developers list:
  http://lists.racket-lang.org/dev