<div dir="ltr">Thanks. That's a very useful tip (being able to get at the source code). I am a bit confused by the condition "<span style="font-size:12.800000190734863px;font-family:arial,sans-serif">(and (pair? x) (list? x))". It seems to me that this could just be replaced with "(pair? x)". The "list?" doesn't add anything. Am I wrong?</span><div>
<br></div><div>Also, I don't see exactly how "first" and "car" behave different on a non-list. They both raise an error. The errors are just worded differently.</div><div><br></div><div>On the same file, I found the definition of empty?</div>
<div><br></div><div>(define empty? (lambda (l) (null? l)))<br></div><div><br></div><div>Wouldn't it be more economical to write "(define empty? null?)" and allow them to be synonyms?</div><div><br></div><div>
Cheers,</div><div>Daniel.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On 7 March 2014 12:16, Jens Axel Søgaard <span dir="ltr"><<a href="mailto:jensaxel@soegaard.net" target="_blank">jensaxel@soegaard.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">For lists first/rest works the same as car/cdr.<br>
For non-lists there is a difference: first and rest signals an error.<br>
The names first and rest makes it easier for a human reader of<br>
a piece of code to see that the program works on lists only.<br>
<br>
For the curious, the definition of first is:<br>
<br>
(define (first x)<br>
  (if (and (pair? x) (list? x))<br>
    (car x)<br>
    (raise-argument-error 'first "(and/c list? (not/c empty?))" x)))<br>
<br>
I found this definition like this:<br>
1. Entered this program in DrRacket:<br>
      #lang racket<br>
      first<br>
2. Clicked the "Check Syntax" button<br>
3. Right clicked the identifier first and chose "Open defining file"<br>
4. Chose "first" in the definition-drop-down in the upper left corner.<br>
<br>
/Jens Axel<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
2014-03-07 11:45 GMT+01:00 Daniel Carrera <<a href="mailto:dcarrera@gmail.com">dcarrera@gmail.com</a>>:<br>
> Hello,<br>
><br>
> Is there any difference between `first` and `car`, or between `last` and<br>
> `cdr`, or between `empty? and null?` ?<br>
><br>
> I had assumed that these were just synonyms, added by Racket because they<br>
> might be more memorable to a student. But apparently Racket doesn't think<br>
> they are equal:<br>
><br>
> -> (equal? first car)<br>
> #f<br>
> -> (equal? last cdr)<br>
> #f<br>
> -> (equal? empty? null?)<br>
> #f<br>
><br>
><br>
> I suppose that they could be separate functions that happen to do the same<br>
> thing, but if so, my next question would be why they aren't just aliases. As<br>
> in:<br>
><br>
> -> (define myfirst car)<br>
> -> (equal? myfirst car)<br>
> #t<br>
><br>
> Cheers,<br>
> Daniel.<br>
<span class="HOEnZb"><font color="#888888">> --<br>
> When an engineer says that something can't be done, it's a code phrase that<br>
> means it's not fun to do.<br>
><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>
<br>
<br>
<br>
--<br>
--<br>
Jens Axel Søgaard<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>When an engineer says that something can't be done, it's a code phrase that means it's not fun to do.<br>
</div>