[racket] About set-car! and set-cdr!

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Wed Mar 5 13:54:38 EST 2014

Okay, now see mcons. 

On Mar 5, 2014, at 1:53 PM, Daniel Carrera wrote:

> I see.
> 
> k is '(42 2 3) while l is '(1 2 3). This is what I expected to happen, but it is clearly not what was supposed to happen. I just tried the same example with Chicken, and for Chicken both k and l are equal to '(42 2 3).
> 
> Thanks for the explanation.
> 
> Cheers,
> Daniel.
> 
> On 5 March 2014 19:24, Matthias Felleisen <matthias at ccs.neu.edu> wrote:
> 
> Try 
> 
>  (define l (list 1 2 3))
>  (define k l)
> 
> Now what does (set-car! k 42) do? What should it do? 
> 
> 
> On Mar 5, 2014, at 1:23 PM, Daniel Carrera wrote:
> 
>> But isn't the final effect the same? The pair may be immutable, but I can make a new pair and bind it to the old variable. The main difference that I can see is that what I wrote is a macro, while I believe set-car! is supposed to be a function. That could potentially break code.
>> 
>> Cheers,
>> Daniel.
>> 
>> 
>> On 5 March 2014 19:18, Matthias Felleisen <matthias at ccs.neu.edu> wrote:
>> 
>> No, set! mutates variable bindings while set-car! mutates cons cells (the first slot of a data structure).
>> 
>> 
>> On Mar 5, 2014, at 1:13 PM, Daniel Carrera wrote:
>> 
>> > Hello,
>> >
>> > My understanding is that Racket intentionally does not provide set-car! and set-cdr! and that this is one of the ways in which Racket is not fully compatible with Scheme.
>> >
>> > Am I right to think that it is trivially easy to add these features to Racket? Specifically, I'm thinking of:
>> >
>> >
>> > (define-syntax set-car!
>> >   (syntax-rules ()
>> >     ((_ l new_car) (set! l (cons new_car (cdr l))))))
>> >
>> > (define-syntax set-cdr!
>> >   (syntax-rules ()
>> >     ((_ l new_cdr) (set! l (cons (car l) new_cdr)))))
>> >
>> >
>> > Or did I miss something?
>> >
>> > 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
>> 
>> 
>> 
>> 
>> -- 
>> When an engineer says that something can't be done, it's a code phrase that means it's not fun to do.
> 
> 
> 
> 
> -- 
> 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/20140305/a24f2739/attachment.html>

Posted on the users mailing list.