在Racket中实现多列表推导

时间:2014-12-07 23:56:31

标签: macros racket

我实现了一个宏来做列表推导

(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等等......

1 个答案:

答案 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不同,但重写规则可以直接转换为语法规则宏。