From: Mark H Weaver <mhw@netris.org>
To: David Kastrup <dak@gnu.org>
Cc: guile-devel@gnu.org
Subject: Re: Guile: What's wrong with this?
Date: Fri, 06 Jan 2012 15:03:22 -0500 [thread overview]
Message-ID: <8739bsbnud.fsf@netris.org> (raw)
In-Reply-To: <87y5tkvduj.fsf@fencepost.gnu.org> (David Kastrup's message of "Fri, 06 Jan 2012 20:19:00 +0100")
David Kastrup <dak@gnu.org> writes:
> Bruce Korb <bkorb@gnu.org> writes:
>
>>> sprintf(buf, "(define %s \"%s\")", "foo", my_str);
>>> scm_eval_string(buf);
>>> sprintf(buf, "(string-upcase! %s)", "foo")
>>> // the string from my_str in "buf" is now scribbled over and completely gone
>>> scm_eval_string(buf);
>>
>> Since I know the program I initially wrote (the define) is now gone,
>
> Why would a define be gone?
I think what Bruce means here is that, in theory, the string object
created in the above `define' might have held a reference to part of his
buffer `buf'. And indeed, we do make a copy of that buffer. So why not
make a mutable copy?
The reason is that, even though we make a copy of the program as we read
it (converting from the string representation of `buf' into our internal
representation), we'd like to be able to use the program multiple times.
When I speak of the "program text", I'm not referring to the string
representation of the program, but rather the internal representation.
If we allow the user to unwittingly modify the program, it might work
once but fail thereafter, as in:
(define ten-spaces-with-one-star-at
(lambda (i)
(define s " ")
(string-set! s i #\*)
s))
Now, some reasonable people might say "Why arbitrarily limit the user?
He might know what he's doing, and he might really want to do this!"
Scheme provides a nice way to do this too:
(define ten-spaces-with-new-star-at
(let ((s (make-string 10 #\space)))
(lambda (i)
(string-set! s i #\*)
s)))
I normally lean toward assuming that the user knows what he's doing, but
in this case I think Scheme got it right. Accidentally modifying
literals is a very common mistake, and is almost never a good idea.
If you want to make a program with internal mutable state, Scheme
provides free variables, as used in the example above.
Mark
next prev parent reply other threads:[~2012-01-06 20:03 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-03 4:08 What's wrong with this? Bruce Korb
2012-01-03 15:03 ` Mike Gran
2012-01-03 16:26 ` Guile: " Bruce Korb
2012-01-03 16:30 ` Mike Gran
2012-01-03 22:24 ` Ludovic Courtès
2012-01-03 23:15 ` Bruce Korb
2012-01-03 23:33 ` Ludovic Courtès
2012-01-04 0:55 ` Bruce Korb
2012-01-04 3:12 ` Noah Lavine
2012-01-04 17:37 ` bytevector -- was: " Bruce Korb
2012-01-04 21:17 ` Ludovic Courtès
2012-01-04 22:36 ` Bruce Korb
2012-01-05 0:01 ` Ludovic Courtès
2012-01-05 18:36 ` non-reproduction of initial issue -- was: " Bruce Korb
2012-01-05 18:50 ` Mark H Weaver
2012-01-04 12:19 ` Ian Price
2012-01-04 17:16 ` Bruce Korb
2012-01-04 17:21 ` Andy Wingo
2012-01-04 17:39 ` David Kastrup
2012-01-04 21:52 ` Ian Price
2012-01-04 22:18 ` Bruce Korb
2012-01-04 23:22 ` Mike Gran
2012-01-04 23:59 ` Mark H Weaver
2012-01-05 17:22 ` Bruce Korb
2012-01-05 18:13 ` Mark H Weaver
2012-01-05 19:02 ` Mark H Weaver
2012-01-05 20:24 ` David Kastrup
2012-01-05 22:42 ` Mark H Weaver
2012-01-06 1:02 ` Mike Gran
2012-01-06 1:41 ` Mark H Weaver
2012-01-06 2:38 ` Noah Lavine
2012-01-06 13:37 ` Mike Gran
2012-01-06 14:11 ` David Kastrup
2012-01-06 18:13 ` Mark H Weaver
2012-01-06 19:06 ` Bruce Korb
2012-01-06 19:19 ` David Kastrup
2012-01-06 20:03 ` Mark H Weaver [this message]
2012-01-07 16:13 ` Mark H Weaver
2012-01-07 17:35 ` mutable interfaces - was: " Bruce Korb
2012-01-07 17:47 ` David Kastrup
2012-01-07 18:30 ` Mark H Weaver
2012-01-07 18:55 ` Mark H Weaver
2012-01-06 22:23 ` Guile BUG: " Bruce Korb
2012-01-06 23:11 ` Mark H Weaver
2012-01-06 23:35 ` Andy Wingo
2012-01-06 23:41 ` Bruce Korb
2012-01-07 15:00 ` Mark H Weaver
2012-01-07 15:27 ` Bruce Korb
2012-01-07 16:38 ` Mark H Weaver
2012-01-07 17:39 ` Bruce Korb
2012-01-09 15:41 ` Mark H Weaver
2012-01-09 17:27 ` Bruce Korb
2012-01-09 18:32 ` Andy Wingo
2012-01-09 19:48 ` Bruce Korb
2012-01-07 15:47 ` David Kastrup
2012-01-07 17:07 ` Mark H Weaver
2012-01-07 14:35 ` Mark H Weaver
2012-01-07 15:20 ` Mike Gran
2012-01-07 22:25 ` Ludovic Courtès
2012-01-10 9:13 ` The empty string and other empty strings Ludovic Courtès
2012-01-10 11:28 ` Mike Gran
2012-01-10 13:03 ` Mark H Weaver
2012-01-10 13:09 ` Mike Gran
2012-01-10 15:41 ` Mark H Weaver
2012-01-10 15:48 ` David Kastrup
2012-01-10 16:15 ` Mark H Weaver
2012-01-12 22:33 ` Ludovic Courtès
2012-01-13 9:27 ` David Kastrup
2012-01-13 16:39 ` Mark H Weaver
2012-01-13 17:36 ` David Kastrup
2012-01-16 8:26 ` Marijn
2012-01-16 8:47 ` David Kastrup
2012-01-20 21:31 ` Andy Wingo
2012-01-10 14:10 ` David Kastrup
2012-01-10 12:21 ` Mike Gran
2012-01-10 12:27 ` Mark H Weaver
2012-01-10 16:34 ` Ludovic Courtès
2012-01-10 17:04 ` David Kastrup
2012-01-06 23:28 ` Guile BUG: What's wrong with this? Bruce Korb
2012-01-07 20:57 ` Guile: " Ian Price
2012-01-08 5:05 ` Mark H Weaver
2012-01-06 9:23 ` David Kastrup
2012-01-05 7:22 ` David Kastrup
2012-01-04 22:46 ` Ludovic Courtès
2012-01-04 3:04 ` Mike Gran
2012-01-04 9:35 ` nalaginrut
2012-01-04 9:41 ` David Kastrup
2012-01-04 21:07 ` Ludovic Courtès
2012-01-04 10:03 ` Mark H Weaver
2012-01-04 14:29 ` Mike Gran
2012-01-04 14:45 ` David Kastrup
2012-01-04 16:47 ` Andy Wingo
2012-01-04 17:14 ` David Kastrup
2012-01-04 17:32 ` Andy Wingo
2012-01-04 17:49 ` David Kastrup
2012-01-04 18:09 ` Andy Wingo
2012-01-04 17:30 ` Bruce Korb
2012-01-04 17:44 ` David Kastrup
2012-01-04 18:26 ` Ian Price
2012-01-04 18:48 ` Mark H Weaver
2012-01-04 19:29 ` Bruce Korb
2012-01-04 20:20 ` David Kastrup
2012-01-04 23:19 ` Mark H Weaver
2012-01-04 23:28 ` Bruce Korb
2012-01-07 15:43 ` Fixed string corruption bugs (was Guile: What's wrong with this?) Mark H Weaver
2012-01-07 16:19 ` Fixed string corruption bugs Andy Wingo
2012-01-04 18:31 ` Guile: What's wrong with this? Mark H Weaver
2012-01-04 18:43 ` Andy Wingo
2012-01-04 19:29 ` Mark H Weaver
2012-01-04 19:43 ` Andy Wingo
2012-01-04 20:08 ` Bruce Korb
2012-01-04 20:14 ` David Kastrup
2012-01-04 20:56 ` Andy Wingo
2012-01-04 21:30 ` Bruce Korb
2012-01-04 17:19 ` Mark H Weaver
2012-01-05 4:24 ` Mark H Weaver
2012-01-04 22:37 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8739bsbnud.fsf@netris.org \
--to=mhw@netris.org \
--cc=dak@gnu.org \
--cc=guile-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).