Releases: SeeminglyScience/PSLambda
v0.2.0
Extension methods (Linq)
Extension methods can now be resolved based on using namespace statements of the main script.
By default the System.Linq namespace is included to allow easy access to the Enumerable methods like Where, Select, OfType, etc.
Along with this change brings significantly improved generic type argument resolution and
ScriptBlock to Delegate conversion within the delegate.
$delegate = New-PSDelegate {
$ExecutionContext.InvokeProvider.ChildItem.Get('function:', $true).
Select{ $pso => $pso.BaseObject }.
OfType([g[System.Management.Automation.FunctionInfo]]).
FirstOrDefault{ $f => $f.Name.Equals('TabExpansion2') }
}
$delegate.Invoke()
# CommandType Name Version Source
# ----------- ---- ------- ------
# Function TabExpansion2Anonymous method syntax relaxed
Originally to use the alternate parameter declaration syntax you needed:
- Parenthesis around each parameter
- A
ScriptBlockaround the body - All parameters to be explicitly typed (when used as a method argument)
Now none of that is required, but is still supported. See above for example.
Improved generic argument declaration
You can now specify generic arguments inline in the method. This works a lot better for
the method chaining that is common with Linq methods.
If the first argument in a method is a type literal expression of the type g, then
any generic arguments on that type will be used as generic arguments for the method. The
compiled result will be a call to the constructed generic method with all other parameters
in tact.
$delegate = New-PSDelegate { [array]::Empty([g[Type]]) }
$delegate.Invoke().GetType()
# IsPublic IsSerial Name BaseType
# -------- -------- ---- --------
# True True Type[] System.Array
$delegate = New-PSDelegate {
[System.Management.Automation.LanguagePrimitives]::ConvertTo(
[g[int]],
'10')
}
$delegate.Invoke().GetType()
# IsPublic IsSerial Name BaseType
# -------- -------- ---- --------
# True True Int32 System.ValueTypeLock keyword
Added the lock keyword from C# for synchronizing access to an object between threads. Like
the C# compiler, lock statements are replaced in the compiler with calls to Monitor.Enter
in a try and Monitor.Exit in the finally.
Fixes
-
Index expressions on objects that did not implement
IListorIDictionarywill now
work properly. Originally the implementation looked for specific interfaces to determine
the indexer, now it uses theDefaultMemberAttribute. -
The iterator variable in a
foreachstatement is now typed properly if possible.
v0.1.1
Fix exceptions that occurred with:
- Empty
Hashtableinitialization expressions switchstatements with just adefaultblock- Index operations on expressions typed explicitly as
IEnumerable<> - The
-asand-notoperators - The
-borand-bandoperators when used against anEnum
v0.1.0
Initial release.