别名 宏子句的名称

alias a name for the clause of a macro

我想为一些 racket 2htdp functions/macros 添加别名,以便我可以将它们翻译成另一种语言以用于我的 children.

作为函数的东西我可以简单地用 define 作为别名。我在使用 big-bang 结构时遇到问题;例如,如果我尝试别名 on-tick,每次我得到 big-bang: [new-name] clauses are not allowed within big-bang.

我尝试了 define-syntax 的各种变体,但到目前为止我无法使它工作(也就是说,我是一个完整的球拍新手)。

这样的东西可行(好吧,ladja 未定义):

#lang racket
(require 2htdp/universe 2htdp/image)

(big-bang 0
            (on-tick (lambda (x) (+ x 1)))
            (to-draw (lambda (x) (place-image ladja 150 x (prazni-prostor 300 300))))
            (stop-when (lambda (x) (= x 300))))

但这不会(触发错误):

#lang racket
(require 2htdp/universe 2htdp/image)

(define new-name on-tick)

(big-bang 0
            (new-name (lambda (x) (+ x 1)))
            (to-draw (lambda (x) (place-image ladja 150 x (prazni-prostor 300 300))))
            (stop-when (lambda (x) (= x 300))))

我看到 big-bang is a macro,所以这就解释了这个问题:我想我必须能够以某种方式强制首先评估我的宏?

如果您正在编写程序中需要的模块,那么您可以使用 provide with rename-out 提供别名:

在新的大爆炸中-name.rkt:

#lang racket
(require 2htdp/universe 2htdp/image)

(provide big-bang
         to-draw
         stop-when
         empty-scene
         (rename-out [on-tick new-name]))

在另一个文件中使用它:

#lang racket

(require "big-bang-with-new-name.rkt")

(big-bang 0
          [new-name (lambda (x) (+ x 1))]
          [to-draw (lambda (x) (empty-scene 200 200))]
          [stop-when (lambda (x) (= x 300))])

许多宏使用 free-identifier=? to recognize keywords like this. Rename transformers 配合 free-identifier=? 来创建精确的别名。这意味着您还可以在主文件中将 new-name 定义为重命名转换器,如下所示:

#lang racket
(require 2htdp/universe 2htdp/image)

(define-syntax new-name (make-rename-transformer #'on-tick))

(big-bang 0
          [new-name (lambda (x) (+ x 1))]
          [to-draw (lambda (x) (empty-scene 200 200))]
          [stop-when (lambda (x) (= x 300))])