Keith Hill explained me that blocks in PowerShell are not closures and that to create closures from blocks I have to call method .GetNewClosure().
Is there any elegant way to create closures from blocks? (e.g. create a wrapping function, an alias?, ...)
Example:
{ block }
${ closure } # ???
You could create a function that takes a scriptblock, calls GetNewClosure and returns the closure. It is essential that you call this function using the dot operator e.g.:
function =>([scriptblock]$_sb_)
{
$_sb_.GetNewClosure()
}
function A($block)
{
B (. => {Write-Host 2; &$block})
}
function B($block) {Write-Host 1;&$block}
A {Write-Host 3}
Not sure this is much better than just calling GetNewClosure() on the scriptblock though. Note you can pick some other name for the function. I was going for something more like C# lambdas.
These links might be of some help they talk about closures in PowerShell 2.0
- http://blogs.msdn.com/powershell/archive/2009/03/27/get-closure-with-getnewclosure.aspx
- http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx