我想我已经失败了,但我想确认一下。
对于动态范围,无论是使用嵌套函数还是单独函数都无关紧要,因为变量只取决于调用堆栈。
只涉及纯函数,无论是使用嵌套函数还是单独函数都无关紧要。无论范围类型如何,都是如此。
对于词法范围,嵌套函数大致模仿调用具有动态范围的函数。
对于词法范围,完全由纯函数编写的程序(可能允许对标准输出进行单个不纯的打印)不需要垃圾收集。如果它有所不同,我特别想到GNU C,这个问题的嵌套函数扩展。
注意:通过纯函数,我的意思是完全纯粹的函数:唯一的“读取”是参数,唯一“写”是函数返回。
由于
答案 0 :(得分: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; });
答案 1 :(得分:1)
如果你有一种特定的语言会有所帮助,即使你用C和Lisp标记了这一点,如果没有一些具体的例子,这并没有太大的帮助,因为两者是截然不同的。我根本不认为C是动态范围的,并且有许多Lisps支持动态和词汇范围的许多组合和变体。
这是正确的,但有些语言通过支持动态和词法范围使这一点变得复杂,允许程序员指定使用哪个(例如Clojure和Common Lisp)。
这也是正确的。在这种情况下,您所说的是一个没有副作用且没有任何自由变量的函数。
这并不完全正确,它比这更复杂。在具有支持一流函数和闭包的词法范围的语言中,嵌套函数将关闭在其定义的环境中绑定的自由变量,并且您可以返回该函数到外部范围,那些封闭的变量将是可访问的并且参考它们被定义的原始范围。再次,如果没有特定编程语言的具体示例,这很难在抽象中讨论,所以如果你有一些东西请注意,您应该使用代码示例编辑您的问题。
我不确定你的意思"垃圾清理"?如果您像在自动内存管理中那样引用垃圾收集,这通常是不正确的,但我不会对具有嵌套函数的GNU C的特定情况发表评论,因为我不知道究竟是如何运作的。