此函数将列表 <void> 而不是交换值,为什么?
This function turns the list <void> instead of swapping the value, why?
所以这个函数应该用散列 table 中那个键的值换出 x,它也是散列 table 的键,但是当列表不知何故变成<无效>。为什么?
(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))))))
试试这个:
(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
不会构建新列表,它只是处理每个元素,returning 一个未定义的值(<void>
在这种情况下).这就是为什么你应该使用 map
到 return 一个新列表作为输出。
另外,请注意,您必须处理其中一个元素不存在于散列 table 中的情况 - 例如,filter
首先将它们取出。最后一件事 - swap
函数有问题,最后一个条件缺少 else
部分。
所以这个函数应该用散列 table 中那个键的值换出 x,它也是散列 table 的键,但是当列表不知何故变成<无效>。为什么?
(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))))))
试试这个:
(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
不会构建新列表,它只是处理每个元素,returning 一个未定义的值(<void>
在这种情况下).这就是为什么你应该使用 map
到 return 一个新列表作为输出。
另外,请注意,您必须处理其中一个元素不存在于散列 table 中的情况 - 例如,filter
首先将它们取出。最后一件事 - swap
函数有问题,最后一个条件缺少 else
部分。