hi
anyone has a good way for dealing with script clean up? I'm mostly writing programs in interpreted mode, ie, with a lot of redundant defines. when I try to compile an interpreted program (assuming it's entirely correct), the only problem while compiling with gsc is the redundant defines. is there a script that can automatically rewrite a program so that it can be compiled to produce the same result as interpreted. Is there deeper issues besides renaming? Thanks.
Afficher les réponses par date
dillo gimp wrote:
hi
anyone has a good way for dealing with script clean up? I'm mostly writing programs in interpreted mode, ie, with a lot of redundant defines. when I try to compile an interpreted program (assuming it's entirely correct), the only problem while compiling with gsc is the redundant defines.
You mean, you have several defines of the same (toplevel) names?
One could argue that the interpreted program isn't correct then in the first place :). If you really want to change a toplevel binding while the program is running, use set! instead of the second and subsequent defines.
is there a script that can automatically rewrite a program so that it can be compiled to produce the same result as interpreted.
I'm not aware of one but it would be easy enough to do. If you don't mind loosing location information, just |read-all| the file and map (or, cleaner, fold) over the list, while remembering which identifyers you've already seen..
If you want to keep location information, you could use my cj-expr module -- a chjmodule currently. I've been wanting to release my current code for a long time now, maybe I'll get to it soon.
Is there deeper issues besides renaming?
Renaming? What should be renamed and why? Hm do you mean you have code like this?:
(define foo ...)
....use foo....
(define foo ...)
....use foo but always ever only the second one, never the first...
e.g. you're implicitely assuming scoping like this?:
(let ((foo ...)) ....use foo...)
(let ((foo ...)) ... use the second foo...)
Note that the toplevel define way really *overwrites* foo in the interpreter, like set!, it doesn't create a new scope as is the case in ML (well ML simply only has let iirc :)).
You better use explicit scoping then, either by putting both parts of the program into separate namespaces:
(namespace ("firstpart#" foo))
(define foo ...)
....use foo....
(namespace ("secondpart#" foo))
(define foo ...)
....use foo but always ever only the second one, never the first, except you could refer to the first by fully qualifying it: firstpart#foo
or by using let.
Christian.