2015-10-11 18 views
1

所以这个函数应该用散列表中的该键的值替换x,这也是散列表的关键,但是当列表以某种方式变成< void>。为什么?这个函数变成<void>而不是交换值,为什么?

(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

swap是什么意思? – soegaard

+0

它搜索列表(L)为x。如果x存在,它将用新值替换它,在这种情况下(hash-ref * variables * x)。 – ghostofrasputin

+0

我将交换功能添加到我的问题以供参考^^^^ – ghostofrasputin

回答

1

试试这个:

(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部分。

+0

谢谢,修正了它 – ghostofrasputin

+0

还有一个问题:当if语句为false时,它将x追加到列表中,但它不应该是这样,它应该看起来像(+ 1 3 ),但它看起来像(+(+ 1 3)3)。 – ghostofrasputin

+0

有没有办法对列表做任何事,当它的虚假 – ghostofrasputin

相关问题