这个函数转换列表<void>而不是交换值,为什么?

时间:2015-10-11 22:07:45

标签: scheme hashtable swap

所以这个函数应该用哈希表中的那个键的值来换出x,这也是哈希表的关键,但是当列表以某种方式变成&lt;无效&gt;。为什么?

(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))))))

1 个答案:

答案 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部分。