Ste*_*eve 2 delphi lambda fibonacci oxygene
我一直在试验Oxygene中的Lambda表达式.非常简单的递归lambda表达式来计算斐波那契数:
var fib : Func<int32, int32>;
fib := n -> iif(n > 1, fib(n - 1) + fib(n - 2), n);
fib(3);
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到一个nullreferenceexception.关于我做错了什么的任何想法?
你没有做错任何事.如果有的话,编译器应该警告你在lambda体内使用fib,一个未赋值的变量.
但是编译器应该将fib作为一个位置捕获,这样当赋值完成并稍后调用委托时,就会正确分配fib并且递归应该按预期工作.
失败的最明显的可能原因是Prism不是捕获位置,而是捕获值,这些非常不直观,并且与非纯语言中的每个其他闭包实现不一致.
例如,在JavaScript中尝试此代码(与本文评论中的Craig断言相反,JavaScript也捕获位置,而不是值):
<html>
<head>
<script language='javascript'>
function main()
{
var x = 1;
var f = function() { return x; };
alert(f());
x = 2;
alert(f());
}
</script>
</head>
<body>
<input type=button onclick="javascript:main()"></input>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
单击按钮后的警告框分别显示1和2,而按照Prism/Oxygene语义,它们将同时显示1.
归档时间: |
|
查看次数: |
1827 次 |
最近记录: |