Scheme 此函数用于打开列表<;无效>;为什么不交换值?

Scheme 此函数用于打开列表<;无效>;为什么不交换值?,scheme,hashtable,swap,Scheme,Hashtable,Swap,因此,该函数应该将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) (

因此,该函数应该将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))))))
试试这个:

(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
不会作为结果构建新列表,它只处理每个元素,返回一个未定义的值(
)。这就是为什么您应该使用
map
返回一个新列表作为输出

另外,请注意,您必须处理其中一个元素不在哈希表中的情况—例如,
首先筛选出它们。最后一件事-交换
功能有问题,最后一个条件是缺少
其他部分。

尝试以下操作:

(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
不会作为结果构建新列表,它只处理每个元素,返回一个未定义的值(
)。这就是为什么您应该使用
map
返回一个新列表作为输出


另外,请注意,您必须处理其中一个元素不在哈希表中的情况—例如,
首先筛选出它们。最后一件事-
swap
函数有问题,最后一个条件是缺少
else
部分。

swap的定义是什么?它在列表(L)中搜索x。如果x存在,它将用新值替换它,在本例中为(hash ref variables x)。我将交换函数添加到我的问题中,以供参考^^^^
,因为每个
类似于
映射
,但不保留每个项目的结果。它的结果取决于实现,根据报告(标准),它是未定义的<代码>
是一个完全未定义的值<代码>交换
不会更改任何内容,而是生成一个新值,将所有内容
eq?
x替换为
y
。由于您对每个
都使用了
交换
的结果从未被使用,而是被丢弃。我也尝试了map,但得到了类似的错误swap的定义是什么?它在列表(L)中搜索x。如果x存在,它将用新值替换它,在本例中为(hash ref variables x)。我将交换函数添加到我的问题中,以供参考^^^^
,因为每个
类似于
映射
,但不保留每个项目的结果。它的结果取决于实现,根据报告(标准),它是未定义的<代码>
是一个完全未定义的值<代码>交换
不会更改任何内容,而是生成一个新值,将所有内容
eq?
x替换为
y
。由于您对每个都使用了
交换
的结果从未被使用,而是被丢弃。我也尝试了map,但得到了一个类似的错误仍然存在一个问题:当if语句为false时,它会将x追加到列表中,但不应该如此,它应该看起来像(+13),但看起来像(+13)3)相反,有没有一种方法可以在列表false@ghostofrasputin你在最初的问题中没有提到这一点。您必须分两步解决问题-首先,
filter
要处理的元素;第二,处理它们。我更新了我的答案。@ghostfrasputin然后为此编写一个帮助程序,对不起,这是一个不同的问题,超出了这个问题的范围。还有一个问题:如果if语句为false,它会在列表中附加x,但它不应该这样,它应该看起来像(+13),但看起来像(+13)3相反,有没有一种方法可以在列表false@ghostofrasputin你在最初的问题中没有提到这一点。您必须分两步解决问题-首先,
filter
要处理的元素;第二,处理它们。我更新了我的答案。@ghosofrasputin然后为此编写一个帮助程序,对不起,这是一个不同的问题,超出了本文的范围。