[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Scheme-reports] Mutable Pairs
On Jun 13, Brian Harvey wrote:
> > Just *how* many more decades should students be "urged"? How many
> > more buffer-overrun-like diseases should the world of programming
> > suffer for this kind of thinking to finally go the way of the
> > GOTO?
> (1) This repeated reference to buffer overruns is what we in my
> youth used to call redbaiting. Lisp programmers don't /have/ buffer
> overruns. And it's not because Lisp tied anyone's hands -- it's
> because Lisp provided something equally flexible, equally
> expressive, easier to use, and overrun-safe: the linked list.
No, this was not baiting, red or any other color. I case you missed
this in Matthew's post:
Chez Scheme Version 6.1
Copyright (c) 1998 Cadence Research Systems
> (define l (list 1 2 3 4 5))
> (map (lambda (x) (set-cdr! (cddr l) 5)) l)
Error: invalid memory reference.
Some debugging context may have been lost.
This means that the usual compilation strategy would lead to
segfaulting code -- and that's as good as buffer overruns. But this
is still missing the point: the naive `map' code which I'm sure you've
shown students countless times is just plain *broken* when pairs are
mutable. Even if you avoid "unsafe" declarations in your compiler and
therefore enjoy the usual type safety, you still have an
unaccounted-for error case -- so yes, the scheme process will not
crash, does it make any difference for me if it left my bank account
> (2) How many decades: I would say aleph-null of them.
I should have said *merely* urged. If you still hold on to
aleph-null, then I can only feel sorry for the students.
> Functional programming is a great thing, partly, as you say, because
> it's thread-safe and more generally bug-resistant. But for many
> tasks, stateful OOP is more natural: simulations, window systems,
> etc. One of the things I admire in Scheme is that it isn't rigid
> about how to program.
In the parts that you conveniently didn't quote I said *explicitly*
that I'm not advocating abolishing mutation.
> > Say that I write software for *your* bank, and I do that in Scheme
> > -- it's a wonderful system that is immediately successful, and I
> > open it up for 3rd-party plugins. Would you be happy to know that
> > my API passes on your bank account as a structure made of mutable
> > pairs to these plugins?
> I don't want my bank to open my account to third party plugins no
> matter how bulletproof the software is!
Replace "plugins" with "libraries". You can't expect any piece of
software to be written by a single person.
> I will confess to believing that Scheme users are smarter than
> average. :-)
> I am one of those people who'll never have a Facebook account, and
> it's not because I don't trust the technical merit of their code.
Um, how is this relevant? Is the point here to *deliberately* keep
Scheme away from mass use and on-line applications like facebook?
> > (ML and Prolog are not pure. The combination of the ML, the
> > Prolog, and the Haskell communities is likely bigger than the Lisp
> > community. I can't guess what the ratio is, but there are most
> > definitely much more than "a tenth of the usership of Lisp".)
> I admit I don't have statistics about this, but are you including
> elisp programmers in your count? [...]
There are very few Emacs-Lisp *programmers*.
> > One straitjacket that I don't want to be forced to wear is the
> > huge amount of work I have to do to get robust code written when
> > pairs are mutable. Another straitjacket I don't want to wear is
> > the illusion that "assuming the list doesn't change" is good
> > enough for real code. I want Scheme to allow me to be free of
> > these things, not some chaotic "here's a cpu and some wires, you
> > can do whatever you want with it now" thing.
> Oh, please. This is really dishonest rhetoric. "Straitjacket"
> doesn't mean "anything I disagree with." It means someone telling
> me that the thing I want to do isn't good for me, and eviscerating
> my toolkit to make it hard for me to do it.
The straitjacket is me being forced to write either nearly obfuscated
code if I want it to be safe, or give up this safety.
> You find it easier to write robust code when pairs aren't mutated?
> Great! You absolutely have my permission never to mutate pairs in
> your code. I promise never to design a language feature /for the
> purpose of/ making it hard for you to program in your preferred
I'll repeat the code here:
(define (map f l)
(define (loop l)
(if (null? l) '() (cons (f (car l)) (loop (cdr l)))))
(if (list? l)
This code does note mutate pairs. It is still broken.
> [...] But why do you have to destroy Scheme for me?
Do you see that this question can go both ways? Or am I now
disqualified from expressing my opinions?
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://barzilay.org/ Maze is Life!
Scheme-reports mailing list