racket - struct 是 Racket 中的宏吗?

标签 racket

我记得我在某处读到它不是宏,而是内置于核心语言中。像那样的东西,我不确定,因为我不记得我是从哪里读到的。那么 struct 是不是 Racket 中的宏?如果不是,为什么将它内置到核心语言中?

最佳答案

一个宏; struct.rkt

(define-syntax (struct stx)
    (define (config-has-name? config)
      (cond
       [(syntax? config) (config-has-name? (syntax-e config))]
       [(pair? config) (or (eq? (syntax-e (car config)) '#:constructor-name)
                           (eq? (syntax-e (car config)) '#:extra-constructor-name)
                           (config-has-name? (cdr config)))]
       [else #f]))
    (with-syntax ([orig stx])
      (syntax-case stx ()
        [(_ id super-id fields . config)
         (and (identifier? #'id)
              (identifier? #'super-id))
         (if (not (config-has-name? #'config))
             (syntax/loc stx
               (define-struct/derived orig (id super-id) fields  #:constructor-name id . config))
             (syntax/loc stx
               (define-struct/derived orig (id super-id) fields . config)))]
        [(_ id fields . config)
         (identifier? #'id)
         (if (not (config-has-name? #'config))
             (syntax/loc stx
               (define-struct/derived orig id fields  #:constructor-name id . config))
             (syntax/loc stx
               (define-struct/derived orig id fields . config)))]
        [(_ id . rest)
         (identifier? #'id)
         (syntax/loc stx
           (define-struct/derived orig id . rest))]
        [(_ thing . _)
         (raise-syntax-error #f
                             "expected an identifier for the structure type name"
                             stx
                             #'thing)]))))

在Racket IDE中,您可以使用Open Defining File功能来定位源代码(如果有的话)。

关于racket - struct 是 Racket 中的宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931806/

相关文章:

scheme - 如何在 Racket 中将 2 个列表合并为一个

scheme - DrRacket 定义开始设置!可能应该工作但不

image - 如何更改 Racket 中的图像大小

Racket:在子模块中启用涂鸦语言

racket - 如何从涂鸦/文本重新导出 #%module-begin 等?

使用对象在 Racket 中进行单元测试

scheme - 如何在 Racket 中得到小数的余数?

树深 : car/cdr contract violation

方案范围(定义和让)

functional-programming - Racket 复合缩减功能