[gambit-list] strange mutation problem (bug?) (Re: "Number of arguments exceeds implementation)
Christian
christian at pflanze.mine.nu
Fri Sep 29 04:34:02 EDT 2006
At 1:17 Uhr -0500 29.09.2006, Bill Richter wrote:
>Christian suggested I might have found a real bug,
The interesting bit is, that using compile-file & load Bill's program
usually works, whereas with static compilation/linking not. I don't
know where Gambit would differ in those two
>and that I should
>try stripping off as much fat as possible from my program.
You should strip it more until you can say "if I leave this out, it
doesn't do weird things anymore".
Here's what you should be doing in such cases:
* check which functions are really mutating, and which ones are
functions. I realize that you're using map (meant for functions)
where I think for-each (meant for imperative code) is what you want
(maybe the order of evaluation may be a problem!). I realize that
UnSpace clearly does mutate it's argument, thus rename it to UnSpace!.
* try to find out whether ShowPossibilities mutates it's argument.
From a quick look at the code, I'd say so, but runnning it in gsi, I
couldn't find a modification of it's input, strange.
* try to find out where during the runtime of the program the problem
happens. For this, outputting the relevant datastructures helps. I've
put a (pp U7) between the two ShowPossibilities calls and another one
after the second. After the first ShowPossibilities call U7 is
containing lists (is this what you want?); then the second
ShowPossibilities call runs into the error. So clearly U7 has been
modified, and ShowPossibilities should be renamed to
ShowPossibilities!.
Why does the same not happen in the interpreter? Before knowing that
it's a Gambit bug, we have to rule out that it's from a difference
between interpreter and compiler behaviour.
Trimming it further down for an hour, I realize that you're modifying
quoted datastructures. IIRC, R5RS says that modifying constant
datastructures is undefined, and Gambit seems to rely on them not
beeing modifyed when compiling to static binaries.
Replace all quoted #(..) with (vector ..) and it works.
Christian.
More information about the Gambit-list
mailing list