Ответ 1
В F # 2.0 (это Visual Studio 2010) невозможно расширить список ключевых слов (кроме расширения Ramon). Однако механизм запроса в F # 3.0 (Visual Sutdio 11) расширяем, и вы можете определить свои собственные ключевые слова, похожие на select
и count
.
Вот базовый пример, который определяет нечто вроде seq
builder с ключевым словом reverse
:
type SeqBuilder() =
// Standard definition for 'for' and 'yield' in sequences
member x.For (source : seq<'T>, body : 'T -> seq<'R>) =
seq { for v in source do yield! body v }
member x.Yield item =
seq { yield item }
// Define an operation 'select' that performs projection
[<CustomOperation("select")>]
member x.Select (source : seq<'T>, [<ProjectionParameter>] f: 'T -> 'R) : seq<'R> =
Seq.map f source
// Defines an operation 'reverse' that reverses the sequence
[<CustomOperation("reverse", MaintainsVariableSpace = true)>]
member x.Expand (source : seq<'T>) =
List.ofSeq source |> List.rev
let mseq = SeqBuilder()
Подробности о том, как это работает, еще не задокументированы, но атрибут CustomOperation
говорит, что операция следует рассматривать как специальный синтаксис (вы можете установить различные свойства, чтобы указать, как он себя ведет - MaintainsVariableSpace
означает, что он не изменить значения внутри последовательности). Атрибут Projectionparameter
указывает, что выражение, следующее за ключевым словом, должно быть неявно преобразовано в функцию.
Теперь конструктор mseq
поддерживает как select
, так и reverse
:
let q = mseq { for i in 1 .. 10 do
select (i + 100)
reverse }