Release notes for F# 1.1.12.5
The F# 1.1.12.5 release has been posted. This is mostly a minor bug-fixing release, with the exception of the first point below. Here are the full release notes.
High Precedence Application. A long-standing problem with the F# syntax is that method applications followed by property/field lookups such as obj.Method1(args).Method2(args).Property1.field2 have had to be written with very non-intuitive parentheses, e.g. ((obj.Method1(args)).Method2(args)).Property1.field2.
To fix this, this release incorporates a minor change in the F# syntax (with and without the #light syntax option). In particular, applications id(args) now have higher precedence (i.e. bind more tightly) than the dot-notation. This only applies when no spaces or other whitespace separate the identifier and the arguments.
–no-tailcalls now binary-format neutral. In prior versions the –no-tailcalls option was a global setting, hence requiring the use of special libraries that had tailcalls removed. Systems such as Mono now correctly support the .tail IL annotation and so a global version of this option is no longer required. The option is still supported, but will only affect the code being generated in the assembly currently being compiled and will not result in the selection of different runtime libraries.
Some revisions to the Microsoft.FSharp.Reflection API. Some functions have been renamed or moved to an inner module. Old versions of the functions have been marked Deprecated with an error message indicating the new version to use.
Most samples rewritten using #light.
Revert change to operator overloading made in 1.1.12.2 release.
The change to operator overloading in 1.1.12.2 was incorrect, as it disallows the use of legitimate .NET overloads. The upshot is that the basic operators now have the following signatures. These indicate that the two argument types and the return type may indeed all be different, and knowledge of the return type and the second argument type are not sufficient to resolve the overloading - a type annotation may be required to give the precise type of the first argument.
val inline (+) : ^a -> ^b -> ^c when ^a : (static member (+) : ^a * ^b -> ^c) val inline (-) : ^a -> ^b -> ^c when ^a : (static member (-) : ^a * ^b -> ^c) val inline ( * ): ^a -> ^b -> ^c when ^a : (static member ( * ) : ^a * ^b -> ^c) val inline (/) : ^a -> ^b -> ^c when ^a : (static member (/) : ^a * ^b -> ^c) val inline (%) : ^a -> ^b -> ^c when ^a : (static member (%) : ^a * ^b -> ^c) val inline (mod): ^a -> ^b -> ^c when ^a : (static member (%) : ^a * ^b -> ^c)
We are considering a design revision which would allow more restricted specifications of permitted overloads, but are currently erring on the side of generality, even at the cost of occasional additional type annotations.
Bug fixes.
700 F# Language undentation should be allowed when () and {} immediately follow an "=" 702 F# Compiler unbound type variable problems for inner constrained polymorphic definitions fix bug with #load in F# Interactive (module paths reference incorrect version after reload) Samples101 failed to compile fix minor bug with #light not at start-of-file