【问题标题】:Implementing multi list comprehensions in Racket在 Racket 中实现多列表推导
【发布时间】:2014-12-07 23:56:30
【问题描述】:

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

(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 等一起使用...

【问题讨论】:

  • 你这样做只是为了好玩吗? Racket 自带much more general comprehensions 系统,你尝试重新实现它是没有意义的。
  • 是的,只是想学习宏

标签: macros racket


【解决方案1】:

由于 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 章。您可以在此处在线阅读该章节:

http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/PAGES/127.HTM

语法和Scheme不同,但是重写规则可以直接翻译成语法规则宏。

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多