Hi Matt,<div><br></div><div>Thanks, what you wrote makes perfect sense (of course... that&#39;s what I get for programming at such hours!)</div><div><br></div><div>Anyway, working code included below and the main purpose of learning about classes in Racket helped along the way. </div>
<div><br></div><div>To take a step back and look at what I&#39;ve &quot;accomplished&quot; in this exercise:</div><div><br></div><div>1) I was able to re-use the rational-rep code in gencontfrac% which was the main intent.</div>
<div>2) rational-rep calls expand-repeat which in the base class calls a client-provided function called repeat, in the sqrtcontfrac% subclass expand-repeat uses a list called repeatlst instead of the function</div><div>3) in sqrtcontfrac% repeat is set to #&lt;void&gt;.   The is-a relationship is not honored by what I&#39;ve done.</div>
<div><br></div><div>Questions:</div><div>1)  Is what I&#39;ve done an abomination?  Am I simply abusing inheritance?</div><div>2)  To make the code below work, I had to make expand-repeat public as I couldn&#39;t override a private function.  Is there another way (something like &quot;protected&quot; in C++)?</div>
<div><br></div><div>Thanks again!</div><div>-Joe</div><div><br></div><div><br></div><div><div>(module contfrac racket</div><div>  (require racket/class)</div><div>  (provide gencontfrac%)</div><div>  (provide sqrtcontfrac%)</div>
<div>  </div><div>  ; class that represents the continued fraction of a general irrational number and acts as a base class for continued fractions of other sorts</div><div>  (define gencontfrac% </div><div>    (class object%</div>
<div>      (super-new)</div><div>      (init-field start)</div><div>      (init-field repeat)</div><div>      ; create a n-long list of repeat digits (in reverse order - which makes creation of a rational easier)</div><div>
      (define/public (expand-repeat n)</div><div>        (let lp ([c n] [rl &#39;()])</div><div>          (if (zero? c) rl (lp (sub1 c) (cons (repeat) rl)))))</div><div>      ; create a rational representation using the passed number of repeat digits</div>
<div>      (define/public (rational-rep n)</div><div>        (define rdiglst (expand-repeat n))</div><div>        (let lp ([rdigs (rest rdiglst)] [res (first rdiglst)])</div><div>          (if (empty? rdigs) (+ start (/ 1 res)) (lp (rest rdigs) (+ (first rdigs) (/ 1 res))))))</div>
<div>      ; display the continued fraction</div><div>      (define/public (show)</div><div>        (printf &quot;[~a; ~a]~n&quot; start repeat))</div><div>      ))</div><div>  </div><div>  ; define a class that represents the continued fraction of a square root</div>
<div>  (define sqrtcontfrac% </div><div>    (class gencontfrac%</div><div>      (init sqrval)</div><div>      (define repeatlst (build-repeatlst sqrval))</div><div>      (super-new [start (integer-sqrt sqrval)] [repeat (void)])</div>
<div>      (inherit rational-rep show)</div><div>      (inherit-field start)</div><div>      ; build the repeating sequence (see <a href="http://en.wikipedia.org/wiki/Continued_fraction">http://en.wikipedia.org/wiki/Continued_fraction</a>)</div>
<div>      (define/private (build-repeatlst n)</div><div>        (define start (integer-sqrt n))</div><div>        (let loop ([adder start] [denom (- n (sqr start))] [result &#39;()])</div><div>          (cond [(zero? denom) &#39;()]  ; perfect square</div>
<div>                [(= 1 denom) (reverse (cons (+ (integer-sqrt n) adder) result))] ; found the end of the repeating sequence</div><div>                [else </div><div>                 (let* ([nextval (quotient (+ adder start) denom)] [nextadd (- (* nextval denom) adder)])</div>
<div>                   (loop nextadd (quotient (- n (sqr nextadd)) denom) (cons nextval result)))])))</div><div>      ; create a n-long list of repeat digits (in reverse order - which makes creation of a rational easier)</div>
<div>      (define/override (expand-repeat n)</div><div>        (let lp ([c n] [rl &#39;()] [stock repeatlst])</div><div>          (if (zero? c) rl (lp (sub1 c) (cons (first stock) rl) (if (empty? (rest stock)) repeatlst (rest stock))))))</div>
<div>      ; accessor</div><div>      (define/public (get-repeatlst) repeatlst)</div><div>      ))</div><div>  )</div></div><div><br></div><div><div><br><div class="gmail_quote">On Sun, May 20, 2012 at 6:49 AM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The problem is that `start&#39; doesn&#39;t get a value for a `sqrtcontfrac%&#39;<br>
instance until `super-new&#39; in `sqrtcontfrac%&#39; is evaluated. But the<br>
expression for the second argument in `super-new&#39; calls `build-repeat&#39;,<br>
so that `build-repeat&#39; tries to use `start&#39; before it has a value.<br>
<br>
I&#39;m not sure of the solution in this case, but it might be to pass the<br>
value for `start&#39; into `build-repeat&#39; instead of trying to get the<br>
value from the `start&#39; field within `build-repeat&#39;.<br>
<div class="im"><br>
At Sun, 20 May 2012 02:06:35 -0700, Joe Gilray wrote:<br>
&gt; I&#39;m trying to learn to use classes in Racket.  I did some successful simple<br>
&gt; experiments then moved on to inheritance.  When I try to use the code<br>
&gt; below, the following code:<br>
&gt;<br>
&gt; (new sqrtcontfrac% [sqrval i])  leads to the message: sqr: expected<br>
&gt; argument of type &lt;number&gt;; given #&lt;undefined&gt;<br>
&gt;<br>
&gt; Why isn&#39;t start being inherited properly?  Any help is appreciated!<br>
&gt;<br>
&gt; Thanks,<br>
&gt; -joe<br>
&gt;<br>
&gt; Here is the class code:<br>
&gt;<br>
&gt; (module contfrac racket<br>
&gt;   (require racket/class)<br>
&gt;   (provide gencontfrac%)<br>
&gt;   (provide sqrtcontfrac%)<br>
&gt;<br>
&gt;   ; class that represents the continued fraction of a general irrational<br>
&gt; number and acts as a base class for continued fractions of other sorts<br>
&gt;   (define gencontfrac%<br>
&gt;     (class object%<br>
&gt;       (super-new)<br>
</div>&gt;       (init-field start) *; here start is defined*<br>
<div><div class="h5">&gt;       (init-field repeat)<br>
&gt;       ; create a n-long list of repeat digits (in reverse order - which<br>
&gt; makes creation of a rational easier)<br>
&gt;       (define/private (expand-repeat n)<br>
&gt;         (let lp ([c n] [rl &#39;()])<br>
&gt;           (if (zero? c) rl (lp (sub1 c) (cons (repeat) rl)))))<br>
&gt;       ; create a rational representation using the passed number of repeat<br>
&gt; digits<br>
&gt;       (define/public (rational-rep n)<br>
&gt;         (define rdiglst (expand-repeat n))<br>
&gt;         (let lp ([rdigs (rest rdiglst)] [res (first rdiglst)])<br>
&gt;           (if (empty? rdigs) (+ start (/ 1 res)) (lp (rest rdigs) (+ (first<br>
&gt; rdigs) (/ 1 res))))))<br>
&gt;       ; display the continued fraction<br>
&gt;       (define/public (show)<br>
&gt;         (printf &quot;[~a; ~a]~n&quot; start repeat))<br>
&gt;       ))<br>
&gt;<br>
&gt;   ; define a class that represents the continued fraction of a square root<br>
&gt;   (define sqrtcontfrac%<br>
&gt;     (class gencontfrac%<br>
&gt;       (init sqrval)<br>
&gt;       (super-new [start (integer-sqrt sqrval)] [repeat (build-repeat<br>
&gt; sqrval)])<br>
&gt;       (inherit rational-rep show)<br>
&gt;       (inherit-field start repeat)<br>
&gt;       ; build the repeating sequence (see<br>
&gt; <a href="http://en.wikipedia.org/wiki/Continued_fraction" target="_blank">http://en.wikipedia.org/wiki/Continued_fraction</a>)<br>
&gt;       (define/private (build-repeat n)<br>
</div></div>&gt;         (let loop ([adder start] [denom (- n (sqr start))] [result &#39;()]) *;<br>
&gt; this is where the error is occurring *<br>
<div class="im">&gt;           (cond [(zero? denom) &#39;()]  ; perfect square<br>
&gt;                 [(= 1 denom) (reverse (cons (+ start adder) result))] ;<br>
&gt; found the end of the repeating sequence<br>
&gt;                 [else<br>
&gt;                  (let* ([nextval (quotient (+ adder (integer-sqrt n))<br>
&gt; denom)] [nextadd (- (* nextval denom) adder)])<br>
&gt;                    (loop nextadd (quotient (- n (sqr nextadd)) denom) (cons<br>
&gt; nextval result)))])))<br>
&gt;       ; create a n-long list of repeat digits (in reverse order - which<br>
&gt; makes creation of a rational easier)<br>
&gt;       (define/private (expand-repeat n)<br>
&gt;         (let lp ([c n] [rl &#39;()] [stock repeat])<br>
&gt;           (if (zero? c) rl (lp (sub1 c) (cons (first stock) rl) (if (empty?<br>
&gt; (rest stock)) repeat (rest stock))))))<br>
&gt;       ))<br>
&gt;   )<br>
</div>&gt; ____________________<br>
&gt;   Racket Users list:<br>
&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br></div></div>