关于映射:Scheme标准中是否存在这样的过程,如果是,则如何调用它?

关于映射:Scheme标准中是否存在这样的过程,如果是,则如何调用它?

Does such a procedure exist in a Scheme standard and if yes, how is it called?

我寻找了一个过程的名称,该过程将过程的树形结构应用于数据的树形结构,从而产生结果的树形结构-所有三棵树都具有相同的结构。

此类过程可能具有签名:

1
(map-tree data functree)

其返回值将是functree元素在相应数据元素上逐元素应用的结果。

示例(假设该过程称为map-tree):

示例1:

1
2
3
4
(define *2 (lambda (x) (* 2 x)))
; and similar definitions for *3 and *5

(map-tree '(100 (10 1)) '(*2 (*3 *5)))

将产生结果

1
(200 (30 5))

示例2:

1
2
(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce)))
        '((car cdr) cadr))

产生结果

1
((aa bc) cd)

但是,在我查阅的SLIB文档中没有找到这样的功能。

这样的程序是否已经存在?
如果不是,该过程的合适名称是什么,以及如何对它的参数进行排序?


该函数的名字不是很好。我在下面粘贴我的实现(我称它为map-traversing;其他人应该建议一个更好的名称)。我已经将参数顺序映射为map本身的参数。

1
2
3
4
(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (func data)))

使用您的样本数据,我们有:

1
(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))

第二个示例需要SRFI26。(允许写入(cut * 2 <>)而不是(lambda (x) (* 2 x))。)

1
(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))

最重要的是,您的函数必须全部不带引号,与您的示例不同。


我发现使用下面的map-traversing定义,您无需取消引用函数:

1
2
3
4
(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (apply (eval func (interaction-environment)) (list data))))

注意:在我安装的Guile版本中,由于某些原因,只有(interaction-environment)不会引发Unbound variable错误。其他环境,即(方案报告环境5)和(空环境5)会引发此错误。

注2:随后,我在[1]中发现,要使(方案报告环境5)和(空环境5)正常工作,您首先需要(使用模块(ice-9 r5rs))<铅>

[1]:http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html'Re:guile -c"(scheme-report-environment 5)" ==>错误:未绑定变量:scheme-report-environment'


推荐阅读