引用时

<@ 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))))"

中缀和前缀运算符是不是太硬(你可以在第一个例子中看到的),但源结构,如新行和缩进是一个有趣的话题(尽管不是非常困难,我认为)。然而,单线非光语法是足够的引文结束的要求。

没有,而且也不是那么容易,除非是非常简单的情况。例如,主要问题之一是匹配结构。它是一大堆 if 和 switch 语句的语法糖(尝试打印带有匹配项的引用,您会看到)。其中另一个重要因素是计算表达式,但我想您可以一开始就跳过它们。

然后,您必须解决一个充满歧义的兔子洞,其中包括诸如管道运算符开始新行、let 开始新行、缩进、中缀、前缀、特殊情况(例如 (::) 运算符等)的约定向前。

总而言之,可行,但并非微不足道。有点像反编译。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top