在下面的代码中,我定义了我自己的a-hl,我的意思是用它替换代码中append的直接调用。它并没有真正替换它,因为它使用了附加在引擎盖下面(请参阅注释):
#!/usr/bin/env racket
#lang racket/base
(require racket/file)
(define (a-hl l e) (append l (list e)))
(define content (list "https://youtu.be/FVaVLpSHw38 Road to the Arnold" "https://www.youtube.com/watch?v=hlTfA42b_uI MIT Bitcoin Expo 2022: Breaking Through - Lightning Panel"))
(define arr (list))
(for ((l content))
;(set! arr (append arr (list (regexp-replace* #rx" .*" l "")))))
(set! arr (a-hl arr (regexp-replace* #rx" .*" l "")))); works just as well but it is shorter
(for ((e arr)) (display e))密码很好用。但是当我试图定义我自己的append,(define (append l e) (append l (list e)))和它的时候,
(for ((l content))
(set! arr (append arr (regexp-replace* #rx" .*" l ""))))
(for ((e arr)) (display e))球拍结冰了。用同名的自定义函数来代替球拍的功能是完全可行的吗?
发布于 2022-07-06 09:52:37
您可以使用Racket的require's only-in子句为模块中的绑定提供自己的名称,并使用:
#lang racket
(require (only-in racket/base [append builtin-append]))
(define (append l e) (builtin-append l (list e)))
(writeln (append '(1 2 3) 4)) ; (1 2 3 4)或者使用local-require只在函数中导入它:
(define (append l e)
(local-require (only-in racket/base [append builtin-append]))
(builtin-append l (list e)))发布于 2022-07-06 08:26:48
您可以定义您自己的函数版本,这样做只会影响您的模块中的代码,这些模块都是从模块中require定义的。
对于像append这样的定义,是否应该这样做是另一个问题:这样做是为粗心大意的人设置陷阱和陷阱的好方法。也许,只有当你真正理解这样做的后果,如果你在构建一种语义上与标准的语言非常不同的语言的过程中,这才是该做的事情。
在这种情况下,似乎被困在陷阱中的粗心大意的人就是你。您对append的定义是:
(define (append l e)
(append l (list e)))这一定义显然既不会终止,也会在不终止的过程中使用无界内存。
您的问题似乎是,您认为定义中调用的append版本是Racket的版本。事实并非如此:这不是define的工作方式,在这种情况下也不是。以类似的形式
(define (<name> ...)
... <name> ...)或等量
(define <name>
(lambda (...) ... <name> ...))然后(假设没有<name>的中间绑定),<name>引用您正在定义的内容。
https://stackoverflow.com/questions/72879812
复制相似问题