我正在使用带有列表缩写的初学者语言。 我一直在研究以下3天无济于事。
我需要编写一个名为step的函数来消耗a 方案表达式(ex)以AExp的形式生成一个AExp,代表ex的痕迹中的下一步
示例:
如果(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)))]))
但我的功能并不像我想要的那样工作。 有什么帮助吗?
答案 0 :(得分:4)
这是一个提示。首先,您应该注意,当表达式只包含一个符号和一个或多个数字时,可以对其进行求值。因此,您可以定义一个辅助函数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...))))
当然evaluate
应评估包含运算符和数字操作数的列表。
修改强>
如何下降和构建? 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)))))
你只需要用适当的功能填充点(并考虑发生了什么!)