diff --git a/src/ikarus.boot b/src/ikarus.boot index 6605fd0..2c04860 100644 Binary files a/src/ikarus.boot and b/src/ikarus.boot differ diff --git a/src/ikarus.symbols.ss b/src/ikarus.symbols.ss index a26e04d..9e2457d 100644 --- a/src/ikarus.symbols.ss +++ b/src/ikarus.symbols.ss @@ -4,7 +4,8 @@ gensym-count print-gensym string->symbol symbol->string getprop putprop remprop property-list top-level-value top-level-bound? set-top-level-value! - symbol-value symbol-bound? set-symbol-value!) + symbol-value symbol-bound? set-symbol-value! + reset-symbol-proc!) (import (ikarus system $symbols) (ikarus system $pairs) @@ -14,7 +15,7 @@ string->symbol symbol->string getprop putprop remprop property-list top-level-value top-level-bound? set-top-level-value! - symbol-value symbol-bound? set-symbol-value!)) + symbol-value symbol-bound? set-symbol-value! reset-symbol-proc!)) (define gensym (case-lambda @@ -72,7 +73,22 @@ (lambda (x v) (unless (symbol? x) (error 'set-symbol-value! "~s is not a symbol" x)) - ($set-symbol-value! x v))) + ($set-symbol-value! x v) + ($set-symbol-proc! x + (if (procedure? v) v + (lambda args + (error 'apply "~s is not a procedure" + ($symbol-value x))))))) + + (define reset-symbol-proc! + (lambda (x) + (let ([v ($symbol-value x)]) + ($set-symbol-proc! x + (if (procedure? v) + v + (lambda args + (error 'apply "~s is not a procedure" + ($symbol-value x)))))))) (define string->symbol (lambda (x) diff --git a/src/makefile.ss b/src/makefile.ss index 792573c..d91081e 100755 --- a/src/makefile.ss +++ b/src/makefile.ss @@ -483,6 +483,7 @@ [symbol-value i symbols] [top-level-value i symbols] [set-symbol-value! i symbols] + [reset-symbol-proc! i symbols] [make-guardian i] [make-input-port i] [make-output-port i] diff --git a/src/pass-specify-rep.ss b/src/pass-specify-rep.ss index c550aef..d51a5ff 100644 --- a/src/pass-specify-rep.ss +++ b/src/pass-specify-rep.ss @@ -414,6 +414,7 @@ [else #f])) => (lambda (sym) (record-symbol-call! sym) + (reset-symbol-proc! sym) (prm 'mref (T (K sym)) (K (- disp-symbol-record-proc symbol-ptag))))] [else (nonproc x)])] @@ -423,6 +424,7 @@ (define encountered-symbol-calls '()) (define (record-symbol-call! x) + (unless (memq x encountered-symbol-calls) (set! encountered-symbol-calls (cons x encountered-symbol-calls))))