(defun gen-set (symbol env) (let ((frame (find symbol env :test #'find))) (if frame (gen 'LSET (position frame env) (position symbol frame) ";" symbol) (gen 'GSET symbol))))
<cl> (comp-show '(set! a 10)) ARGS 0 CONST 10 GSET A RETURN NIL <cl> (comp-show '(set! a '(a b c))) ARGS 0 CONST (A B C) GSET A RETURN NIL <cl> (comp-show '(set! a (a b c))) ARGS 0 GVAR B GVAR C GVAR A CALL 2 GSET A RETURN NIL <cl> (comp-show '(set! a (list 1 2 3))) ARGS 0 CONST 1 CONST 2 CONST 3 GVAR LIST CALL 3 GSET A RETURN NIL <cl> (comp-show '(set! a (lambda (x) (list x)))) ARGS 0 FN ARGS 1 LVAR 0 0 ; X GVAR LIST CALL 1 RETURN GSET A RETURN <cl> (comp-show '(lambda (x) (set! x 10))) ARGS 0 FN ARGS 1 CONST 10 LSET 0 0 ; X RETURN RETURN NIL <cl> (comp-show '(lambda (x) (lambda (y) (set! x y)))) ARGS 0 FN ARGS 1 FN ARGS 1 LVAR 0 0 ; Y LSET 1 0 ; X RETURN RETURN RETURN NIL