如何使用语法模板展平嵌套列表?

问题描述 投票:0回答:1

我正在研究神话宏中的示例,并且完全被

result6
难住了。

目标是替换以下代码片段中的

???-pattern
???-template
,以使其评估为 true。

(define result6
  (with-syntax
    ([???-pattern (syntax ((a (1 "alpha") (2 "beta"))
                           (b (3 "gamma") (4 "delta"))))])
    (syntax ???-template)))
 
(equal? (syntax->datum result6)
        '((a b) (1 2 3 4) ("alpha" "beta" "gamma" "delta")))

我认为我的模式是正确的,但不知道如何制作模板以及可能的拼接。我最好的迭代:

(define result6
  (with-syntax
    ([  ((l (n text) ...) ...)
      #'((a (1 "alpha") (2 "beta"))
         (b (3 "gamma") (4 "delta")))])
    #'( (l ...)  (~@ n ...) ... ) ))

这产生:

`((a b) 1 2 3 4)

我还没有获得

text
模板来处理我尝试的任何内容。你如何解决这个问题?我对此缺少什么?

macros racket
1个回答
0
投票

明白了!

我使模式解析更加明确,然后通过模板进行调整。

(define syntax-example
  #'((a (1 "alpha") (2 "beta")) (b (3 "gamma") (4 "delta"))))

(define result6
  (with-syntax
    ([ ( (l (n1 t1) (n2 t2)) ...) syntax-example])
    #'( (l ...) ((~@ n1 n2) ...) ((~@ t1 t2) ... ))))
© www.soinside.com 2019 - 2024. All rights reserved.