别名 宏子句的名称
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))])
我想为一些 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))])