<div dir="ltr"><div>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.</div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">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.</span></div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">Your code, commented:</span></div><div><span style="font-size:13px"><br></span></div><div><div>(define orig-i (current-inspector))  ; saves the original inspector</div><div>(define sub-i (make-inspector orig-i))  ;make a new inspector whose parent is the original inspector</div><div><br></div><div>(current-inspector sub-i)  ;makes the new inspector the current inspector</div><div>(struct a (x))  ; creates a structure using the new inspector as the default inspector</div><div>(define v (a 1))  ; creates an instance of the new structure</div><div>(current-inspector orig-i) ;reverts the inspector to the original (the parent of the new inspector)</div></div><div><br></div><div>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.</div><div><br></div><div>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?</div><div><br></div><div>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.</div><div><br></div><div>Finally, does this also work for classes?</div><span style="font-size:13px"><div><span style="font-size:13px"><br></span></div>Date: Thu, 22 Jan 2015 05:36:18 -0700</span><br style="font-size:13px"><span style="font-size:13px">From: Matthew Flatt <</span><a href="mailto:mflatt@cs.utah.edu" style="font-size:13px">mflatt@cs.utah.edu</a><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">To: Byron Davies <</span><a href="mailto:byrondavies@starshine.us" style="font-size:13px">byrondavies@starshine.us</a><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">Cc: </span><a href="mailto:dev@racket-lang.org" style="font-size:13px"><span class="">dev</span>@racket-lang.org</a><br style="font-size:13px"><span style="font-size:13px">Subject: Re: [racket-</span><span class="" style="font-size:13px">dev</span><span style="font-size:13px">] </span><span class="" style="font-size:13px">Full</span><span style="font-size:13px"> </span><span class="" style="font-size:13px">transparency</span><br style="font-size:13px"><span style="font-size:13px">Message-ID: <</span><a href="mailto:20150122123620.2DAA16501A2@mail-svr1.cs.utah.edu" style="font-size:13px">20150122123620.2DAA16501A2@mail-svr1.cs.utah.edu</a><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">Content-Type: text/plain; charset=UTF-8</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">I don't think you want to do anything with the compiler or macros.</span><br style="font-size:13px"><span style="font-size:13px">Instead, it's a matter of having a sufficiently powerful inspector</span><br style="font-size:13px"><span style="font-size:13px">(which is the concept of "inspectability" turned into a language</span><br style="font-size:13px"><span style="font-size:13px">construct).</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">If you have just</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (struct a (x))</span><br style="font-size:13px"><span style="font-size:13px"> (a 1)</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">then the result will print as `#<a>`. But if you use</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (define orig-i (current-inspector))</span><br style="font-size:13px"><span style="font-size:13px"> (define sub-i (make-inspector orig-i))</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (current-inspector sub-i)</span><br style="font-size:13px"><span style="font-size:13px"> (struct a (x))</span><br style="font-size:13px"><span style="font-size:13px"> (define v (a 1))</span><br style="font-size:13px"><span style="font-size:13px"> (current-inspector orig-i)</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> v</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">Then, the result will print as `(a 1)`. That's because the structure</span><br style="font-size:13px"><span style="font-size:13px">declaration is creates under an inspector `sub-i` (which is the current</span><br style="font-size:13px"><span style="font-size:13px">inspector at the time) that is subordinate to the inspector `orig-i`</span><br style="font-size:13px"><span style="font-size:13px">that is in place when the structure instance is printed.</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">The current inspector is determined dynamically, which means that if</span><br style="font-size:13px"><span style="font-size:13px">you're loading some code, you can set the inspector while loading the</span><br style="font-size:13px"><span style="font-size:13px">code. For example, if "a.rkt" is</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> #lang racket/base</span><br style="font-size:13px"><span style="font-size:13px"> (provide v)</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (struct a (x))</span><br style="font-size:13px"><span style="font-size:13px"> (define v (a 1))</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">then</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (define v</span><br style="font-size:13px"><span style="font-size:13px">   (parameterize ([current-inspector (make-inspector)])</span><br style="font-size:13px"><span style="font-size:13px">     (dynamic-require "a.rkt" 'v)))</span><br style="font-size:13px"><span style="font-size:13px"> v</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">will print the `a` instance transparently.</span><br style="font-size:13px"><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">To protect libraries, there's no safe way to access a root inspector</span><br style="font-size:13px"><span style="font-size:13px">that controls all structure types when you start Racket. Nothing is</span><br style="font-size:13px"><span style="font-size:13px">safe from unsafe code, though, and here's an unsafe way to access the</span><br style="font-size:13px"><span style="font-size:13px">root inspector:</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> #lang racket/base</span><br style="font-size:13px"><span style="font-size:13px"> (require ffi/unsafe)</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (define-cstruct _Scheme_Inspector</span><br style="font-size:13px"><span style="font-size:13px">   ([stag _short]</span><br style="font-size:13px"><span style="font-size:13px">    [keyex _short]</span><br style="font-size:13px"><span style="font-size:13px">    [depth _int]</span><br style="font-size:13px"><span style="font-size:13px">    [superior _racket]))</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px"> (define root-inspector</span><br style="font-size:13px"><span style="font-size:13px">   (Scheme_Inspector-superior</span><br style="font-size:13px"><span style="font-size:13px">    ((get-ffi-obj 'scheme_get_initial_inspector</span><br style="font-size:13px"><span style="font-size:13px">                  #f</span><br style="font-size:13px"><span style="font-size:13px">                  (_fun -> (_gcable _Scheme_Inspector-pointer)))))</span><span style="font-size:13px">)</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">Using `root-inspector`, you can inspect any structure instance.</span><br style="font-size:13px"><br style="font-size:13px"><span style="font-size:13px">At Wed, 21 Jan 2015 23:46:10 -0700, Byron Davies wrote:</span><br style="font-size:13px"><span style="font-size:13px">> Nice parry!  What may be straightforward to you may not be so obvious to</span><br style="font-size:13px"><span style="font-size:13px">> me.  But I'll take a look.</span><br style="font-size:13px"><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> I'm deep into a project using Racket for weakest precondition analysis.</span><br style="font-size:13px"><span style="font-size:13px">> Every time I'm debugging it seems like I have to write another</span><br style="font-size:13px"><span style="font-size:13px">> special-purpose accessor, or export some existing accessor up through</span><br style="font-size:13px"><span style="font-size:13px">> multiple levels in order to get at the data I need at the top-level.  I</span><br style="font-size:13px"><span style="font-size:13px">> remember how easy it was with the Lisp Machine to navigate through data no</span><br style="font-size:13px"><span style="font-size:13px">> matter what it was.</span><br style="font-size:13px"><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> The Lisp Machine offered total </span><span class="" style="font-size:13px">transparency</span><span style="font-size:13px">, with no real way to protect</span><br style="font-size:13px"><span style="font-size:13px">> data, to the benefit of the developer.  Racket offers total opacity, to the</span><br style="font-size:13px"><span style="font-size:13px">> benefit of code security.  I'm hoping there's a middle ground, where</span><br style="font-size:13px"><span style="font-size:13px">> </span><span class="" style="font-size:13px">transparency</span><span style="font-size:13px"> can be turned on and off.</span><br style="font-size:13px"><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> Byron</span><br style="font-size:13px"><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> On Wed, Jan 21, 2015 at 12:20 PM, Matthias Felleisen <</span><a href="mailto:matthias@ccs.neu.edu" style="font-size:13px">matthias@ccs.neu.edu</a><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> wrote:</span><br style="font-size:13px"><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> ></span><br style="font-size:13px"><span style="font-size:13px">> > Sounds like a straightforward change to the existing macros. Why don't you</span><br style="font-size:13px"><span style="font-size:13px">> > create a fork and experiment?</span><br style="font-size:13px"><span style="font-size:13px">> ></span><br style="font-size:13px"><span style="font-size:13px">> ></span><br style="font-size:13px"><span style="font-size:13px">> > On Jan 21, 2015, at 1:15 PM, Byron Davies <</span><a href="mailto:byrondavies@starshine.us" style="font-size:13px">byrondavies@starshine.us</a><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> > wrote:</span><br style="font-size:13px"><span style="font-size:13px">> ></span><br style="font-size:13px"><span style="font-size:13px">> > > Or, more conservatively, every struct and object in a given package,</span><br style="font-size:13px"><span style="font-size:13px">> > file, or set of files.</span><br style="font-size:13px"><span style="font-size:13px">> > ></span><br style="font-size:13px"><span style="font-size:13px">> > > On Wed, Jan 21, 2015 at 11:03 AM, Byron Davies <</span><a href="mailto:byrondavies@starshine.us" style="font-size:13px">byrondavies@starshine.us</a><span style="font-size:13px">></span><br style="font-size:13px"><span style="font-size:13px">> > wrote:</span><br style="font-size:13px"><span style="font-size:13px">> > > Would it be easy to create a compiler flag that would make every struct</span><br style="font-size:13px"><span style="font-size:13px">> > and object </span><span class="" style="font-size:13px">transparent</span><span style="font-size:13px">?  This would then make it easy to create a Lisp</span><br style="font-size:13px"><span style="font-size:13px">> > Machine-style Inspector that would be able to roam through every data</span><br style="font-size:13px"><span style="font-size:13px">> > structure during debugging.</span><br style="font-size:13px"><span style="font-size:13px">> > ></span><br style="font-size:13px"><span style="font-size:13px">> > > Byron</span><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 22, 2015 at 5:36 AM,  <span dir="ltr"><<a href="mailto:dev-request@racket-lang.org" target="_blank">dev-request@racket-lang.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Send dev mailing list submissions to<br>
        <a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="http://lists.racket-lang.org/dev/listinfo" target="_blank">http://lists.racket-lang.org/dev/listinfo</a><br>
or, via email, send a message with subject or body 'help' to<br>
        <a href="mailto:dev-request@racket-lang.org">dev-request@racket-lang.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:dev-owner@racket-lang.org">dev-owner@racket-lang.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than "Re: Contents of dev digest..."<br>
<br>
<br>
[Racket Developers list:<br>
 <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a> ]<br>
<br>
<br>
Today's Topics:<br>
<br>
   1. Full transparency (Byron Davies)<br>
   2. Re: Full transparency (Byron Davies)<br>
   3. Re: Full transparency (Matthias Felleisen)<br>
   4. Re: Full transparency (Byron Davies)<br>
   5. Literal constants (Jens Axel S?gaard)<br>
   6. Re: Full transparency (Matthew Flatt)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Wed, 21 Jan 2015 11:03:49 -0700<br>
From: Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
To: <a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a><br>
Subject: [racket-dev] Full transparency<br>
Message-ID:<br>
        <CAAQ2ZgmJ1LiZBCRxoDY9as=BnTjtPaY2CKcp3CvG+5rqMX2D=<a href="mailto:g@mail.gmail.com">g@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Would it be easy to create a compiler flag that would make every struct and<br>
object transparent?  This would then make it easy to create a Lisp<br>
Machine-style Inspector that would be able to roam through every data<br>
structure during debugging.<br>
<br>
Byron<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="http://lists.racket-lang.org/dev/archive/attachments/20150121/211388c2/attachment-0001.html" target="_blank">http://lists.racket-lang.org/dev/archive/attachments/20150121/211388c2/attachment-0001.html</a>><br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Wed, 21 Jan 2015 11:15:04 -0700<br>
From: Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
To: <a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a><br>
Subject: Re: [racket-dev] Full transparency<br>
Message-ID:<br>
        <CAAQ2Zgkp1xyHah7h5BOANTFvKH4ZiQM70v4CLcaEv7G_dp=<a href="mailto:a_A@mail.gmail.com">a_A@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Or, more conservatively, every struct and object in a given package, file,<br>
or set of files.<br>
<br>
On Wed, Jan 21, 2015 at 11:03 AM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
wrote:<br>
<br>
> Would it be easy to create a compiler flag that would make every struct<br>
> and object transparent?  This would then make it easy to create a Lisp<br>
> Machine-style Inspector that would be able to roam through every data<br>
> structure during debugging.<br>
><br>
> Byron<br>
><br>
><br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="http://lists.racket-lang.org/dev/archive/attachments/20150121/5cdd98ac/attachment-0001.html" target="_blank">http://lists.racket-lang.org/dev/archive/attachments/20150121/5cdd98ac/attachment-0001.html</a>><br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Wed, 21 Jan 2015 14:20:44 -0500<br>
From: Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>><br>
To: Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
Cc: <a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a><br>
Subject: Re: [racket-dev] Full transparency<br>
Message-ID: <<a href="mailto:DEE2064C-8018-42E4-B082-A143D2D43720@ccs.neu.edu">DEE2064C-8018-42E4-B082-A143D2D43720@ccs.neu.edu</a>><br>
Content-Type: text/plain; charset=us-ascii<br>
<br>
<br>
Sounds like a straightforward change to the existing macros. Why don't you create a fork and experiment?<br>
<br>
<br>
On Jan 21, 2015, at 1:15 PM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>> wrote:<br>
<br>
> Or, more conservatively, every struct and object in a given package, file, or set of files.<br>
><br>
> On Wed, Jan 21, 2015 at 11:03 AM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>> wrote:<br>
> Would it be easy to create a compiler flag that would make every struct and object transparent?  This would then make it easy to create a Lisp Machine-style Inspector that would be able to roam through every data structure during debugging.<br>
><br>
> Byron<br>
><br>
><br>
> _________________________<br>
>  Racket Developers list:<br>
>  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 4<br>
Date: Wed, 21 Jan 2015 23:46:10 -0700<br>
From: Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
To: Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>><br>
Cc: <a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a><br>
Subject: Re: [racket-dev] Full transparency<br>
Message-ID:<br>
        <<a href="mailto:CAAQ2Zgkht1qLKbT-C3SuQEUhSaPpTR8zCR4%2BywA0yybpyejuEA@mail.gmail.com">CAAQ2Zgkht1qLKbT-C3SuQEUhSaPpTR8zCR4+ywA0yybpyejuEA@mail.gmail.com</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Nice parry!  What may be straightforward to you may not be so obvious to<br>
me.  But I'll take a look.<br>
<br>
I'm deep into a project using Racket for weakest precondition analysis.<br>
Every time I'm debugging it seems like I have to write another<br>
special-purpose accessor, or export some existing accessor up through<br>
multiple levels in order to get at the data I need at the top-level.  I<br>
remember how easy it was with the Lisp Machine to navigate through data no<br>
matter what it was.<br>
<br>
The Lisp Machine offered total transparency, with no real way to protect<br>
data, to the benefit of the developer.  Racket offers total opacity, to the<br>
benefit of code security.  I'm hoping there's a middle ground, where<br>
transparency can be turned on and off.<br>
<br>
Byron<br>
<br>
On Wed, Jan 21, 2015 at 12:20 PM, Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>><br>
wrote:<br>
<br>
><br>
> Sounds like a straightforward change to the existing macros. Why don't you<br>
> create a fork and experiment?<br>
><br>
><br>
> On Jan 21, 2015, at 1:15 PM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
> wrote:<br>
><br>
> > Or, more conservatively, every struct and object in a given package,<br>
> file, or set of files.<br>
> ><br>
> > On Wed, Jan 21, 2015 at 11:03 AM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
> wrote:<br>
> > Would it be easy to create a compiler flag that would make every struct<br>
> and object transparent?  This would then make it easy to create a Lisp<br>
> Machine-style Inspector that would be able to roam through every data<br>
> structure during debugging.<br>
> ><br>
> > Byron<br>
> ><br>
> ><br>
> > _________________________<br>
> >  Racket Developers list:<br>
> >  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
><br>
><br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="http://lists.racket-lang.org/dev/archive/attachments/20150121/a72aa3f8/attachment-0001.html" target="_blank">http://lists.racket-lang.org/dev/archive/attachments/20150121/a72aa3f8/attachment-0001.html</a>><br>
<br>
------------------------------<br>
<br>
Message: 5<br>
Date: Thu, 22 Jan 2015 11:24:25 +0100<br>
From: Jens Axel S?gaard <<a href="mailto:jensaxel@soegaard.net">jensaxel@soegaard.net</a>><br>
To: "<a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a>" <<a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a>><br>
Subject: [racket-dev] Literal constants<br>
Message-ID:<br>
        <<a href="mailto:CABefVgzAMjrhYDMCke-1Oo_ynZ7AAovh06ePe3WG-YKKqFTGCg@mail.gmail.com">CABefVgzAMjrhYDMCke-1Oo_ynZ7AAovh06ePe3WG-YKKqFTGCg@mail.gmail.com</a>><br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
This program returns #f - I was expecting to see #t.<br>
<br>
    #lang racket<br>
    (define a '(1 2 3))<br>
    (define b '(1 2 3))<br>
    (eq? a b)<br>
<br>
Why not guarantee uniqueness of  literals occurring in the same module?<br>
<br>
/Jens Axel<br>
<br>
<br>
------------------------------<br>
<br>
Message: 6<br>
Date: Thu, 22 Jan 2015 05:36:18 -0700<br>
From: Matthew Flatt <<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>><br>
To: Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
Cc: <a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a><br>
Subject: Re: [racket-dev] Full transparency<br>
Message-ID: <<a href="mailto:20150122123620.2DAA16501A2@mail-svr1.cs.utah.edu">20150122123620.2DAA16501A2@mail-svr1.cs.utah.edu</a>><br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
I don't think you want to do anything with the compiler or macros.<br>
Instead, it's a matter of having a sufficiently powerful inspector<br>
(which is the concept of "inspectability" turned into a language<br>
construct).<br>
<br>
If you have just<br>
<br>
 (struct a (x))<br>
 (a 1)<br>
<br>
then the result will print as `#<a>`. But if you use<br>
<br>
 (define orig-i (current-inspector))<br>
 (define sub-i (make-inspector orig-i))<br>
<br>
 (current-inspector sub-i)<br>
 (struct a (x))<br>
 (define v (a 1))<br>
 (current-inspector orig-i)<br>
<br>
 v<br>
<br>
Then, the result will print as `(a 1)`. That's because the structure<br>
declaration is creates under an inspector `sub-i` (which is the current<br>
inspector at the time) that is subordinate to the inspector `orig-i`<br>
that is in place when the structure instance is printed.<br>
<br>
The current inspector is determined dynamically, which means that if<br>
you're loading some code, you can set the inspector while loading the<br>
code. For example, if "a.rkt" is<br>
<br>
 #lang racket/base<br>
 (provide v)<br>
<br>
 (struct a (x))<br>
 (define v (a 1))<br>
<br>
then<br>
<br>
 (define v<br>
   (parameterize ([current-inspector (make-inspector)])<br>
     (dynamic-require "a.rkt" 'v)))<br>
 v<br>
<br>
will print the `a` instance transparently.<br>
<br>
<br>
To protect libraries, there's no safe way to access a root inspector<br>
that controls all structure types when you start Racket. Nothing is<br>
safe from unsafe code, though, and here's an unsafe way to access the<br>
root inspector:<br>
<br>
 #lang racket/base<br>
 (require ffi/unsafe)<br>
<br>
 (define-cstruct _Scheme_Inspector<br>
   ([stag _short]<br>
    [keyex _short]<br>
    [depth _int]<br>
    [superior _racket]))<br>
<br>
 (define root-inspector<br>
   (Scheme_Inspector-superior<br>
    ((get-ffi-obj 'scheme_get_initial_inspector<br>
                  #f<br>
                  (_fun -> (_gcable _Scheme_Inspector-pointer))))))<br>
<br>
Using `root-inspector`, you can inspect any structure instance.<br>
<br>
At Wed, 21 Jan 2015 23:46:10 -0700, Byron Davies wrote:<br>
> Nice parry!  What may be straightforward to you may not be so obvious to<br>
> me.  But I'll take a look.<br>
><br>
> I'm deep into a project using Racket for weakest precondition analysis.<br>
> Every time I'm debugging it seems like I have to write another<br>
> special-purpose accessor, or export some existing accessor up through<br>
> multiple levels in order to get at the data I need at the top-level.  I<br>
> remember how easy it was with the Lisp Machine to navigate through data no<br>
> matter what it was.<br>
><br>
> The Lisp Machine offered total transparency, with no real way to protect<br>
> data, to the benefit of the developer.  Racket offers total opacity, to the<br>
> benefit of code security.  I'm hoping there's a middle ground, where<br>
> transparency can be turned on and off.<br>
><br>
> Byron<br>
><br>
> On Wed, Jan 21, 2015 at 12:20 PM, Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>><br>
> wrote:<br>
><br>
> ><br>
> > Sounds like a straightforward change to the existing macros. Why don't you<br>
> > create a fork and experiment?<br>
> ><br>
> ><br>
> > On Jan 21, 2015, at 1:15 PM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
> > wrote:<br>
> ><br>
> > > Or, more conservatively, every struct and object in a given package,<br>
> > file, or set of files.<br>
> > ><br>
> > > On Wed, Jan 21, 2015 at 11:03 AM, Byron Davies <<a href="mailto:byrondavies@starshine.us">byrondavies@starshine.us</a>><br>
> > wrote:<br>
> > > Would it be easy to create a compiler flag that would make every struct<br>
> > and object transparent?  This would then make it easy to create a Lisp<br>
> > Machine-style Inspector that would be able to roam through every data<br>
> > structure during debugging.<br>
> > ><br>
> > > Byron<br>
> > ><br>
> > ><br>
> > > _________________________<br>
> > >  Racket Developers list:<br>
> > >  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
> ><br>
> ><br>
> _________________________<br>
>   Racket Developers list:<br>
>   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
<br>
<br>
End of dev Digest, Vol 72, Issue 31<br>
***********************************<br>
</blockquote></div><br></div>