Scheme标准中是否存在这样的过程?如果是,则如何称呼它?
时间:2020-03-06 14:24:11 来源:igfitidea点击:
我寻找一个过程的名称,该过程将过程的树形结构应用于数据的树形结构,从而产生结果树形结构,所有三棵树都具有相同的结构。
这样的过程可能具有签名:
(map-tree data functree)
它的返回值将是functree元素在相应数据元素上逐元素应用的结果。
示例(假设该过程称为map-tree):
范例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
本身。
(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)))
第二个示例需要SRFI26. (允许写入(cut * 2 <>)
而不是(lambda(x)(* 2 x))
。)
(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))
最重要的是,函数必须全部不带引号,这与示例不同。
我发现,有了下面的map-traversing定义,我们无需取消引用这些函数:
(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/[email protected]/msg04368.html'Re:guile -c"(scheme-report-environment 5)" ==>错误:未绑定变量:scheme-report-environment'