该问题要求编写满足以下交互的forEach函数。它说该函数应该在列表和行为周围创建闭包。
(define iterator (forEach (list 1 2 3 4 5)))
(iterator (lambda (x)(* x x))) → (1 4 9 16 25)
(iterator (lambda (x)(* x 10))) → (10 20 30 40 50)
我似乎无法弄明白。这是我如何开始的,但我可能会离开:
(define (map procedure items)
(if (null? items)
'()
(cons (procedure (car items))
(map procedure (cdr items)))))
(define (forEach l) (lambda (x)
(cond ((not (null? l))
(x (car l))
(forEach (map x (cdr l)))))))
(define iterator (forEach (list 1 2 3 4 5)))
(iterator (lambda (x)(* x x)))
(iterator (lambda (x)(* x 10)))
答案 0 :(得分:0)
您的forEach
返回一个函数,该函数在闭包中的列表上将函数带到map
。
你如何通过滚动你自己的递归或map
本身,但肯定不是两者。同样从forEach
结果调用forEach
将使其进行惰性评估而不是映射。
请注意,forEach
遵循CamelCase而不是lisp-case,这是lisp语言中更常见的命名约定。正确的名称是for-each
。不幸的是,该名称有一个更高阶的函数,与map
相同,但不会累积结果。
以下是您尝试作为不使用map
的递归解决方案:
(define (iterate lst)
(lambda (fn)
(define (aux lst)
(if (null? lst)
'()
(cons (fn (car lst))
(aux (cdr lst)))))
(aux lst)))
(define iterator (iterate '(1 2 3)))
(iterator -) ; ==> (-1 -2 -3)
aux
几乎完成了map
所做的事情,除了关闭fn
之外我们可以通过传递fn
来解决这个问题并使用您的版本:
(define (iterate lst)
(lambda (fn)
(map fn lst)))
答案 1 :(得分:0)
forEach
获取一个列表并返回一个函数
此返回的函数应该采用另一个函数并将其应用于列表的每个元素
“将一个函数应用于列表的每个元素”是map
的作用:
(iterator (lambda (x)(* x x))) → (map (lambda (x)(* x x)) (list 1 2 3 4 5))
(iterator (lambda (x)(* x 10))) → (map (lambda (x)(* x 10)) (list 1 2 3 4 5))
所以,你需要的只是
(define (forEach ls)
(lambda (fn) (map fn ls)))