如何在“ THEN”中打印“ IF”条件的源代码

阿图尔·斯坦尼克(Artur Stanek)

我想在THEN部分中打印IF条件的Scala源代码。

例子: IF{ 2 + 2 < 5 } THEN { println("I am in THEN because: " + sourceCodeOfCondition) }

现在让我们跳过THEN部分,问题是:如何在IF之后获取块的源代码?

我认为IF应该是一个宏...

注意:此问题是Macro的重新定义版本,用于在运行时访问功能源代码,在此我描述了{ val i = 5; List(1, 2, 3); true }.logValueImpl对我有用的功能(根据其他问题Macro可以在运行时访问源代码文本)。

特拉维斯·布朗

即席实施,因为我只有一分钟的时间:

import scala.reflect.macros.Context
import scala.language.experimental.macros

case class Conditional(conditionCode: String, value: Boolean) {
  def THEN(doIt: Unit) = macro Conditional.THEN_impl
}

object Conditional {
  def sourceCodeOfCondition: String = ???

  def IF(condition: Boolean) = macro IF_impl

  def IF_impl(c: Context)(condition: c.Expr[Boolean]): c.Expr[Conditional] = {
    import c.universe._

    c.Expr(q"Conditional(${ show(condition.tree) }, $condition)")
  }

  def THEN_impl(c: Context)(doIt: c.Expr[Unit]): c.Expr[Unit] = {
    import c.universe._

    val rewriter = new Transformer {
      override def transform(tree: Tree) = tree match {
        case Select(_, TermName("sourceCodeOfCondition")) =>
          c.typeCheck(q"${ c.prefix.tree }.conditionCode")
        case other => super.transform(other)
      }
    }

    c.Expr(q"if (${ c.prefix.tree }.value) ${ rewriter.transform(doIt.tree) }")
  }
}

接着:

object Demo {
  import Conditional._

  val x = 1

  def demo = IF { x + 5 < 10 } THEN { println(sourceCodeOfCondition) }
}

最后:

scala> Demo.demo
Demo.this.x.+(5).<(10)

这是原始资料的简略代表,但我想不到的是,这是您所能获得的最好的结果。

有关技术的一些讨论,请参见我的博客文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在“ THEN”中打印“ IF”条件的源代码

来自分类Dev

如何在windbg中打印当前源代码行?

来自分类Dev

如何在内核源代码中打印时间?

来自分类Dev

如何从源代码中设置pdb中断条件?

来自分类Dev

如何在源代码中查找功能

来自分类Dev

如何使用thymeleaf在页面的源代码中打印mensagens?

来自分类Dev

如何在浏览器中打印php文件(源代码)?

来自分类Dev

如何在代码块中获取预编译的源代码?

来自分类Dev

如何获取python打印功能的源代码?

来自分类Dev

如何打印HTML源代码TWIG视图的

来自分类Dev

如何在c / c ++ / java中在源代码中不带双引号和撇号的情况下打印文本

来自分类Dev

如何在 Xamarin Android 中的 TextView 中显示源代码?

来自分类Dev

如何在源代码的Sitecore 6中对TreeList进行排序

来自分类Dev

如何在IPython Notebook中显示包函数的源代码

来自分类Dev

如何在Mac上的vscode中“跳转到源代码”?

来自分类Dev

如何在源代码中查找搜索词

来自分类Dev

如何在Maven中组织源代码生成?

来自分类Dev

如何在Metasploit中读取漏洞利用的源代码?

来自分类Dev

如何在Java源代码中隐藏硬编码的密码

来自分类Dev

如何在剪贴板中编辑HTML源代码?

来自分类Dev

如何在Eclipse中执行Java源代码

来自分类Dev

如何在Windows中编译Golang源代码

来自分类Dev

如何在PostgreSQL中获取聚合的定义/源代码?

来自分类Dev

如何在Racket的标准库中查看方法的源代码?

来自分类Dev

如何在Automapper中从源代码做局部地图

来自分类Dev

如何在vscode中查找python方法的源代码

来自分类Dev

如何在yotco中修补Linux内核源代码

来自分类Dev

如何在剪贴板中编辑HTML源代码?

来自分类Dev

如何在Eclipse ADT中打开Android源代码

Related 相关文章

  1. 1

    如何在“ THEN”中打印“ IF”条件的源代码

  2. 2

    如何在windbg中打印当前源代码行?

  3. 3

    如何在内核源代码中打印时间?

  4. 4

    如何从源代码中设置pdb中断条件?

  5. 5

    如何在源代码中查找功能

  6. 6

    如何使用thymeleaf在页面的源代码中打印mensagens?

  7. 7

    如何在浏览器中打印php文件(源代码)?

  8. 8

    如何在代码块中获取预编译的源代码?

  9. 9

    如何获取python打印功能的源代码?

  10. 10

    如何打印HTML源代码TWIG视图的

  11. 11

    如何在c / c ++ / java中在源代码中不带双引号和撇号的情况下打印文本

  12. 12

    如何在 Xamarin Android 中的 TextView 中显示源代码?

  13. 13

    如何在源代码的Sitecore 6中对TreeList进行排序

  14. 14

    如何在IPython Notebook中显示包函数的源代码

  15. 15

    如何在Mac上的vscode中“跳转到源代码”?

  16. 16

    如何在源代码中查找搜索词

  17. 17

    如何在Maven中组织源代码生成?

  18. 18

    如何在Metasploit中读取漏洞利用的源代码?

  19. 19

    如何在Java源代码中隐藏硬编码的密码

  20. 20

    如何在剪贴板中编辑HTML源代码?

  21. 21

    如何在Eclipse中执行Java源代码

  22. 22

    如何在Windows中编译Golang源代码

  23. 23

    如何在PostgreSQL中获取聚合的定义/源代码?

  24. 24

    如何在Racket的标准库中查看方法的源代码?

  25. 25

    如何在Automapper中从源代码做局部地图

  26. 26

    如何在vscode中查找python方法的源代码

  27. 27

    如何在yotco中修补Linux内核源代码

  28. 28

    如何在剪贴板中编辑HTML源代码?

  29. 29

    如何在Eclipse ADT中打开Android源代码

热门标签

归档