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的給定的列表中的第一個或最後一個表達式。如果您需要更多信息來了解代碼,請告訴我,我可以提供/解釋它。
我明白了,謝謝! – BrxttB