【发布时间】:2016-02-09 23:32:59
【问题描述】:
我正在尝试在 Scheme 中编写一个程序,该程序接受一个表示逻辑表达式的列表并评估整个表达式。我需要返回一个列表,其中包含在达到最终值之前完成的每个中间结果。输入看起来像 '(((~ #t) V #t V (#f & (~ #f))) & #t & (~ (#t V #f))) 其中 & => and, V => 或,而 ~ => 不是。该输入的输出应类似于 '(#f #t #f #f #f #f #t #f #f) ,最右边是最终结果,最左边是第一个完成的评估。
我有一个可以评估列表的函数,但是我无法弄清楚如何构建历史列表。这是我目前得到的代码。
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
(define evaluate1
(lambda (lst rst)
(cond
((null? lst) 'ErrEmptyList)
((equal? (cadr lst) 'V) (cons rst (or (car lst) (caddr lst))))
((equal? (cadr lst) '&) (cons rst (and (car lst) (caddr lst)))))))
(define evaluate
(lambda (lst)
(cond
((null? lst) 'ErrEmptyList)
((null? (cdr lst))
(cond
((atom? (car lst)) (car lst))
(else
(evaluate (car lst)))))
((equal? (car lst) '~) (not (cadr lst)))
((and (and (atom? (car lst)) (atom? (caddr lst))) (null? (cdddr lst))) (evaluate1 lst))
(else
(cond
((atom? (car lst)) (evaluate (flatten (cons (cons (car lst) (cadr lst)) (evaluate (cddr lst))))))
(else
(evaluate (flatten (cons (cons (evaluate (car lst)) (cadr lst)) (list (evaluate (cddr lst))))))))))))
我的代码只是返回给定示例的#f 的结果,如何构建要返回的结果列表而不仅仅是最终结果。我是计划的新手,非常感谢任何方向或帮助。
【问题讨论】:
-
看起来很有趣的问题。不幸的是,我没有时间详细了解它。但看起来这是“减少”过程的情况:它与
reduce(或foldl或fold-left)的工作方式相同,但不是只保留最后一个结果,而是将所有结果累积到列表中.