You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Racket中递归展开宏且不触发未绑定标识符错误?

在Racket中自定义语言的宏全展开问题

我正在使用Racket构建一门自定义语言,希望展开给定语法中的所有宏,同时保留其他形式不变。

示例代码

#lang racket

(define-syntax-rule (identity x) x)
(define-syntax-rule (make-pair x y) (pair x y))

(define-syntax my-expand
  (lambda (stx)
    (define expr-stx (cadr (syntax-e stx)))
    (printf "expanded1: ~a\n" (local-expand expr-stx 'expression #f))
    (printf "expanded2: ~a\n" (local-expand expr-stx 'expression '()))
    #'(void)
    ))

(my-expand (make-pair (identity foo) (identity bar)))

期望输出

expanded1: #<syntax:expand.rkt:34:11 (pair (identity foo) (identity bar))>
expanded2: #<syntax:expand.rkt:34:11 (pair foo bar)>

实际输出

expanded1: #<syntax:expand.rkt:34:11 (pair (identity foo) (identity bar))>
expand.rkt:6:37: pair: unbound identifier
  in: pair
  location...:
   expand.rkt:6:37
  context...:
   /usr/share/racket/collects/syntax/wrap-modbeg.rkt:46:4

我已阅读《Macros for Domain-Specific Languages》论文,了解过ee-lib包,也参考了其他基于Racket实现的语言,但仍未解决问题。

我猜测Racket展开器需要了解所有标识符的作用域(例如为了实现宏卫生性),但我的自定义语言作用域规则与Racket并不匹配,是否有简便的解决方法?


内容的提问来源于stack exchange,提问作者Martin Cejp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:33