我想为一些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,因此解释了这个问题:我想我必须能够以某种方式强制我的宏进行评估?
答案 0 :(得分:7)
如果您要在程序中编写需要的模块,则可以使用provide
和rename-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 transformers与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))])
定义为重命名变换器,如下所示:
{{1}}