This topic comes up so frequently (schemes structure accessors/mutators) , and has been independently solved in and around the same conceptual solution (a chaining dot syntax) that I&#39;ve often wondered why Racket would not make such a capability &quot;core&quot; to the language.  It seems such an obvious absolutely should (to some) that I&#39;m interested in hearing the counter position of why it should not.<div>
<br></div><div>Thanks,</div><div><br></div><div>Ray<br><br><div class="gmail_quote">On Wed, Aug 18, 2010 at 10:52 AM, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
Eduardo is providing a macro that helps you abbreviate complex<br>
selector and mutator chains. The BENFIT you get is that instead<br>
of writing<br>
<br>
  (posn-x (bird-posn (sky-bird (world-sky some-world))))<br>
<br>
you can write -- in Racket --<br>
<br>
  some-world.sky.bird.posn.x<br>
<br>
and make Racket programs look as short as C program selectors<br>
or Java dots or Javascript dots etc.<br>
<br>
The PRICE you pay is that you annotate variables and fields<br>
with struct information. That is, you have to say somewhere that<br>
some-world is a variable that always stands for a world struct.<br>
And the sky field in world has to come with information that it<br>
always is a sky-struct. And so on.<br>
<br>
;; ---<br>
<br>
To make this available in Racket, you&#39;d have to port his macros<br>
from R6RS Scheme to Racket. I suspect that this would be a minor<br>
task.<br>
<br>
;; ---<br>
<br>
To make this available in the teaching languages, you&#39;d have to<br>
export these macros in a way that makes sense for students. Or<br>
you keep it all private to yourself.<br>
<br>
;; ---<br>
<br>
I assume that you understand the differences between the various<br>
operations.  In Java,<br>
<br>
  pos.draw<br>
<br>
comes with static knowledge about pos (an object of a certain type)<br>
and draw (a field of a certain type) that is exploited to make the<br>
notation short and safe. It isn&#39;t complete safe because of NULL,<br>
which doesn&#39;t exist in Racket or the teaching languages, but let&#39;s<br>
ignore that.<br>
<br>
In a language like Ruby,<br>
<br>
 pos.draw<br>
<br>
just doesn&#39;t care, If pos has an draw field at run-time, good enough.<br>
Even if pos isn&#39;t a position but happens to have a draw field, just<br>
keep on computing.<br>
<br>
In Racket and the teaching languages, you are *forced* to write<br>
down what kind of struct you expect and what field you want:<br>
<br>
 pos.check-it-is-a-posn-and-select-x-then<br>
<br>
This gives you safety a la Java (at run-time) and tells the reader<br>
at each site where you write down a selector expression what you<br>
expect. It&#39;s verbose but readable.<br>
<div><div></div><div class="h5"><br>
<br>
<br>
<br>
On Aug 18, 2010, at 10:34 AM, Mathew Kurian wrote:<br>
<br>
&gt;<br>
&gt;<br>
&gt; On Wed, Aug 18, 2010 at 2:41 AM, Eduardo Cavazos &lt;<a href="mailto:wayo.cavazos@gmail.com">wayo.cavazos@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Mathew Kurian:<br>
&gt;<br>
&gt; However, in the case of universe/world teachpacks, where the use of<br>
&gt; states is a vital component, a set of code can get very long,<br>
&gt; especially if the program is very complex and contains multiple<br>
&gt; structures (in some cases structures inside structures inside<br>
&gt; structures) within the states.<br>
&gt;<br>
&gt; I agree with the critique of lengthy expressions involving nested records (structs).<br>
&gt;<br>
&gt; Here&#39;s how I deal with it:<br>
&gt;<br>
&gt;    <a href="http://gist.github.com/364754" target="_blank">http://gist.github.com/364754</a><br>
&gt;<br>
&gt; The particular solution is for R6RS but PLT has the necessary mechanisms for it.<br>
&gt;<br>
&gt; Ed<br>
&gt;<br>
&gt; Hey Ed,<br>
&gt;<br>
&gt; If you have spare time, can you please explain by what you meant in that github website. All I saw was a comparison between C and Scheme.<br>
&gt;<br>
&gt; Thank you<br>
&gt;<br>
&gt; Mathew K.<br>
&gt;<br>
&gt;<br>
</div></div><div><div></div><div class="h5">&gt; _________________________________________________<br>
&gt;  For list-related administrative tasks:<br>
&gt;  <a href="http://lists.racket-lang.org/listinfo/users" target="_blank">http://lists.racket-lang.org/listinfo/users</a><br>
<br>
_________________________________________________<br>
  For list-related administrative tasks:<br>
  <a href="http://lists.racket-lang.org/listinfo/users" target="_blank">http://lists.racket-lang.org/listinfo/users</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>The object of life is not to be on the side of the majority, but to escape finding oneself in the ranks of the insane. - Marcus Aurelius <br>
</div>