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

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

Oops, sorry about that empty message. I was going to say that your
definition of a list is close, but it's missing something, A list is
either:

- the empty list; or
- a pair, the second element of which is a list

(cons 3 2) is a pair, and sometimes non-list pairs are called
"improper lists," but they don't satisfy list?.


On Fri, Mar 7, 2014 at 8:43 AM, Jon Zeppieri <zeppieri at gmail.com> wrote:
> 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.