Scheme后缀表达式代码报错求助:未绑定标识符e问题
Scheme后缀表达式实现报错解决
错误原因
你代码里的(eval '(e (car s) (cadr s)))存在问题:引号'创建的是字面表达式,这里的e是一个未绑定的符号,而不是变量e当前存储的操作符(比如+)。eval尝试执行符号e时自然会报未绑定标识符的错误。
修正后的代码
(define (stackupdate e s) (if (number? e) (cons e s) (cons (eval (list e (car s) (cadr s))) (cddr s)))) ; 用list构造正确的运算表达式 (define (postfixhelper lst s) (if (null? lst) (car s) (postfixhelper (cdr lst) (stackupdate (car lst) s)))) (define (postfix list) (postfixhelper list '())) (postfix '(1 2 +)) ; 运行结果为3
代码说明
- 将
'(e (car s) (cadr s))替换为(list e (car s) (cadr s)),这样会用变量e的实际值(比如传入的+)来构造可执行的运算表达式,eval就能正确识别并执行对应的操作。 - 也可以用准引用+反引用的写法实现相同效果:
(eval(,e (car s) (cadr s))),不过用list`构造表达式更直观易懂。
内容的提问来源于stack exchange,提问作者user19567940
相关产品推荐
相关产品推荐

