Существует ли какая-либо встроенная функция для удобочитаемых цитат F #?

StackOverflow https://stackoverflow.com/questions/1448961

  •  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 запускает новую строку, отступ, инфикс, префикс, особые случаи, такие как оператор (::) и так далее.

В целом, выполнимо, но не тривиально.Что-то вроде декомпиляции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top