【发布时间】:2011-04-02 07:46:49
【问题描述】:
我正在为一个类编写一个程序,用一个新变量替换最左边出现的变量。 (它实际上也允许您自己提供等价关系)。问题是,在 Chez Scheme 8.2 中,如果最左边的出现在列表中,这会替换最右边的出现。我们使用运行某个版本的方案的服务器(我不确定哪个版本),并且在服务器上它正确地替换了最左边的出现。下面是代码:
(define subst-leftmost
(lambda (new old ls proc)
(let ([keep-going? #t])
(letrec ([helper
(lambda (ls)
(cond [(null? ls) ls]
[(or (pair? (car ls)) (null? (car ls)))
(cons (helper (car ls)) (helper (cdr ls)))]
[(and keep-going? (proc old (car ls)))
(set! keep-going? #f) (cons new (cdr ls))]
[else (cons (car ls) (helper (cdr ls)))]))]) (helper ls))))
这样调用: (subst-leftmost 'x 'a '(d b c (a) b a) eq?) 应该产生输出 (d b c (x) b a),并在服务器上执行。然而,在 Chez 方案中,它产生 (d b c (a) b x)。我认为差异是由于线
[(or (pair? (car ls)) (null? (car ls)))
(cons (helper (car ls)) (helper (cdr ls)))]
以未设置的顺序评估汽车的助手和 cdr 的助手。
我的问题是:哪个版本的方案遵循标准,如何修改我的代码以使其在两个版本中都能正常工作?
(我已经和我的教授谈过了。他将在周一向全班讲这件事,一旦他可以考虑一下,但我很好奇。我也已经得到了作业的满分,所以在这方面不要担心帮助我的道德。)
【问题讨论】:
标签: scheme