英文:
How can I redefine '+' inside of a closure?
问题
首先,我知道这是愚蠢的,实际情况下永远不应该这样做。我也知道,即使在实践中这样做,你应该使用面向对象编程。我只是在这里为了证明一个观点。
我想重新定义 +
。我想让下面这段代码工作:
'+' <- function(x, y) x + y + 2
允许像下面这样的代码:
2 + 2
返回 6
。
目前,它不起作用,因为它会导致无限递归。为了解决这个问题,我想使用闭包,但我不知道该怎么做。显然,我想要类似这样的东西:
SillyPlusGenerator <- function() {'+' <- function(x, y) x + y + 2}
但这不会让我在重新定义 +
的环境中计算 2 + 2
,也不会告诉 SillyPlusGenerator
在父环境中查找 +
。我知道我可以尝试使用 eval
并直接使用环境,但我确信闭包就是我所需要的。我错过了哪一步?
英文:
First of all, I know that this is stupid and never should be done in practice. I also know that even when doing it in practice, you ought to do it with OOP. I'm just doing it to prove a point.
I want to redefine '+'
. I want
'+' <- function(x, y) x + y + 2
to work. Allowing for code like
2 + 2
to return 6
.
Currently, it doesn't work because it causes an infinite recursion. To solve this, I want to use a closure, but I'm at a loss as to how. I obviously want something like:
SillyPlusGenerator <- function() {'+' <- function(x, y) x + y + 2}
but that doesn't give me a way to evaluate 2 + 2
in an environment where +
is redefined and it doesn't tell SillyPlusGenerator
to look up +
in the parent environment. I know that I could play around with eval
and use environments directly, but I feel sure that closures are all that I need.
What step have I missed?
答案1
得分: 1
以下是翻译好的部分:
"The answer shows a couple of quick ways To solve this, but does not attempt to use closures.
To avoid the infinite recursion, you can:
- Call the normal base R
+
function explicitly within the custom function (noting that+
can be called as you would with a standard function e.g.+(2,2)
).
`+` <- function(x, y) (base::`+`)((base::`+`)(x, y), 2)
# and a variation of:
`+` <- function(x, y) Reduce(base::`+`, c(x, y, 2))
- Redefine the
+
function within the custom function
`+` <- function(x, y) { `+` = base::`+` ; x + y + 2}
"
英文:
The answer shows a couple of quick ways "To solve this", but does not attempt to use closures.
To avoid the infinite recursion, you can:
- Call the normal base R <code>`+`</code> function explicitly within the custom function (noting that <code>`+`</code> can be called as you would with a standard function e.g. <code>`+`(2,2)</code>).
`+` <- function(x, y) (base::`+`)((base::`+`)(x, y), 2)
# and a variation of:
`+` <- function(x, y) Reduce(base::`+`, c(x, y, 2))
- Redefine the <code>`+`</code> function within the custom function
`+` <- function(x, y) { `+` = base::`+` ; x + y + 2}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论