Есть ли встроенная функция для читаемых человеком цитат F #? - PullRequest
5 голосов
/ 19 сентября 2009

При цитировании

<@ 1 + 1 @>

Я хочу "1 + 1"

вместо

"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (1)])"

Ответы [ 3 ]

6 голосов
/ 19 сентября 2009

Вам придется написать это самостоятельно. См. Код визуализатора цитат F # в качестве руководства по преобразованию дерева абстрактного синтаксиса цитат.

5 голосов
/ 09 февраля 2011

Я реализовал декомпилятор цитат как часть более крупного проекта с открытым исходным кодом 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.

0 голосов
/ 21 сентября 2009

Нет, и это не так просто, за исключением очень простых случаев. Например, одной из основных проблем является конструкция соответствия. Это синтаксический сахар для целого ряда операторов if и switch (попробуйте напечатать цитату с соответствием, как вы увидите). Другим из этих важных моментов являются вычислительные выражения, но я думаю, вы могли бы сначала их пропустить.

Затем возникает кроличья нора неопределенностей, которую вам нужно устранить, с такими соглашениями, как оператор канала запускает новую строку, пусть начинает новую строку, отступ, инфикс, префикс, особые случаи, такие как (: :) оператор и пр.

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

...