我一直在试验Oxygene中的Lambda表达式.非常简单的递归lambda表达式来计算斐波那契数:
var fib : Func; fib := n -> iif(n > 1, fib(n - 1) + fib(n - 2), n); fib(3);
当我运行此代码时,我得到一个nullreferenceexception.关于我做错了什么的任何想法?
你没有做错任何事.如果有的话,编译器应该警告你在lambda体内使用fib,一个未赋值的变量.
但是编译器应该将fib作为一个位置捕获,这样当赋值完成并稍后调用委托时,就会正确分配fib并且递归应该按预期工作.
失败的最明显的可能原因是Prism不是捕获位置,而是捕获值,这些非常不直观,并且与非纯语言中的每个其他闭包实现不一致.
例如,在JavaScript中尝试此代码(与本文评论中的Craig断言相反,JavaScript也捕获位置,而不是值):
单击按钮后的警告框分别显示1和2,而按照Prism/Oxygene语义,它们将同时显示1.