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