有选择地迭代 Scheme 中的列表

Selectively iterating over a list in Scheme

我在 Scheme 中有一个对象列表。每个对象本身就是一个列表。我正在使用 map 函数遍历列表的所有元素并对它们应用一个函数。但是,我只想在列表的元素满足某些条件时才应用该函数。在 C++ 中会是这样的:

for(i=0; i<=n; i++)
{
    if(criteria(list[n]))
    //do something
}

如何在 Scheme 中执行此操作?现在,我正在使用这样的地图功能:

(map create-evaluation-link parse)

其中 create-evaluation-link 是函数,parse 是列表。

使用您所采用的方法,只需映射一个检查项目是否符合条件的函数:

(map (lambda (x)
       (if (criteria? x)
           (create-evaluation-link x)))
      parse)

但是,正如其他人在评论中指出的那样,使用 map 执行命令式工作可能是 Scheme 中其他一些方法可能更自然的地方。例如,您可能首先过滤掉不符合条件的值,然后在其上映射 create-evaluation-link 以获得 evaluation-links.[=12= 的列表]

(map create-evaluation-link (filter criteria? parse))