【问题标题】:In a custom Racket language, how can I define a recursive macro?在自定义 Racket 语言中,如何定义递归宏?
【发布时间】:2019-09-16 23:54:03
【问题描述】:

我正在尝试使用自定义 Racket 语言创建递归宏。 但是,虽然宏可以使用 #lang racket 正确扩展,但在使用我的新语言实现时会失败。

例如,下面是一个简单宏 f 的递归定义,它扩展为它的最后一个参数:

;; my-lang.rkt
#lang racket

(provide #%datum
         #%module-begin
         define-syntax
         (for-syntax syntax-case
                     syntax
                     raise-syntax-error
                     #%app
                     quote
                     #%datum))
#lang s-exp "my-lang.rkt"

(define-syntax (f stx)
  (syntax-case stx ()
    [(_ x) #'x]
    [(_ x xs ...) #'(f xs ...)]
    [_ (raise-syntax-error 'f "bad syntax" stx)]))


(f 1 2 3) ; =>  f: bad syntax in: (f 2 3)

为什么(f 2 3) 不匹配和扩展?

【问题讨论】:

    标签: macros racket


    【解决方案1】:

    ... 添加到提供的标识符中。

    #lang racket
    (provide #%datum
             #%module-begin
             define-syntax
    
             (for-syntax syntax-case
                         syntax
                         raise-syntax-error
                         #%app
                         quote
                         quote-syntax
                         ...
                         #%datum))
    

    【讨论】:

      猜你喜欢
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多