(Racket)解释Seq以返回列表中的最后一个表达式

(Racket)解释Seq以返回列表中的最后一个表达式,racket,Racket,我有一种带有多个变体的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 : Ex

我有一种带有多个变体的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”值的序列:

它只是计算第一个表达式并返回该值,而不是执行每个set/unbox并返回最终值。错误声明:

    (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和lastE只是一个基本的helper函数,它返回给定ExprC列表中的第一个或最后一个表达式。如果您需要更多信息来理解代码,请告诉我,我可以提供/解释。

您的代码与您的注释不匹配。您说您想“调用列表中下一项的函数”,但您的代码只是直接解释最后一个元素,跳过
m
中的(中间)元素,这显然是错误的


如果你递归地思考,你会发现根本不需要
lastE
。在递归的每个步骤中,解释序列中的第一个元素。如果
(rest m)
为空,那么cool,您只需返回值。否则,您可以构造一个包含
(rest m)
seqC
,并(使用新存储)对其进行解释。

您的代码与您的注释不匹配。您说您想“调用列表中下一项的函数”,但您的代码只是直接解释最后一个元素,跳过
m
中的(中间)元素,这显然是错误的

如果你递归地思考,你会发现根本不需要
lastE
。在递归的每个步骤中,解释序列中的第一个元素。如果
(rest m)
为空,那么cool,您只需返回值。否则,您可以构造一个包含
(rest m)
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