如何指定生成代码的标头和包?

时间:2013-03-27 19:31:22

标签: scala code-generation isabelle

我正在使用Isabelle生成Scala代码。如何为Scala文件指定标头?例如,我想要这样的东西:

// Generated code. Generated with Isabelle/HOL
// File: blubb.thy line:1234
// Date: Wed, 27.03.2013
// exported code equations: bla blub blob ...

如何指定要使用的包?例如,要使用包GENERATED,文件应以package GENERATED开头。


我到目前为止最好的想法是code_include命令,其中第二个参数为空("")。 如果我选择更长的第二个参数,Efficient_Nat理论首先会发出其代码。但我必须写到文件的开头。

code_include Scala ""
{*package GENERATED

// Code generated by Isabelle
*}

这个解决方案有多邪恶?如果不是那么邪恶,我怎样才能添加当前日期,当前文件以及export_code发生的行等内容。我还可以添加我导出的代码方程式而不是它们的代价吗?

1 个答案:

答案 0 :(得分:3)

code_include对你想要的东西是正确的。第二个参数标识包含并确定代码生成器输出不同code_include s的顺序。当您选择空标识符""时,您的文本将始终排在第一位,但您不能拥有多个具有相同标识符的code_include(后者会覆盖前者)。

您在code_include{*内向*}提供的文字未被解释,因此您无法在那里拥有动态部分。但是,如果使用代码生成器的ML接口,则可以在调用export_code之前生成字符串。这可能如下所示:

ML {*
val scala_header =
  let
    val package = "package GENERATED";   
    val date = Date.toString (Date.fromTimeLocal (Time.now ()))
    val header = package ^ "\n\n" ^ "// Generated by Isabelle on " ^ date ^ "\n"
  in
    Code_Target.add_include "Scala" ("", SOME (header, []))
  end
*}

现在,您只需在scala_header之前致电export_code

setup {* scala_header *}
export_code ... in Scala file ...

这大致给出了正确的生成日期。详细地说,时间将是setup {* scala_header *}执行时的时间,这可能是(由于多线程)export_code实际执行之前的某个时间。即使在顺序模式下,当您生成大量代码或对代码方程进行大量预处理时,差距可能只有几分钟。