【问题标题】:Unquoting in Nested Macros in Racket在 Racket 的嵌套宏中取消引用
【发布时间】:2015-06-25 17:09:46
【问题描述】:

上下文

语言是#lang web-server/insta,此代码将在传递给response/xexpr的准引号参数中生成

呼唤

-> (define home 'home-page)
-> (make-navigation home "home-page")

电流输出

注意((href , (embed/url ...之前的`反引号

'(p ((id "home-page")) (a `((href ,(embed/url home-page))) "home-page"))

所需的输出

请注意,` 已消失。

'(p ((id "home-page")) (a ((href ,(embed/url home-page))) "home-page"))

当前代码

(define (make-navigation uri label)

  (define (make-id uri)
    `((id ,(symbol->string uri))))

  (define-syntax-rule (embed uri)
    ``((href ,(embed/url ,uri))))

  `(p ,(make-id uri)
      (a ,(embed uri)
     ,label)))

问题点

问题可能出在embed

【问题讨论】:

    标签: macros racket


    【解决方案1】:
    #lang racket
    (define (make-navigation uri label)
    
      (define (make-id uri)
        `((id ,(symbol->string uri))))
    
      (define-syntax-rule (embed uri)
        '((href ,(embed/url uri))))
    
      `(p ,(make-id uri)
          (a ,(embed uri)
         ,label)))
    
    (define home 'home-page)
    (make-navigation home "home-page")
    

    输出:

    '(p ((id "home-page")) (a ((href ,(embed/url uri))) "home-page"))
    

    更新

    (define (make-navigation uri label)
    
      (define (make-id uri)
        `((id ,(symbol->string uri))))
    
      (define-syntax-rule (embed uri)
        `((href ,(list 'unquote (list 'embed/url uri)))))
    
      `(p ,(make-id uri)
          (a ,(embed uri)
         ,label)))
    
    (define home 'home-page)
    (make-navigation home "home-page")
    

    输出:

    '(p ((id "home-page")) (a ((href ,(embed/url home-page))) "home-page"))
    

    【讨论】:

    • 错过了。新尝试。
    • 我一直在努力控制评估和非评估,,(list 'unquote (list 'my-function my-args) 看起来像是一个有用且说明性的模式。谢谢。
    • 不太漂亮。
    • 工作已经够甜蜜了... 语法糖会导致分号癌。 ——艾伦·J·玻璃市
    • define-syntax-rule 转换为define 会稍微整理一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多