问题标签 [callbyname]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1822 浏览

haskell - lambda演算的按值调用和按名称调用解释器之间的区别

在另一个问题中,Bob为无类型 lambda 演算提供了以下解释器。

Ivan Zakharyaschev 说这个解释器是按值调用的,因为F f -> f (interpret env e2). 名称调用解释器的实现与上面介绍的解释器有何不同?

Plotkin在 1970 年代研究了用于评估 lambda 演算的名称调用和值调用策略。

0 投票
1 回答
114 浏览

mocking - 模拟带有 `call-by-name` 参数的方法时,不会调用 `answers`

有一个类InvokeLater,定义如下:

在规格测试中,我嘲笑它:

但似乎里面的代码answers永远不会运行。

specs2 现在支持这个功能吗?

0 投票
3 回答
545 浏览

scala - 为什么按名称调用参数期望 Int 类型的参数而不是 () => Int

我对在 Scala 中使用按名称调用的参数有点困惑。请帮助我了解这里发生了什么。考虑以下使用按名称调用参数的示例:

关于这个,我有几个彼此相关的问题:

  1. lazyEval方法需要 type 的参数=> Int,那么为什么param + 2操作是合法的?为什么我们可以在调用方法时将整数 2 添加到具有类型的对象=> Int(我的理解是在底层) ?正如 IDE 提示我的那样,该函数需要类型参数而不是(到底是什么?)。<function0>lazyEvallazyEvalInt=> Int

  2. 为什么将回调类型从更改=> Int() => Int代码后无法编译?这两种类型不同吗?我虽然简短版本('=> Int')只是一个语法糖。

  3. 在玩了一些代码之后,我终于可以更改代码,以便它可以使用() => Int. 这种方式对我来说更直观。

.

=> Int这个版本和第一个版本(带有回调类型)有什么区别?为什么在这个版本中我们不能将整数与值2param函数相加(我的意思是 this lazyEval(param _ + 2))?方法名称后的下划线是什么意思?(我猜它曾经传递方法本身,而不是返回值)

感谢帮助

0 投票
1 回答
240 浏览

c++ - 按名称调用/按值调用

我试图在这里理解这段代码:

mymult = 11 和 mymult1 = 24。我知道 '#define 本质上是通过名称调用而不是值调用来工作的。但是,我无法理解为什么它返回的值是 11... 而不是 24。这是什么原因造成的?

0 投票
1 回答
417 浏览

scala - 在 Scala 宏中处理按名称参数

我有一个宏,可以对嵌套函数应用程序进行一些分析。它以这种方式匹配应用程序并检索参数类型:

现在,如果碰巧有按名称参数,我得到的是一些奇怪的类型,可以打印=> T但不能与任何东西匹配。反射 API 中似乎没有工具可以正确处理这些问题。我想做的是T在它的情况下进行检索=> T,因为=> T在生成的代码中会导致进一步的问题。

0 投票
2 回答
73 浏览

scala - 在scala中按值和按名称=>一一对应

如果按值调用时

val f: (Int) => Int = {(i) => {i * i}} # f: Int => Int = <function1>
是的简写
val f: Function1[Int, Int] = {(i) => {i * i}} # f: Int => Int = <function1>

那么当按名称 调用时
val f: (=> Int) => Int = {(i) => {i * i}} # f: (=> Int) => Int = <function1>
是 ? 的简写
?什么 ?

而如果

按值调用时

val f = {(i) => {i * i}}:(Int) => Int # f: Int => Int = <function1>
是的简写
val f = {(i) => {i * i}}:Function1[Int, Int] # f: Int => Int = <function1>

那么当按名称 调用时
val f = {(i) => {i * i}}:(=>Int) => Int # f: (=> Int) => Int = <function1>
是 ? 的简写
?什么 ?

换句话说

if (Int) => IntFunction1[Int, Int]的简写

那么(=> Int) => Int? 什么 ?

谢谢 !

0 投票
1 回答
541 浏览

scala - Scala:将按名称调用的变量存储为类字段

在我学习 Scala 的过程中,我尝试用回调实现一个简单的 DSL

我创建了一个新对象,将它传递给存储的回调。我的演示框架触发onClick方法,应该调用存储的方法

它适用,() => Unit但我的 DSL 看起来很丑:

当然,我可以onClick稍后做抽象并实现一个匿名类

但我想玩一些 DSL 之类的

问题是:

  • f我该如何存放_click_cb
  • 如何提供初始“空”功能_click_cb
  • 也许有更多的scala方式来实现这一点?(没有匿名类)
0 投票
1 回答
537 浏览

scala - Scala:惰性值、按名称调用、闭包和内存泄漏

我有一个 scala 过程,在该过程中使用更大的索引创建一个大型数据结构。因为我想一次性完成,而不是在复杂的优先级解析中陷入困境,所以我在结果中使用惰性 vals,使用表达式初始化,在创建时可能不会计算为正确的值(或任何值)组件,但是一旦整个构建过程完成就会这样做。这意味着最终结果的每个组件都有一个对包含我的整个索引的闭包的合成引用,并且可能,只要它们中的任何一个仍在内存中,我的索引就不能被垃圾收集。显然,我不想要它 - 理想情况下,我希望能够在结构上进行第二次传递以在需要时初始化值(并确保此时捕获任何错误),并让索引被垃圾收集。目前我通过几个函数按名称传递初始化表达式,并在惰性 val 声明中使用它,相当于:

这是声音吗?一旦访问lazy val,合成初始化字段是否会被取消引用?如果我想在初始化函数中使用它怎么办,如下所示:

在使用闭包进行编程时,一般有什么规则需要牢记吗?

0 投票
3 回答
303 浏览

scala - 动态变化的函数

我正在学习 scala,我遇到了以下代码。

输出是数字 10 到 1。

所以 cond 和 body 都是“按名称调用”参数。这意味着它们在函数中使用时会被评估。如果我理解正确的话。我不明白的是身体如何

应用的每个递归级别的变化,主体随着变量 i 的变化而变化。但这究竟是如何工作的呢?每次传递相同的函数体时,对我来说这个函数保持不变,但运行程序会向我显示其他情况。我知道每次都会评估该函数,但我不明白里面的 i 变量每次是如何变化的,所以有人可以解释一下它是如何工作的吗?

0 投票
1 回答
586 浏览

scala - Scala 对按名称调用参数的隐式转换的工作方式不同,具体取决于函数是否重载

让我们看看下面的代码:

此代码不打印任何内容,因为该块包含println("Hello")视为=> Int并且它被转换为Fooby int2Foo。但是如果我们省略重载函数,就会发生令人惊讶的事情bar(foo: Boolean)

这会打印出来Hello,因为它会评估块,并且64在这种情况下,只有最后一条语句被视为按名称调用的参数。我无法理解这种差异背后存在什么样的理由。