next up previous
Next: 4 定数のコンパイル Up: 3 変数のコンパイル Previous: 3.1 大域変数のコンパイル

3.2 局所変数のコンパイル

局所変数では,環境変数envの中の 場所をアドレスを与えるLVARというコードを生成します. LVARのアドレスを表す引数は, いくつめの枠で,その枠の何番目かを示します. 環境envは,関数の仮引数やletなどの局所変数のリストで 枠を表し,その枠のリストを表します.

<cl> (comp-show '(lambda (a) a))

      ARGS  0     
      FN    
            ARGS  1     
            LVAR  0     0     ;     A     
            RETURN
      RETURN
NIL

<cl> (comp-show '(lambda (a b) b))

      ARGS  0     
      FN    
            ARGS  2     
            LVAR  0     1     ;     B     
            RETURN
      RETURN
NIL

<cl> (comp-show '(let ((a 10)) a))

      ARGS  0     
      CONST 10    
      FN    
            ARGS  1     
            LVAR  0     0     ;     A     
            RETURN
      CALL  1     
      RETURN
NIL

<cl> (comp-show '(let ((a 10) (b 20)) a b))

      ARGS  0     
      CONST 10    
      CONST 20    
      FN    
            ARGS  2     
            LVAR  0     0     ;     A     
            POP   
            LVAR  0     1     ;     B     
            RETURN
      CALL  2     
      RETURN
NIL

<cl> (comp-show '((lambda (a b) a b) 10 20))

      ARGS  0     
      CONST 10    
      CONST 20    
      FN    
            ARGS  2     
            LVAR  0     0     ;     A     
            POP   
            LVAR  0     1     ;     B     
            RETURN
      CALL  2     
      RETURN
NIL

<cl> (comp-show
        '(let ((a 10) (b 20))
           (let ((c 30) (d 40))
              (let ((e 50) (f 60))
                 (list a b c d e f)))))

      ARGS  0     
      CONST 10    
      CONST 20    
      FN    
            ARGS  2     
            CONST 30    
            CONST 40    
            FN    
                  ARGS  2     
                  CONST 50    
                  CONST 60    
                  FN    
                        ARGS  2     
                        LVAR  2     0 ; A     
                        LVAR  2     1 ; B     
                        LVAR  1     0 ; C     
                        LVAR  1     1 ; D     
                        LVAR  0     0 ; E     
                        LVAR  0     1 ; F     
                        GVAR  LIST  
                        CALL  6     
                        RETURN
                  CALL  2     
                  RETURN
            CALL  2     
            RETURN
      CALL  2     
      RETURN
NIL

<cl> (comp-show
        '((lambda (a b)
           (let ((a 1) (b 2))
              (list a b)))
          3 4))

      ARGS  0     
      CONST 3     
      CONST 4     
      FN    
            ARGS  2     
            CONST 1     
            CONST 2     
            FN    
                  ARGS  2     
                  LVAR  0     0     ; A     
                  LVAR  0     1     ; B     
                  GVAR  LIST  
                  CALL  2     
                  RETURN
            CALL  2     
            RETURN
      CALL  2     
      RETURN
NIL


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