Я реализовал декомпилятор цитат как часть более крупного проекта с открытым исходным кодом Unquote . Он может декомпилировать множество простых выражений, заключенных в кавычки F #, в виде однострочных строк несинтаксического синтаксиса (список функций декомпилятора см. На домашней странице проекта). Например,
> decompile <@ (11 + 3) / 2 = String.length ("hello world".Substring(4, 5)) @>;;
val it : string =
"(11 + 3) / 2 = String.length ("hello world".Substring(4, 5))"
@ Курт Шелфтоут прав в отношении многих проблем, с которыми сталкиваются при декомпиляции цитат F # в удобочитаемую форму. Но из моей работы я считаю, что позволяет написать декомпилятор цитат, который может генерировать правильный F # код. Возьмите выражения совпадения и выражения вычисления, например, декомпилятор Unquote может генерировать правильный код F # в следующих простых случаях:
> decompile <@ match true with | true -> "hi" | _ -> "bye" @>;;
val it : string =
"let matchValue = true in if matchValue then "hi" else "bye""
> decompile <@ seq {yield 1; yield 2} @>;;
val it : string =
"seq (Seq.delay (fun unitVar -> Seq.append (Seq.singleton 1) (Seq.delay (fun unitVar -> Seq.singleton 2))))"
Инфиксные и префиксные операторы не слишком сложны (как вы можете видеть в первом примере), но структура источника, такая как новые строки и отступы, является интересной темой (хотя, я думаю, не очень сложной). Однако однострочный несветлый синтаксис достаточен для требований Unquote.