This is the mail archive of the guile@cygnus.com mailing list for the guile project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
On Thu, Oct 29, 1998 at 11:10:34AM -0500, it occurred to Maciej Stachowiak to write:
>
> scott@poverty.bloomington.in.us writes:
> > Last I heard Lauri was swearing at how hard it was to emulate SIOD's
> > braindead set! semantics in guile.
>
> What does SIOD do with set! that's so unusual?
;; SIOD's set! is really screwed up. If the variable being set is
;; unbound, it is bound at the top level. Otherwise it is reset. So we
;; have to find out if a variable is bound in a _local_ environment.. thus
;; we create the syntax manually. Also, SIOD set! returns the new value.
;; There would be no prob otherwise, but all scripts use these "features"..
(define set!
; we memoize the correct place for the variable..
(procedure->memoizing-macro
(lambda (exp env)
(define variable (cadr exp))
(define value (caddr exp))
`(begin
(,@(let loop ((e env))
(define frame (car e))
(cond ((procedure? frame)
; here we create the top level binding
`(',variable-set! ',(frame variable #t)))
((eq? (car frame) variable)
`(set-cdr! ',frame))
((and (list? (car frame)) (list-index (car frame) variable))
=> (lambda (i)
`(',set-car! ',(list-tail (cdr frame) i))))
(else (loop (cdr e)))))
,value)
,variable))))
Yes, this is hyper-kludgy. I don't know if this even works with latest
guile. Cleaner solutions welcome. :)
Lauri Alanko
la@iki.fi