title: Does for/list do an unnecessary reverse?
body: <p>I was poking around in the Macro Stepper for the first time and noticed that a <code>for/list</code> expanded into code involving something called <code>alt-reverse</code>. Does <code>for/list</code> cons each item onto the front of an empty list and then reverse it? That seems very inefficient.</p>
  
  <p>I wrote a little test:</p>
  
  <pre><code>(define (test n)
    (time
      (for/list ([x (in-range n)])
        (list x x)))
    (time
      (for/fold ([result '()])
                ([x (in-range n)])
        (cons (list x x) result)))
    (void))
  </code></pre>
  
  <p>Indeed the <code>for/list</code> version runs in about 150% of the time of <code>for/fold</code> without <code>reverse</code>, the difference apparently due entirely to additional garbage collection:</p>
  
  <pre><code>&gt; (test 500000)
  cpu time: 1059 real time: 2079 gc time: 940
  cpu time: 614 real time: 1231 gc time: 550
  &gt; (test 500000)
  cpu time: 1060 real time: 3889 gc time: 907
  cpu time: 770 real time: 1363 gc time: 699
  &gt; (test 500000)
  cpu time: 1035 real time: 2479 gc time: 917
  cpu time: 736 real time: 2535 gc time: 651
  </code></pre>
  
  <p>It sounds like I shouldn't get in the habit of calling <code>for/list</code>. Is there a more efficient way to make a list in "forward" order (i.e. where the last item evaluated is the last item in the list)?</p>