gpt4 book ai didi

scheme - 别名 宏子句的名称

转载 作者:行者123 更新时间:2023-12-02 06:45:26 28 4
gpt4 key购买 nike

我想给一些 racket 2htdp 函数/宏起别名,这样我就可以为我的 child 将它们翻译成另一种语言。

我可以简单地用define给函数起别名。我在使用 big-bang 结构时遇到了麻烦;例如,如果我尝试使用 on-tick 别名,则每次收到 big-bang: [new-name] Clauses are not allowed inside big-bang.

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

这样的东西是有效的(好吧,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))))

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

最佳答案

如果您正在编写程序所需的模块,那么您可以使用 providerename-out提供别名:

在 big-bang-with-new-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=?来识别这样的关键词。 Rename transformersfree-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))])

关于scheme - 别名 宏子句的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35976538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com