首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向语法模式变量的语法参数?

指向语法模式变量的语法参数?
EN

Stack Overflow用户
提问于 2016-08-31 00:43:15
回答 1查看 48关注 0票数 2

syntax-parameterize通常与make-rename-transformer一起使用,因此语法参数p充当另一个标识符的别名:

代码语言:javascript
复制
#lang racket

(require racket/stxparam)
(define-syntax-parameter p #f)

(define-syntax (test-1-p stx)
  (syntax-case stx ()
    [(_ body)
     #'(let ([tmp 123])
         (syntax-parameterize ([p (make-rename-transformer #'tmp)])
           body))]))
(test-1-p p) ;; prints 123

上面的代码运行良好,因为tmp是由let绑定的标识符。但是,如果我尝试将p作为由with-syntax绑定的模式变量tmp的别名,那么它不会像预期的那样工作:

代码语言:javascript
复制
#lang racket

(require racket/stxparam)
(define-syntax-parameter p #f)

(define-syntax (test-2-p stx)
  (syntax-case stx ()
    [(_ body)
     #'(with-syntax ([tmp #'(foo 123)])
         (syntax-parameterize ([p (make-rename-transformer #'tmp)])
           body))]))
(test-2-p #'p) ;; gives #'p, instead of #'(foo 123)

相反,如果我声明一个p-unhygienic语法,并将其绑定到(make-rename-transformer #'tmp),那么它工作得很好:

代码语言:javascript
复制
#lang racket

(define-syntax (test-3-p stx)
  (syntax-case stx ()
    [(_ body)
     #`(with-syntax ([tmp #'(foo 123)])
         (define-syntax #,(syntax-local-introduce #'p-unhygienic)
           (make-rename-transformer #'tmp))
         body)]))
(test-3-p #'p-unhygienic) ;; gives #'(foo 123), as expected

如何使用syntax-parameterize为模式变量创建卫生别名?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 02:46:13

这是一个有趣的案例,我料到你会做同样的事情。这可能是某个地方的bug或限制;我不确定。无论哪种方式,define-rename-transformer-parameter表单都是作为一种解决办法提供的。

rename- transformer -参数的初始值必须是rename-transformer,因此您可以使用带有#fp-init标识符作为转换器绑定。

代码语言:javascript
复制
(define-syntax p-init #f)
(define-rename-transformer-parameter p (make-rename-transformer #'p-init))

在上下文中:

代码语言:javascript
复制
#lang racket

(require racket/stxparam)
(define-syntax p-init #f)
(define-rename-transformer-parameter p (make-rename-transformer #'p-init))

(define-syntax (test-2-p stx)
  (syntax-case stx ()
    [(_ body)
     #'(with-syntax ([tmp #'(foo 123)])
         (syntax-parameterize ([p (make-rename-transformer #'tmp)])
           body))]))
(test-2-p #'p) ; #<syntax:10:28 (foo 123)>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39232930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档