(define define 2) > define 2 在那个范围内,我不能再使用 defin-6ren">
gpt4 book ai didi

scheme - 在方案/ Racket 中重新定义 "define"是否有有效的用例?

转载 作者:行者123 更新时间:2023-12-04 22:12:33 25 4
gpt4 key购买 nike

我正在玩 Racket /方案,它允许我重新定义例如 define并将其绑定(bind)为一个值。

> (define define 2)
> define
2

在那个范围内,我不能再使用 define 定义任何东西了。因为它显然绑定(bind)到 2。这适用于我尝试过的所有“关键字”( ifcond 等)。

但是不能使用 define指定我自己的定义函数:
> (define mydef define)
stdin::14: define: not allowed in an expression context in: define

=== context ===
/usr/share/racket/collects/racket/private/norm-define.rkt:8:4: normalize-definition
/usr/share/racket/collects/racket/private/kw.rkt:796:2
/usr/share/racket/collects/racket/private/misc.rkt:87:7

我想还有另一种方法可以扩展 Racket 中的语言以添加我自己的定义功能,但为什么不允许这种方式?

这确实让我想知道是否有任何有效的用例来重新定义 define ?我意识到这有点基于意见,但我正在寻找可能是合理的用例(无论是否是另一回事)。

最佳答案

是的,您实际上可能想要扩展 define提供标准 define 的功能。没有。一个例子是提供装饰器(感谢 uselpa 的灵感回答):

(require (only-in racket/base (define basic-define)))

(define-syntax wrap-decorators
(syntax-rules ()
((_ () value)
value)
((_ (decorator next ...) value)
(decorator (wrap-decorators (next ...) value)))))

(define-syntax define
(syntax-rules (@)
((_ (@ decorator ...) (id . params) body ...)
(define (@ decorator ...) id (lambda params body ...)))
((_ (@ decorator ...) id value)
(define id (wrap-decorators (decorator ...) value)))
((_ other ...)
(basic-define other ...))))

(define (trace label)
(lambda (f)
(lambda args
(dynamic-wind (thunk (eprintf "enter ~a: ~s~%" label args))
(thunk (apply f args))
(thunk (eprintf "exit ~a: ~s~%" label args))))))

现在你可以这样使用它:
(define (@ (trace 'hypot)) (hypot x y)
(sqrt (+ (sqr x) (sqr y))))

这会导致 hypottrace 包裹的函数因此,当您调用它时,会发生跟踪:
> (hypot 3 4)
enter hypot: (3 4)
exit hypot: (3 4)
5

或者,使用 uselpa 的 memoize功能,您可以使用:
(define (@ memoize) (fib n)
(if (< n 2)
n
(+ (fib (sub1 n)) (fib (- n 2)))))

并快速记录 fib功能。您甚至可以跟踪和内存它,只显示实际的(缓存未命中)调用:
(define (@ (trace 'fib) memoize) (fib n)
(if (< n 2)
n
(+ (fib (sub1 n)) (fib (- n 2)))))

请注意,在我的宏中,我导入了 Racket 的 definebasic-define ,以便我重新定义 define可以委托(delegate)给它。

关于scheme - 在方案/ Racket 中重新定义 "define"是否有有效的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23170706/

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