所以这个函数应该用哈希表中的那个键的值来换出x,这也是哈希表的关键,但是当列表以某种方式变成<无效>。为什么?
(define (var-helper L)
(for-each (lambda (x) (when (hash-has-key? *variables* x)
(swap x (hash-ref *variables* x) L)))
L))
这是我正在使用的交换功能:
(define (swap x y L)
(cond ((empty? L) '())
((list? (car L))
(cons (swap x y (car L))
(swap x y (cdr L))))
((eq? x (car L))
(cons y (swap x y (cdr L))))
((cons (car L) (swap x y (cdr L))))))
答案 0 :(得分:0)
试试这个:
(define (var-helper L)
(map (lambda (x) (swap x (hash-ref *variables* x) L))
(filter (lambda (x) (hash-has-key? *variables* x))
L)))
正如评论中所提到的,for-each
不构建新的列表作为结果,它只处理每个元素,返回一个未定义的值(在这种情况下为<void>
)。这就是为什么你应该使用map
返回一个新列表作为输出。
另外,请注意,当哈希表中没有其中一个元素时必须处理这种情况 - 例如,filter
首先将它们输出。最后一件事 - swap
函数有问题,最后一个条件是缺少else
部分。