别名宏的子句的名称

时间:2016-03-13 22:12:44

标签: scheme racket

我想为一些racket 2htdp个函数/宏添加别名,以便我可以为我的孩子翻译另一种语言。

作为函数的东西我可以简单地用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,因此解释了这个问题:我想我必须能够以某种方式强制我的宏进行评估?

1 个答案:

答案 0 :(得分:7)

如果您要在程序中编写需要的模块,则可以使用providerename-out来提供别名:

在big-bang-with-new-name.rkt:

#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=?

许多宏使用free-identifier=?来识别此类关键字。 Rename transformersnew-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))]) 定义为重命名变换器,如下所示:

{{1}}