<div dir="ltr">For emina's problem, shouldn't the implementation of typed/racket have a clue?<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Nov 20, 2013 at 5:19 AM,  <span dir="ltr"><<a href="mailto:users-request@racket-lang.org" target="_blank">users-request@racket-lang.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Send users mailing list submissions to<br>
        <a href="mailto:users@racket-lang.org">users@racket-lang.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="http://lists.racket-lang.org/users/listinfo" target="_blank">http://lists.racket-lang.org/users/listinfo</a><br>
or, via email, send a message with subject or body 'help' to<br>
        <a href="mailto:users-request@racket-lang.org">users-request@racket-lang.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:users-owner@racket-lang.org">users-owner@racket-lang.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than "Re: Contents of users digest..."<br>
<br>[Racket Users list:<br>
 <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a> ]<br>
<br>Today's Topics:<br>
<br>
   1. Why does this tail recursive list length function fail at cdr<br>
      l at end of list? (Bo Gus)<br>
   2. Re: Why does this tail recursive list length function fail at<br>
      cdr l at end of list? (Pierpaolo Bernardi)<br>
   3. Re: Why does this tail recursive list length function fail at<br>
      cdr l at end of list? (Bo Gus)<br>
   4. Re: Why does this tail recursive list length function fail at<br>
      cdr l at end of list? (Daniel Prager)<br>
   5. Re: Why does this tail recursive list length function fail at<br>
      cdr l at end of list? (Daniel Prager)<br>
   6. Re: obtaining the location of an identifier (Robby Findler)<br>
<br><br>---------- Forwarded message ----------<br>From: Bo Gus <<a href="mailto:forumangus@gmail.com">forumangus@gmail.com</a>><br>To: Racket Newsgroup <<a href="mailto:users@racket-lang.org">users@racket-lang.org</a>><br>
Cc: <br>Date: Wed, 20 Nov 2013 11:09:28 +0000<br>Subject: [racket] Why does this tail recursive list length function fail at cdr l at end of list?<br><div dir="ltr"><div>My tail recursive implementation of length is like this:</div>
<div><br></div><div>(define (length2 l)</div><div>  (define (l-iter l count)</div><div>    (if (null? 1) count</div><div>        (l-iter (cdr l) (+ count 1))))</div>
<div>  (l-iter l 0))</div><div><br></div><div>If I call (length2 '(1 2 3)) and step through the code in racket, count increments to 3 but then on the (if (null? l) count line instead of returning out of the function it goes onto the next line (l-iter (cdr l) (+ count l)))) and of course fails at cder of an empty list.</div>

<div><br></div><div>Racket error message is:</div><div><br></div><div> mcdr: contract violation</div><div>  expected: mpair?</div><div>  given: '()</div><div><br></div><div><br></div><div>I am fairly new to scheme.  What am I doing wrong?</div>

<div><br></div><div>Angus</div><div><br></div></div>
<br><br>---------- Forwarded message ----------<br>From: Pierpaolo Bernardi <<a href="mailto:olopierpa@gmail.com">olopierpa@gmail.com</a>><br>To: Bo Gus <<a href="mailto:forumangus@gmail.com">forumangus@gmail.com</a>><br>
Cc: Racket Newsgroup <<a href="mailto:users@racket-lang.org">users@racket-lang.org</a>><br>Date: Wed, 20 Nov 2013 12:27:40 +0100<br>Subject: Re: [racket] Why does this tail recursive list length function fail at cdr l at end of list?<br>
On Wed, Nov 20, 2013 at 12:09 PM, Bo Gus <<a href="mailto:forumangus@gmail.com">forumangus@gmail.com</a>> wrote:<br>
> My tail recursive implementation of length is like this:<br>
><br>
> (define (length2 l)<br>
>   (define (l-iter l count)<br>
>     (if (null? 1) count<br>
>         (l-iter (cdr l) (+ count 1))))<br>
>   (l-iter l 0))<br>
<br>
> I am fairly new to scheme.  What am I doing wrong?<br>
<br>
You wrote (null? 1), which is always false.  Note 1 instead of l.<br>
<br>
Cheers<br>
<br>
<br><br>---------- Forwarded message ----------<br>From: Bo Gus <<a href="mailto:forumangus@gmail.com">forumangus@gmail.com</a>><br>To: Racket Newsgroup <<a href="mailto:users@racket-lang.org">users@racket-lang.org</a>><br>
Cc: <br>Date: Wed, 20 Nov 2013 11:33:18 +0000<br>Subject: Re: [racket] Why does this tail recursive list length function fail at cdr l at end of list?<br><div dir="ltr">I noticed that just after posting.<div><br></div><div>
I changed to:</div><div><div>(define (length2 lst)</div><div>  (define (l-iter l count)</div><div>    (if (null? l) count</div><div>        (l-iter (cdr l) (+ count 1))))</div>
<div>  (l-iter lst 0))</div></div><div><br></div><div>Must get better at spotting obvious mistakes...</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On 20 November 2013 11:27, Pierpaolo Bernardi <span dir="ltr"><<a href="mailto:olopierpa@gmail.com" target="_blank">olopierpa@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On Wed, Nov 20, 2013 at 12:09 PM, Bo Gus <<a href="mailto:forumangus@gmail.com" target="_blank">forumangus@gmail.com</a>> wrote:<br>


> My tail recursive implementation of length is like this:<br>
><br>
> (define (length2 l)<br>
>   (define (l-iter l count)<br>
>     (if (null? 1) count<br>
>         (l-iter (cdr l) (+ count 1))))<br>
>   (l-iter l 0))<br>
<br>
</div><div>> I am fairly new to scheme.  What am I doing wrong?<br>
<br>
</div>You wrote (null? 1), which is always false.  Note 1 instead of l.<br>
<br>
Cheers<br>
</blockquote></div><br></div>
<br><br>---------- Forwarded message ----------<br>From: Daniel Prager <<a href="mailto:daniel.a.prager@gmail.com">daniel.a.prager@gmail.com</a>><br>To: Bo Gus <<a href="mailto:forumangus@gmail.com">forumangus@gmail.com</a>>, Racket Users <<a href="mailto:users@racket-lang.org">users@racket-lang.org</a>><br>
Cc: <br>Date: Wed, 20 Nov 2013 22:52:17 +1100<br>Subject: Re: [racket] Why does this tail recursive list length function fail at cdr l at end of list?<br><div dir="ltr">Replace the expression (null? 1) with (null? l). You appear to have typed 1 (one) where you meant l (ell).<div>
As a general rule-of-thumb a name such as lst or a-list will reduce the risk of this kind of error.<div class="gmail_extra">

<div dir="ltr"></div>
</div></div><div><br></div><div>Dan</div></div>
<br><br>---------- Forwarded message ----------<br>From: Daniel Prager <<a href="mailto:daniel.a.prager@gmail.com">daniel.a.prager@gmail.com</a>><br>To: Bo Gus <<a href="mailto:forumangus@gmail.com">forumangus@gmail.com</a>>, Racket Users <<a href="mailto:users@racket-lang.org">users@racket-lang.org</a>><br>
Cc: <br>Date: Wed, 20 Nov 2013 22:56:25 +1100<br>Subject: Re: [racket] Why does this tail recursive list length function fail at cdr l at end of list?<br><div dir="ltr">Oops - dup.<div><br></div><div>Didn't see Pierpaolo's reply.</div>
<div><br></div><div>Dan</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Nov 20, 2013 at 10:52 PM, Daniel Prager <span dir="ltr"><<a href="mailto:daniel.a.prager@gmail.com" target="_blank">daniel.a.prager@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">Replace the expression (null? 1) with (null? l). You appear to have typed 1 (one) where you meant l (ell).<div>


As a general rule-of-thumb a name such as lst or a-list will reduce the risk of this kind of error.<div class="gmail_extra">
<div dir="ltr"></div>
</div></div><div><br></div><div>Dan</div></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><div style="font-family:arial;font-size:small"><b>Daniel Prager</b></div><div style="font-family:arial;font-size:small">Agile/Lean Coaching, Software Development and Leadership</div>


<div style="font-family:arial;font-size:small"><font color="#999999">Twitter:</font> <a href="https://twitter.com/agilejitsu" style="color:rgb(17,85,204)" target="_blank">@agilejitsu</a> </div><div style="font-family:arial;font-size:small">


<font color="#999999">Blog:</font> <a href="http://agile-jitsu.blogspot.com/" style="color:rgb(17,85,204)" target="_blank">agile-jitsu.blogspot.com</a></div></div>
</div>
<br><br>---------- Forwarded message ----------<br>From: Robby Findler <<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>><br>To: Emina Torlak <<a href="mailto:emina@eecs.berkeley.edu">emina@eecs.berkeley.edu</a>><br>
Cc: users <<a href="mailto:users@racket-lang.org">users@racket-lang.org</a>>, Sam Tobin-Hochstadt <<a href="mailto:samth@cs.indiana.edu">samth@cs.indiana.edu</a>><br>Date: Wed, 20 Nov 2013 07:19:35 -0600<br>Subject: Re: [racket] obtaining the location of an identifier<br>
<div dir="ltr">I didn't try it, but you it might work to use local-expand and then find all the binding forms and then rewrite them to use boxes (or some other source of uniqueness you might have around).<div><br></div>

<div>Robby</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Nov 20, 2013 at 12:53 AM, Emina Torlak <span dir="ltr"><<a href="mailto:emina@eecs.berkeley.edu" target="_blank">emina@eecs.berkeley.edu</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This is how my solution currently works, but unfortunately, it's not quite right.  Here is a small example that demonstrates why, assuming the implementation based on free-id-table:<div>

<br></div><div><div>
<font face="courier new, monospace">(define (cell init)</font></div><div><font face="courier new, monospace">  (let ([x init])</font></div><div><font face="courier new, monospace">    (case-lambda</font></div><div><font face="courier new, monospace">      [() x]</font></div>


<div><font face="courier new, monospace">      [(v) (set! x v)])))</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">(define foo (cell 0))</font></div><div><font face="courier new, monospace">(define bar (cell 1))</font></div>


<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">> (foo 2)</font></div><div><font face="courier new, monospace">> (bar 3)</font></div><div><font face="courier new, monospace">> (foo)</font></div>


<div><font face="courier new, monospace">2</font></div><div><font face="courier new, monospace">> (bar)</font></div><div><font face="courier new, monospace">3</font></div><div><font face="courier new, monospace">> (dict->list global)</font></div>


</div><div><font face="courier new, monospace">'((.#<syntax:18:17 x> . 3))</font><br></div><div><br></div><div>In the above scenario, I need the <font face="courier new, monospace">global</font> map to contain two bindings:  one for the location of 'foo.x' and the other for the location of 'bar.x.'  </div>

<span><font color="#888888">
<div><br></div><div>Emina</div><div><br></div></font></span></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 19, 2013 at 10:31 PM, Sam Tobin-Hochstadt <span dir="ltr"><<a href="mailto:samth@cs.indiana.edu" target="_blank">samth@cs.indiana.edu</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think that just identifiers and `free-id-table`s should work here.<br>
Here's your example:<br>
<br>
#lang racket<br>
<br>
(require syntax/id-table (only-in racket [set! #%set!]))<br>
<br>
(define global (make-free-id-table))<br>
<br>
(define-syntax-rule (location-of id) #'id)<br>
<br>
(define-syntax-rule (set! id expr)<br>
  (let ([v expr])<br>
    (dict-set! global (location-of id) v)<br>
    (#%set! id v)))<br>
<br>
> (define x 1)<br>
> (set! x 2)<br>
> (set! x 3)<br>
> (for/list ([(k v) (in-dict global)]) (list k v))<br>
'((.#<syntax:4:8 x> 3))<br>
<br>
Also at <a href="https://gist.github.com/samth/7558673" target="_blank">https://gist.github.com/samth/7558673</a><br>
<br>
Sam<br>
<div><div><br>
On Mon, Nov 18, 2013 at 2:43 PM, Emina Torlak <<a href="mailto:emina@eecs.berkeley.edu" target="_blank">emina@eecs.berkeley.edu</a>> wrote:<br>
> I'm using Racket to implement a language for which I need to track state<br>
> updates---in particular, variable mutation using set!.  For example,<br>
> consider this module definition:<br>
><br>
> #lang racket<br>
><br>
> (require (only-in racket [set! #%set!]))<br>
><br>
> (define global (make-hash))<br>
><br>
> (define-syntax-rule (location-of id)<br>
>   (#%variable-reference id)) ; doesn't quite do the right thing<br>
><br>
> (define-syntax-rule (set! id expr)<br>
>   (let ([val expr])<br>
>     (hash-set! global (location-of id) val)<br>
>     (#%set! id val)))<br>
><br>
> When I evaluate the following sequence of forms against the above<br>
> definition, I would like the global hash map to contain just one binding<br>
> that maps the location for 'x' to the value 2.  With the above<br>
> implementation I get two map entries, since variable-reference doesn't quite<br>
> do what I hoped it did:<br>
><br>
>> (define x 0)<br>
>> (set! x 1)<br>
>> (set! x 2)<br>
>> x<br>
> 2<br>
>> global<br>
> '#hash((#<variable-reference> . 1) (#<variable-reference> . 2))<br>
><br>
> Is there another construct in Racket that I could use for this purpose?  If<br>
> not, can something like this be implemented and how much work would it<br>
> entail?<br>
><br>
> I have a purely macro-based solution that works for the most part, but it's<br>
> fragile and there are corner cases for which it is just wrong.  So, before<br>
> trying to fix that, I was wondering if there is a nicer way to solve it by<br>
> somehow getting handles for variable locations that are comparable using eq?<br>
> or equal?<br>
><br>
> Thanks!<br>
><br>
> Emina<br>
><br>
><br>
</div></div>> ____________________<br>
>   Racket Users list:<br>
>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
><br>
</blockquote></div><br></div>
</div></div><br>____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br></blockquote></div><br></div>
<br></blockquote></div><br></div>