3

我查找了一个过程的名称,它将过程的树结构应用于数据的树结构,产生结果的树结构——所有三棵树都具有相同的结构。

这样的过程可能具有以下签名:

(地图树数据功能树)

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

示例(假设该过程称为映射树):

示例 1:

(定义 *2 (lambda (x) (* 2 x)))
; *3 和 *5 的类似定义

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

会产生结果

(200 (30 5))

示例 2:

(地图树'((((aa .ab)(bb .bc))(cc .(cd .ce)))
        '((汽车 cdr) cadr))

产生结果

((aa bc) 光盘)

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

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

4

2 回答 2

3

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

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (func data)))

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

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

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

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

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

于 2008-09-19T01:03:14.227 回答
1

我发现使用地图遍历的以下定义,您不需要取消引用函数:

(定义(地图遍历函数数据)
  (如果(列表?函数)
      (map map-traversing func 数据)
      (apply (eval func (interaction-environment)) (list data))))

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

注 2:随后,我在 [1] 中发现,要使 (scheme-report-environment 5) 和 (null-environment 5) 工作,您首先需要 (use-modules (ice-9 r5rs))

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

于 2008-09-19T03:09:40.897 回答