Macros 在Racket中实现多列表理解

Macros 在Racket中实现多列表理解,macros,racket,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

我正在实现一个宏来理解待办事项列表

(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>))]))
(定义语法列表组件
(语法规则(用于if中)
[(列出in的组件)
(地图(lambda())]
[(在if中列出组件)
(映射(lambda())
(过滤器(lambda()))]
我想修改这个宏,使它可以接受任何数量的列表

比如说
(+l1 l2)for in List1 List2
将返回添加每个列表中每个元素的总和
并且还应与列表1、列表2、列表3等中的
(+l1、l2、l3…)配合使用。

由于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)
(定义语法列表组件
(语法规则(用于if中)
[(列出……)中的(…)公司;
(地图(lambda(…)…)]
[(列出in的组件)
(地图(lambda())]
[(在if中列出组件)
(映射(lambda())
(过滤器(lambda()))]
(定义xs'(1 2 3))
(定义Y’(10 20 30))
(在xs-ys中列出(x-y)的公司(+x-y)
(在xs中为x列出组件x)
如果您想阅读更多关于列表理解的内容,我可以推荐《函数式语言的实现》一书的第7章。您可以在此处在线阅读本章:


语法与Scheme不同,但重写规则可以直接转换为语法规则宏。

您这样做只是为了好玩吗?Racket附带了一个系统,你没有必要尝试重新实现它。是的,只是尝试学习宏