5

我想我有这个问题,但我想确认一下。

  1. 使用动态范围,使用嵌套函数还是单独的函数都没有关系,因为变量只依赖于调用堆栈。

  2. 仅涉及纯函数,使用嵌套函数或单独函数也无关紧要。无论作用域的类型如何,这都是正确的。

  3. 对于词法范围,嵌套函数大致模仿调用具有动态范围的函数。

  4. 在词法范围内,完全由纯函数编写的程序(可能允许对标准输出进行一次不纯打印)不需要垃圾收集。如果它有所作为,我会特别考虑带有嵌套函数扩展的 GNU C 来解决这个问题。

注意:纯函数是指完全纯函数:唯一“读取”的是参数,唯一“写入”的是函数返回。

谢谢

4

2 回答 2

2

你说得对。不过,我不会尝试将其作为逐个案例的助记符放在我的脑海中——尝试理解其中的原因,你会遇到更少的惊喜。

有关该主题的文档(位于http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html)非常好。如果你知道堆栈在 C 中是如何工作的,你应该马上就明白了。

此外,鉴于您的问题,我在互联网上找到的一份礼物可能有用:

#define lambda(type, body) ({ \
    type __anon_func__ body \
    __anon_func__; \
})

int (*foo) (double) = lambda(int, (double x) { return (int) x; });
于 2012-05-23T16:30:26.023 回答
1

如果您有一种特定的语言,即使您用 C 和 Lisp 标记了它,这也会有所帮助,如果没有一些具体的例子,这将无济于事,因为两者是完全不同的。我不认为 C 是动态作用域的,并且有许多 Lisp 支持动态和词法作用域的许多组合和变体。

  1. 这是正确的,但是某些语言通过支持动态和词法范围使这一点复杂化,允许程序员指定使用哪个(例如 Clojure 和 Common Lisp)。

  2. 这也是正确的。在这种情况下,您所说的是一个没有副作用且没有任何自由变量的函数。

  3. 这并不完全正确,它比这更复杂。在具有支持一流函数和闭包的词法范围的语言中,嵌套函数将关闭绑定在它定义的环境中的自由变量,并且您可以将该函数返回到外部范围,以及那些关闭的变量将可访问并引用它们定义的原始范围。同样,如果没有来自特定编程语言的具体示例,这很难在抽象中谈论,所以如果你有什么想法,你应该用代码示例编辑你的问题。

  4. 我不确定您所说的“垃圾清理”是什么意思?如果您指的是自动内存管理中的垃圾收集,这通常是不正确的,但我不会评论带有嵌套函数的 GNU C 的具体情况,因为我不知道它是如何工作的。

于 2012-05-23T16:28:36.400 回答