[racket] first vs car ; last vs cdr ; empty? vs null?

From: Daniel Carrera (dcarrera at gmail.com)
Date: Fri Mar 7 08:39:36 EST 2014

What is (cons 3 2) ? What is the definition of a list? I thought that a
list was defined as either '() or a pair.

Cheers,
Daniel.


On 7 March 2014 13:49, Jens Axel Søgaard <jensaxel at soegaard.net> wrote:

> The value (cons 3 42) is not a list. The function car will extract 3,
> but first will fail.
>
> /Jens Axel
>
>
> 2014-03-07 13:40 GMT+01:00 Daniel Carrera <dcarrera at gmail.com>:
> > Thanks. That's a very useful tip (being able to get at the source code).
> I
> > am a bit confused by the condition "(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?
> >
> > 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.
> >
> > On the same file, I found the definition of empty?
> >
> > (define empty? (lambda (l) (null? l)))
> >
> > Wouldn't it be more economical to write "(define empty? null?)" and allow
> > them to be synonyms?
> >
> > Cheers,
> > Daniel.
> >
> >
> > On 7 March 2014 12:16, Jens Axel Søgaard <jensaxel at soegaard.net> wrote:
> >>
> >> For lists first/rest works the same as car/cdr.
> >> For non-lists there is a difference: first and rest signals an error.
> >> The names first and rest makes it easier for a human reader of
> >> a piece of code to see that the program works on lists only.
> >>
> >> For the curious, the definition of first is:
> >>
> >> (define (first x)
> >>   (if (and (pair? x) (list? x))
> >>     (car x)
> >>     (raise-argument-error 'first "(and/c list? (not/c empty?))" x)))
> >>
> >> I found this definition like this:
> >> 1. Entered this program in DrRacket:
> >>       #lang racket
> >>       first
> >> 2. Clicked the "Check Syntax" button
> >> 3. Right clicked the identifier first and chose "Open defining file"
> >> 4. Chose "first" in the definition-drop-down in the upper left corner.
> >>
> >> /Jens Axel
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >> 2014-03-07 11:45 GMT+01:00 Daniel Carrera <dcarrera at gmail.com>:
> >> > Hello,
> >> >
> >> > Is there any difference between `first` and `car`, or between `last`
> and
> >> > `cdr`, or between `empty? and null?` ?
> >> >
> >> > I had assumed that these were just synonyms, added by Racket because
> >> > they
> >> > might be more memorable to a student. But apparently Racket doesn't
> >> > think
> >> > they are equal:
> >> >
> >> > -> (equal? first car)
> >> > #f
> >> > -> (equal? last cdr)
> >> > #f
> >> > -> (equal? empty? null?)
> >> > #f
> >> >
> >> >
> >> > I suppose that they could be separate functions that happen to do the
> >> > same
> >> > thing, but if so, my next question would be why they aren't just
> >> > aliases. As
> >> > in:
> >> >
> >> > -> (define myfirst car)
> >> > -> (equal? myfirst car)
> >> > #t
> >> >
> >> > Cheers,
> >> > Daniel.
> >> > --
> >> > When an engineer says that something can't be done, it's a code phrase
> >> > that
> >> > means it's not fun to do.
> >> >
> >> > ____________________
> >> >   Racket Users list:
> >> >   http://lists.racket-lang.org/users
> >> >
> >>
> >>
> >>
> >> --
> >> --
> >> Jens Axel Søgaard
> >
> >
> >
> >
> > --
> > When an engineer says that something can't be done, it's a code phrase
> that
> > means it's not fun to do.
>
>
>
> --
> --
> Jens Axel Søgaard
>



-- 
When an engineer says that something can't be done, it's a code phrase that
means it's not fun to do.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140307/6d5b0233/attachment.html>

Posted on the users mailing list.