<p>The big argument last can make sense. My style may rely too much on &#39;rest&#39; arguments... for the code I seem to write, sometimes big arguments are relatively fixed so I write fake monad-like macros to sweeten the code a bit. E.g., in a simple interpreter continuously using an environment a-list. Avoiding globals and set! means your procedures always end up with these kinds of accumulators which are syntactically noisy. Putting them last means you can&#39;t use &#39;rest&#39; arguments, itself often very sweet.</p>

<div class="gmail_quote">On May 16, 2011 10:10 AM, &quot;Hendrik Boom&quot; &lt;<a href="mailto:hendrik@topoi.pooq.com">hendrik@topoi.pooq.com</a>&gt; wrote:<br type="attribution">&gt; On Mon, May 16, 2011 at 10:00:20AM -0400, Matthias Felleisen wrote:<br>
&gt;&gt; <br>&gt;&gt; Bottom line: you are correct. First, consistency <br>&gt;&gt; matters and Racket is inconsistent in this regard. <br>&gt;&gt; Second, placement of &#39;major&#39; arguments matter (I <br>&gt;&gt; dislike your use of &#39;container&#39; here but I figure<br>
&gt;&gt; I know where you come from). <br>&gt;&gt; <br>&gt;&gt; re: consistency. Racket, like most languages, is <br>&gt;&gt; a historically grown, organic artifact. As such <br>&gt;&gt; various historical accidents have shaped the language. <br>
&gt;&gt; As the designers of artifacts, we should take the time<br>&gt;&gt; to fix such inconsistencies on a regular basis, but we<br>&gt;&gt; haven&#39;t -- partly because of legacy code and partly <br>&gt;&gt; because these inconsistencies don&#39;t rank as high on <br>
&gt;&gt; our list as other problems we need to fix. <br>&gt;&gt; <br>&gt;&gt; re: major argument. In contrast to OOPLs, FPLs have<br>&gt;&gt; wrestled with this issue for decades. Eli points out<br>&gt;&gt; amusing little programming &#39;tricks&#39; that shaped some<br>
&gt;&gt; interfaces -- and it is sad because it reveals that we<br>&gt;&gt; lack(ed) a design philosophy. <br>&gt;&gt; <br>&gt;&gt; In my personal opinion, we should design interfaces<br>&gt;&gt; like this: <br>&gt;&gt; <br>
&gt;&gt;  f1 : major-arg minor-arg1 ... -&gt; result1 <br>&gt;&gt;  f2 : major-arg minor-arg2 ... -&gt; result2<br>&gt;&gt;  ...<br>&gt;&gt;  fn : major-arg minor-argn ... -&gt; resultn<br>&gt;&gt; <br>&gt;&gt; where these things are types or contracts for many <br>
&gt;&gt; reasons. A side effect would be that readers would <br>&gt;&gt; notice how close FP is to OOP and that programming <br>&gt;&gt; well in either world takes reasonably similar design <br>&gt;&gt; principles. <br>&gt;&gt; <br>
&gt;&gt; (Plus, if you decide to switch to our classes, just <br>&gt;&gt; eliminate major-arg and you have method definitions.) <br>&gt; <br>&gt; I&#39;ve found it useful to make the argument that is most likely to be a <br>
&gt; large amount of code the last argument.  Often, this argument is a <br>&gt; function, coded as an inline lambda-expression.  Ths tends to lead to <br>&gt; the least bracketcounting to figure out what&#39;s an argument to what.<br>
&gt; <br>&gt; -- hendrik<br>&gt; _________________________________________________<br>&gt;   For list-related administrative tasks:<br>&gt;   <a href="http://lists.racket-lang.org/listinfo/users">http://lists.racket-lang.org/listinfo/users</a><br>
</div>