【问题标题】:redefining one of the existing racket forms重新定义现有球拍形式之一
【发布时间】:2019-05-03 06:50:01
【问题描述】:

我正在设计一种新语言,并想重新定义define 的程序形式,但也导出标准表达式形式。有没有办法我可以做到这一点?到目前为止,我有这个代码:

(define-syntax-rule (my-define (name args) body ...) ...)

(provide (rename-out [my-define define]) define)

但会生成错误“标识符已在:定义中提供(作为不同的绑定)”

【问题讨论】:

  • 您不能以相同的名称导出两个绑定。不过,您可以使用不同的名称导出旧的 define
  • 虽然我怀疑这不是你真正想要的。如果我猜对了,您想要一个新的define 表单来覆盖某些行为,但要使用旧的行为?
  • @AlexKnauth 如果我错了,请纠正我:我认为 Racket 有两种定义形式:一种绑定到 expr,另一种绑定到过程。我想重新定义其中一个并按原样导出另一个。我从你所说的猜测我基本上不能这样做并且必须重新定义一个组合的新表单来检查它是哪个表单然后进行相应的处理?
  • 没错,define 有两种形式,但两者都与同一标识符 define 相关联,因此您必须处理这两种情况。请参阅下面的答案。

标签: racket


【解决方案1】:

这是my-define 处理这两种情况的示例。

#lang racket
(provide (rename-out [my-define define]))
(require (for-syntax syntax/parse))

(define-syntax (my-define stx)
  (syntax-parse stx
    [(_define name:id e:expr)           (syntax/loc stx (define name e))]
    [(_define (name arg ...) body ...)  (syntax/loc stx (define (name arg ...) body ...))]))

【讨论】:

  • e:id 表示e 必须是标识符,e:expr 表示e 必须是表达式。 idexpr 是语法类,常见的记录在这里:docs.racket-lang.org/syntax/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多