方案的简单步进代码



我正在使用带有列表缩写的初学者语言。我已经做了三天以下的工作,但都无济于事。

我需要编写一个名为step的函数,该函数使用AExp形式的Scheme表达式(ex),并生成表示ex 轨迹中的下一步的AExp

示例:如果(ex)ex1是
(+5(*(+1 2 3)2(*4 1))7)

则(步骤ex1)产生:(+5(*6 2(*4 1))7)。

到目前为止,这就是我所做的:

(define (step ex)
 (cond [(number? ex) (list  ex)]
       [else
     (cond
       [(symbol=? (ainode-op ex) '+)
          (cons(ainode-op ex)
                  (list-eval1 (ainode-args ex)))]
       [(symbol=? (ainode-op ex) '*)
          (cons(ainode-op ex)
                  (list-eval2 (ainode-args ex)))])]))
(define (list-eval1 exlist)
             (cond [(empty? exlist)(list 0)]
                   [else (append(step (first exlist))
                         (list-eval1 (rest exlist)))]))

      (define (list-eval2 exlist)
              (cond [(empty? exlist)(list 0)]
                    [else (append(step (first exlist))
                    (list-eval2 (rest exlist)))]))

但我的功能并没有按我想要的方式工作。有什么帮助吗?

这里有一个提示。首先,您应该注意,当表达式只包含一个符号和一个或多个数字时,可以对其求值。因此,您可以定义一个辅助函数evaluable?,当其参数是可以计算的表达式时,该函数将返回true。例如:

(define (evaluable? exp)
  (cond ((null? exp) #t)
        ((list? (car exp)) #f)
        (else (evaluable? (cdr exp)))))

然后,您可以定义step来计算第一个可计算的(子)表达式,并重建该表达式的其余部分。在伪代码中,类似这样的东西:

(define (step exp)
  (cond ((number? exp) exp)
        ((evaluable exp) (evaluate exp))
        (else (... make a recursive descent in the current expression by rebuilding the external expression...))))

并且当然CCD_ 3应当评估包含运算符和数字操作数的列表。

编辑

如何下降和建造?step的最后一行可能是这样的:

(else (cons (car exp) (step-operands (cdr exp))))))

请注意,我们使用cons来重建具有相同car的结构,并使用函数step-operands对操作数的处理结果,该函数查找可以重写的表达式的第一个操作数。由于这是家庭作业,我只给你一个函数的草图(注意,我假设列表operands至少有一个元素,没有检查表达式的正确性):

(define (step-operands operands)
  (cond ((number? (car operands)) (cons (car operands) (... (cdr operands))))
        (else (cons (... (car operands))(cdr operands)))))

您只需要用适当的函数填充点(并思考正在发生的事情!)

最新更新