简体   繁体   English

在球拍的嵌套宏中取消引用

[英]Unquoting in Nested Macros in Racket

Context 语境

The language is #lang web-server/insta and this code will be generated inside a quasiquoted argument passed to response/xexpr 语言是#lang web-server/insta ,此代码将在传递给response/xexpr的准引用参数内生成

The Call 电话

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

Current Output 电流输出

Note the ` backquote before ((href , (embed/url ... 注意((href , (embed/url ...

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

Desired Output 期望的输出

Note that the ` is gone. 请注意`已消失。

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

Current Code 当前代码

(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)))

Problem Locus 问题轨迹

The issue is probably with embed . 问题可能与embed

#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")

Output: 输出:

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

UPDATE 更新

(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")

Output: 输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM