Существует ли какая-либо встроенная функция для удобочитаемых цитат F #?
-
11-09-2019 - |
Вопрос
При цитировании
<@ 1 + 1 @>
Я хочу "1 + 1"
вместо того , чтобы
"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32),
[Value (1), Value (1)])"
Нет правильного решения
Другие советы
Тебе придется написать это самому.Смотрите на Визуализатор котировок F# код как руководство по преобразованию абстрактного синтаксического дерева цитат.
Я внедрил декомпилятор цитат как часть более крупного проекта с открытым исходным кодом Снять кавычки.Он может декомпилировать множество простых выражений в 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))"
@Kurt Schelfthout прав насчет многих проблем, с которыми приходится сталкиваться при декомпиляции цитат из F # в удобочитаемую форму.Но судя по моей работе на данный момент, я считаю, что это является можно написать декомпилятор цитат, который может генерировать правильный Код F #.Возьмем выражения сопоставления и вычислительные выражения, например, декомпилятор без кавычек может создайте правильный код 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 достаточно однострочного непрозрачного синтаксиса.
Такого нет, и это не так-то просто, за исключением очень простых случаев.Одной из основных проблем, например, является конструкция соответствия.Это синтаксический сахар для целой кучи операторов if и switch (попробуйте напечатать цитату с совпадением внутри, вы увидите).Еще одной из таких важных функций являются вычислительные выражения, но я думаю, вы могли бы сначала пропустить их.
Затем возникает кроличья нора двусмысленностей, которую вам придется разрешить, с такими соглашениями, как оператор pipe запускает новую строку, let запускает новую строку, отступ, инфикс, префикс, особые случаи, такие как оператор (::) и так далее.
В целом, выполнимо, но не тривиально.Что-то вроде декомпиляции.