2016-03-05 46 views
0

我有一個帶有多個變體的ExprC語言,我希望能夠解釋seqC變體。 seqC變體返回給定表達式列表中的最後一個表達式。(球拍)解釋序列返回列表中的最後一個表達式

(define-type ExprC 
    [numC (n : number)] 
    [idC (s : symbol)] 
    [plusC (left : ExprC) (right : ExprC)] 
    [multC (left : ExprC) (right : ExprC)] 
    [letC (id : symbol) (value : ExprC) (expr : ExprC)] 
    [appC (func : ExprC) (arg : ExprC)] 
    [lamC (param : symbol) (body : ExprC)] 
    [boxC (val : ExprC)] 
    [unboxC (bx : ExprC)] 
    [setboxC (bx : ExprC) (val : ExprC)] 
    [seqC (e : (listof ExprC)] 
) 

目前,我能夠得到它的解釋,如基本的序列:

(test (interp (seqC (list (numC 1) (numC 2) (numC 3))) mt-env mt-store) 
     (v*s (numV 3) mt-store)) 

然而,當我嘗試更復雜的順序,比如這一個不斷設置的值一箱「X」:

(test (interp {letC 'x {boxC {numC 1}} {seqC {list {setboxC {idC 'x} 
                 {plusC {numC 2} 
                   {unboxC {idC 'x}}}} 
               {setboxC {idC 'x} 
                 {multC {numC 4} 
                   {unboxC {idC 'x}}}} 
               {setboxC {idC 'x} 
                 {plusC {numC 1} 
                   {unboxC {idC 'x}}}} 
               {unboxC {idC 'x}}}}} mt-env mt-store) 
     (v*s (numV 13) (mem 2 (list (cell 1 (numV 13)) 
            (cell 1 (numV 12)) 
            (cell 1 (numV 3)) 
            (cell 2 (boxV 1)) 
            (cell 1 (numV 1)))))) 

這只是評估第一個表達式並返回一個值,而不是做每一組/拆箱和返回的最終值。錯誤說法:

(bad (interp (letC 'x (boxC (numC 1)) 
(seqC (list (setboxC (idC 'x) (plusC (numC 2) (unboxC (idC 'x)))) 
(setboxC (idC 'x) (multC (numC 4) (unboxC (idC 'x)))) 
(setboxC (idC 'x) (plusC (numC 1) (unboxC (idC 'x)))) 
(unboxC (idC 'x))))) mt-env mt-store) 
//Value the interpreter is getting 
(v*s (numV 3) (mem 2 (list (cell 1 (numV 3)) (cell 2 (boxV 1)) (cell 1 (numV 1))))) 
//Value it should be 
(v*s (numV 13) (mem 2 (list (cell 1 (numV 13)) (cell 1 (numV 12)) 
(cell 1 (numV 3)) (cell 2 (boxV 1)) (cell 1 (numV 1))))) 

我對SEQC解釋如下:

(define (interp [expr : ExprC] [env : Env] [sto : Store]) : Result 
    (type-case ExprC expr 
... 
[seqC (m) (type-case Result (interp (firstE m) env sto) 
        [v*s (first-v first-s) 
          (cond 
          [(empty? (rest m)) ;no more left to be sequenced 
          (v*s first-v first-s)] 
          [(not (empty? (rest m))) ;not empty 
          (interp (lastE m) env first-s)])])] ;call function on next item in list 

firstE和樂特是隻是一個基本的輔助函數返回ExprC的給定的列表中的第一個或最後一個表達式。如果您需要更多信息來了解代碼,請告訴我,我可以提供/解釋它。

回答

2

您的代碼與您的評論不符。你說你想「在列表中的下一個項目上調用函數」,但是你的代碼直接解釋最後一個元素,跳過m中的(中)元素,這顯然是錯誤的。

如果你遞歸思考,你會發現根本不需要lastE。在遞歸的每一步中,您都會解釋序列中的第一個元素。如果(rest m)爲空,那麼很酷,您只需返回該值。否則,您可以構建seqC其中包含(rest m)並解釋它(與新的商店)。

+0

我明白了,謝謝! – BrxttB