Forms 如何重新定义方案/球拍的基本形式?

Forms 如何重新定义方案/球拍的基本形式?,forms,scheme,lisp,racket,redefine,Forms,Scheme,Lisp,Racket,Redefine,Racket有内置的基本形式2臂if,但它没有else这个词,所以我想添加else这个词 此代码适用于: (require syntax/parse/define) (define-syntax-rule (myif Cond Form1 else Form2) (if Cond Form1 Form2) ) (myif #t (displayln 1) else (displayln 2)) 但是,不希望将myif作为关键字,将其更改为if会引发错误: if: use does not

Racket有内置的基本形式2臂if,但它没有else这个词,所以我想添加else这个词

此代码适用于:

(require syntax/parse/define)
(define-syntax-rule (myif Cond Form1 else Form2)
  (if Cond Form1 Form2)
)

(myif #t (displayln 1) else (displayln 2))
但是,不希望将myif作为关键字,将其更改为if会引发错误:

if: use does not match pattern: (if Cond Form1 else Form2)
in: (if #t (displayln 1) (displayln 2))

如何重新定义表单if?

谢谢@AlexKnauth的评论,我可以重新定义if,如下所示:

(require syntax/parse/define)
(require (only-in racket/base [if r-if]))

(define-syntax-rule (if Cond Form1 else Form2)
  (r-if Cond Form1 Form2)
)

(if #t (displayln 1) else (displayln 2))

感谢@AlexKnauth的评论,我可以重新定义如下:

(require syntax/parse/define)
(require (only-in racket/base [if r-if]))

(define-syntax-rule (if Cond Form1 else Form2)
  (r-if Cond Form1 Form2)
)

(if #t (displayln 1) else (displayln 2))

上面的答案在某种程度上是正确的,但也有一些错误

定义语法规则不是来自syntax/parse/define。如果要使用define语法规则,则不需要syntax/parse/define

当我用你的if调用if 1 2 3时会发生什么?宏中的else是一个模式变量,因此它可以与任何对象匹配。你打算允许这种情况发生吗?如果没有,您可以在这里使用syntax/parse/define的功能。你可以写:

(require syntax/parse/define)
(define-simple-macro (if test-expr:expr 
                         {~datum then} 
                         then-expr:expr 
                         {~datum else} 
                         else-expr:expr)
  (racket:if test-expr then-expr else-expr))
所以,如果1,那么2 else 3将扩展到球拍:如果1 2 3,但是如果1 0 2 0 3将失败并出现错误


上面的答案在某种程度上是正确的,但也有一些错误

定义语法规则不是来自syntax/parse/define。如果要使用define语法规则,则不需要syntax/parse/define

当我用你的if调用if 1 2 3时会发生什么?宏中的else是一个模式变量,因此它可以与任何对象匹配。你打算允许这种情况发生吗?如果没有,您可以在这里使用syntax/parse/define的功能。你可以写:

(require syntax/parse/define)
(define-simple-macro (if test-expr:expr 
                         {~datum then} 
                         then-expr:expr 
                         {~datum else} 
                         else-expr:expr)
  (racket:if test-expr then-expr else-expr))
所以,如果1,那么2 else 3将扩展到球拍:如果1 2 3,但是如果1 0 2 0 3将失败并出现错误

重新定义if时,请确保更改旧if的用法,以便它们不会意外指向错误的if。在新定义中,您希望委托给旧if,因此我建议仅在racket/base[if old if]中导入旧if with require,然后在您想要的位置使用旧if当您重新定义if时,请确保更改旧if的使用,以便它们不会意外指向错误的if。在新定义中,您希望委托给旧if,因此我建议仅在racket/base[if old if]中使用require导入旧if,然后在您想要的地方使用old if