这样的过程是否存在于Scheme标准中?如果存在,它是如何被调用的?
题
我查找了一个过程的名称,该过程将过程的树结构应用于数据的树结构,产生结果的树结构 - 所有三棵树都具有相同的结构。
这样的过程可能具有签名:
(map-tree data functree)
它的返回值将是 functree 元素在相应数据元素上按元素应用的结果。
示例(假设该过程称为映射树):
示例1:
(define *2 (lambda (x) (* 2 x))) ; and similar definitions for *3 and *5 (map-tree '(100 (10 1)) '(*2 (*3 *5)))
会产生结果
(200 (30 5))
示例2:
(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce))) '((car cdr) cadr))
产生结果
((aa bc) cd)
然而我在查阅SLIB文档时并没有找到这样的函数。
这样的程序是否已经存在?
如果不是,该过程的合适名称是什么?您将如何排序其参数?
解决方案
我没有为这个函数起一个很好的名字。我将我的实现粘贴在下面(我称之为 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)))
最重要的是,与您的示例不同,您的函数必须全部不加引号。
其他提示
我发现通过以下地图遍历的定义,您不需要取消引用函数:
(define (map-traversing func data) (if (list? func) (map map-traversing func data) (apply (eval func (interaction-environment)) (list data))))
笔记:在我安装的 Guile 版本中,由于某种原因,只有 (interaction-environment) 不会引发 Unbound 变量错误。其他环境即(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 '关于:guile -c“(方案报告环境5)”==>错误:未绑定变量:方案-报告-环境'