此函数将列表 <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 部分。