<div class="gmail_quote">---------- Forwarded message ----------<br>From: &quot;Sean Kemplay&quot; &lt;<a href="mailto:sean.kemplay@gmail.com">sean.kemplay@gmail.com</a>&gt;<br>Date: Jul 31, 2012 2:32 PM<br>Subject: Re: [racket] Tabulate from build-list<br>
To: &quot;Matthias Felleisen&quot; &lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt;<br><br type="attribution">Thanks Matthias,<br>
<br>
(define (tabulate f n)<br>
  (build-list (+ n 1) (lambda (x) (f (- n x)))))<br>
<br>
I am glad I went the other way as well - I learnt something<br>
implementing it - and a lot from the transformation to the one liner.<br>
<br>
Kind regards,<br>
Sean<br>
<br>
On Tue, Jul 31, 2012 at 1:43 PM, Matthias Felleisen<br>
<div class="elided-text">&lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt; wrote:<br>
&gt;<br>
&gt; Some suggestions:<br>
&gt;<br>
&gt; 1. (+ (* -1 x) y) is (- y x)<br>
&gt; 2. f is in scope of the entire definition; there is no need to pass it along.<br>
&gt; 3. Once you fix 2, you see that g == (inverter n) == (lambda (x) (f (- n x))<br>
&gt; 4. So why not replace all occurrences of g with the lambda expression?<br>
&gt;<br>
&gt; Voilą, you have a one-line definition. Send it back when done.<br>
&gt;<br>
&gt;<br>
&gt; On Jul 31, 2012, at 8:12 AM, Sean Kemplay wrote:<br>
&gt;<br>
&gt;&gt; Ok, not sure if I went down the same route as Matthias was alluding to<br>
&gt;&gt; but here is my solution -<br>
&gt;&gt;<br>
&gt;&gt; (define (tabulate f n)<br>
&gt;&gt;  (local<br>
&gt;&gt;    ((define (inverter y f) (lambda (x) (f (+ (* x -1) y))))<br>
&gt;&gt;     (define g (inverter n f)))<br>
&gt;&gt;     (build-list (+ n 1) g)))<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; (check-expect (tabulate (lambda (x) x) 3) &#39;(3 2 1 0))<br>
&gt;&gt;<br>
&gt;&gt; I used a curried function to &#39;invert&#39; each number in place before the<br>
&gt;&gt; function provided to build list is applied.<br>
&gt;&gt;<br>
&gt;&gt; Regards,<br>
&gt;&gt; Sean<br>
&gt;&gt;<br>
&gt;&gt; On Mon, Jul 30, 2012 at 10:32 PM, Matthias Felleisen<br>
&gt;&gt; &lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Here is how I suggest our freshmen to find this function:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ;; tabulate : (x -&gt; y) Nat -&gt;  (listof y) ;; &lt;------- MF: not fix of signature<br>
&gt;&gt;&gt; ;; to tabulate f between n<br>
&gt;&gt;&gt; ;; and 0 (inclusive) in a list<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (check-expect (tabulate (lambda (x) x) 3) &#39;(3 2 1 0))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (define (tabulate.v0 f n)<br>
&gt;&gt;&gt; (cond<br>
&gt;&gt;&gt;   [(= n 0) (list (f 0))]<br>
&gt;&gt;&gt;   [else<br>
&gt;&gt;&gt;     (cons (f n)<br>
&gt;&gt;&gt;        (tabulate f (sub1 n)))]))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ;; Using build-list<br>
&gt;&gt;&gt; ;; build-list : N (N  -&gt;  X)  -&gt;  (listof X)<br>
&gt;&gt;&gt; ;; to construct (list (f 0) ... (f (- n 1)))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (define (tabulate f n)<br>
&gt;&gt;&gt;  (local (;; Nat -&gt; Y ;; &lt;-------------- MF: you know you want build-list, design (!) the &#39;loop&#39; function now<br>
&gt;&gt;&gt;          (define (g i) ... f n i ...)) ;; &lt;---- this is the data that&#39;s available<br>
&gt;&gt;&gt;    (build-list (+ n 1) g)))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Also see &#39;2e&#39;.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Jul 30, 2012, at 4:10 PM, Sean Kemplay wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Hello,<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I am looking at the exercise from htdp 1e on building the tabulate<br>
&gt;&gt;&gt;&gt; function from build-list.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Would I be on the right track that I need to create a function to<br>
&gt;&gt;&gt;&gt; reverse the result of (build-list (+ n 1) f) to do this?<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; the function this is to emulate -<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; ;; tabulate : (x -&gt; y) x -&gt;  (listof y)<br>
&gt;&gt;&gt;&gt; ;; to tabulate f between n<br>
&gt;&gt;&gt;&gt; ;; and 0 (inclusive) in a list<br>
&gt;&gt;&gt;&gt; (define (tabulate f n)<br>
&gt;&gt;&gt;&gt; (cond<br>
&gt;&gt;&gt;&gt;   [(= n 0) (list (f 0))]<br>
&gt;&gt;&gt;&gt;   [else<br>
&gt;&gt;&gt;&gt;     (cons (f n)<br>
&gt;&gt;&gt;&gt;      (tabulate f (sub1 n)))]))<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Using build-list<br>
&gt;&gt;&gt;&gt; ;; build-list : N (N  -&gt;  X)  -&gt;  (listof X)<br>
&gt;&gt;&gt;&gt; ;; to construct (list (f 0) ... (f (- n 1)))<br>
&gt;&gt;&gt;&gt; (define (build-list n f) ...)<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Regards,<br>
&gt;&gt;&gt;&gt; Sean<br>
&gt;&gt;&gt;&gt; ____________________<br>
&gt;&gt;&gt;&gt; Racket Users list:<br>
&gt;&gt;&gt;&gt; <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;&gt;&gt;<br>
&gt;<br>
</div></div>