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

From: Jon Zeppieri (zeppieri at gmail.com)
Date: Fri Mar 7 08:43:57 EST 2014

On Fri, Mar 7, 2014 at 8:39 AM, Daniel Carrera <dcarrera at gmail.com> wrote:
> 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.
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>


Posted on the users mailing list.