我实现了一个宏来做列表推导
(define-syntax list-comp
(syntax-rules (for in if)
[(list-comp <expr> for <var> in <list>)
(map (lambda (<var>) <expr>) <list>)]
[(list-comp <expr> for <var> in <list> if <cond>)
(map (lambda (<var>) <expr>)
(filter (lambda (<var>) <cond>) <list>))]))
我想修改这个宏,以便它可以接受任意数量的列表。
例如,
(+ l1 l2) for in List1 List2
将返回添加每个列表中每个元素的总和
并且还应该使用(+ l1 l2 l3...) for in list1 list2 list3
等等......
答案 0 :(得分:2)
由于map可以同时映射多个列表,因此多变量大小写是一个变量大小写的自然扩展。
(define-syntax list-comp
(syntax-rules (for in if)
[(list-comp <expr> for (<var> ...) in <list> ...) ;
(map (lambda (<var> ...) <expr>) <list> ...)]
[(list-comp <expr> for <var> in <list>)
(map (lambda (<var>) <expr>) <list>)]
[(list-comp <expr> for <var> in <list> if <cond>)
(map (lambda (<var>) <expr>)
(filter (lambda (<var>) <cond>) <list>))]))
(define xs '( 1 2 3))
(define ys '(10 20 30))
(list-comp (+ x y) for (x y) in xs ys)
(list-comp x for x in xs)
如果您想阅读更多关于列表推导的内容,我可以推荐本书第7章&#34;功能语言的实现&#34;。你可以在这里阅读这一章:
http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/PAGES/127.HTM
语法与Scheme不同,但重写规则可以直接转换为语法规则宏。