我正在使用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
发生的行等内容。我还可以添加我导出的代码方程式而不是它们的代价吗?
答案 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
实际执行之前的某个时间。即使在顺序模式下,当您生成大量代码或对代码方程进行大量预处理时,差距可能只有几分钟。