next up previous
Next: 5.3 ifのコード生成 Up: 5 スペシャルフォームのコンパイル Previous: 5.1 beginのコード生成

5.2 set!のコード生成

set!のコードは,代入される変数が環境envにあれば LSETのコードを生成し,なければGSETのコードを生成します.

(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


generated through LaTeX2HTML. M.Inaba 平成18年5月6日