R 是否使用应用降阶?
Does R use applicative order reduction?
我最近从一个 R 教程中看到了这个例子,我发现这个语法真的很奇怪,因为它暗示了参数被包装/延迟的正常顺序减少。在应用顺序减少中,像这样的事情应该导致所有字符串打印。
switch(grade,
"A" = print("Great"),
"B" = print("Good"),
"C" = print("Ok"),
"D" = print("Bad"),
"F" = print("Terrible"),
print("No Such Grade"))
想知道是否有人知道并熟悉 R 是如何实现它的?
函数的参数,包括 switch
,作为承诺传递,只有在实际使用时才被强制执行,即求值。参见 https://cran.r-project.org/doc/manuals/R-ints.html#Argument-evaluation
一个承诺有几个部分。它的值槽在第一次被强制(即访问)时被填充。在那之前,它只是作为未评估的代码及其环境以及表明它尚未评估的组件存在。
f
不强制x
:
library(pryr)
f <- function(x) promise_info(x)
f(3+pi)
给予:
$code
3 + pi
$env
<environment: R_GlobalEnv>
$evaled
[1] FALSE
$value
NULL
g
强制 x:
g <- function(x) { force(x); promise_info(x) }
g(3 + pi)
给予:
$code
3 + pi
$env
NULL
$evaled
[1] TRUE
$value
[1] 6.141593
我最近从一个 R 教程中看到了这个例子,我发现这个语法真的很奇怪,因为它暗示了参数被包装/延迟的正常顺序减少。在应用顺序减少中,像这样的事情应该导致所有字符串打印。
switch(grade,
"A" = print("Great"),
"B" = print("Good"),
"C" = print("Ok"),
"D" = print("Bad"),
"F" = print("Terrible"),
print("No Such Grade"))
想知道是否有人知道并熟悉 R 是如何实现它的?
函数的参数,包括 switch
,作为承诺传递,只有在实际使用时才被强制执行,即求值。参见 https://cran.r-project.org/doc/manuals/R-ints.html#Argument-evaluation
一个承诺有几个部分。它的值槽在第一次被强制(即访问)时被填充。在那之前,它只是作为未评估的代码及其环境以及表明它尚未评估的组件存在。
f
不强制x
:
library(pryr)
f <- function(x) promise_info(x)
f(3+pi)
给予:
$code
3 + pi
$env
<environment: R_GlobalEnv>
$evaled
[1] FALSE
$value
NULL
g
强制 x:
g <- function(x) { force(x); promise_info(x) }
g(3 + pi)
给予:
$code
3 + pi
$env
NULL
$evaled
[1] TRUE
$value
[1] 6.141593