如何将ML值作为参数传递给外部语法命令?

时间:2014-09-15 06:13:00

标签: isabelle

我定义了一个外部语法命令imake来将一些代码写入文件并执行其他操作。预期用途如下:

theory Scratch
imports Complex_Main "~/Is0/IsS"
begin
  imake ‹myfile›
end

上面的示例会将一些内容写入文件myfilemyfile应该是相对于Scratch理论位置的路径。

ML ‹val this_path = File.platform_path(Resources.master_directory @{theory})

我希望能够在指定this_path时使用值myfileimake命令在导入~/Is0/IsS中定义,目前看起来如下:

ML‹(*imake*)
val _ = Outer_Syntax.improper_command @{command_spec "imake"} ""
  (Parse.text >> 
    (fn path => Toplevel.keep 
      (fn _ => Gc.imake path)))›

该参数是使用Parse.text设置的,但我需要根据ML值this_path提供路径,后者在Scratch理论中定义)。我搜索了很多,试图找出如何使用像Parse.const这样的东西,但我很快就找不到任何东西了。

所以:我在Resources.master_directory @{theory}中以某种方式使用Scratch.thy非常重要,以便imake获取文件夹Scratch,这将来自在@{theory}中使用Scratch

如果我想到最后一点,那是因为在过去,我浪费了很多时间来获取错误的文件夹,因为我不明白如何正确使用上面的命令。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您的最小示例使用带有参数Resource.master_directory的{​​{1}}来定义您的路径。 @{theory}(静态地)指的是你写下反引号时的理论。当你探索东西时,这主要是为了交互式使用。对于在其他地方使用的代码,您必须使用动态传递的上下文并从中提取理论。

您使用的函数@{theory}将函数Toplevel.keep作为参数。 Toplevel.state包含一个上下文(见Isabelle Implementation Manual的第1章),它再次包含当前的理论;使用Toplevel.state -> unit,您可以从州中提取理论。例如,您可以使用

Toplevel.theory_of

定义一个命令,打印当前理论的master_directory。

除了简单的情况,你很可能不仅需要理论,而且需要整个语境(你可以用Toplevel.keep (fn state => writeln (File.platform_path (Resources.master_directory (Toplevel.theory_of state)))) 获得)。

使用前面(部分)理论

中的设置

在上一节中,我假设您总是希望使用主目录。对于路径应该是可配置的情况,Isabelle知道配置选项的概念

在您的情况下,您需要在声明Toplevel.context_of命令之前定义配置选项

imake

然后,imake命令可以引用此属性来通过ML ‹ val imake_path = Attrib.setup_config_string @{binding imake_path} (K path) › (* declares an option imake_path with the value `path` as default value *) 检索路径:

Config.get

然后可以在Isar中设置Toplevel.keep (fn state => let val path = Config.get (Toplevel.context_of state) imake_path in ... end) 的值(仅作为字符串):

imake_path

或在ML中,通过declare [[imake_path="/tmp"]] (用于更新证明上下文)或Config.map(用于更新理论)。请注意,您需要将更新的上下文反馈给系统。 Isar具有命令Config.map_global(采用类型setup的ML表达式):

theory -> theory

配置选项在Isar Implementation Manual,第1.1.5节中详细介绍。

注意:此机制 not 允许您自动将setup ‹Config.map_global imake_path (K "/tmp")› 设置为每个新理论的主目录。您需要手动设置,例如通过添加

imake_path

在每个理论的开头。

配置选项背后的更一般机制是上下文数据。有关详细信息,请参阅第1.1节,特别是Isabelle Implementation Manual的1.1.4节。这种机制在伊莎贝尔的许多地方使用;简化器的配置setup ‹ Config.map imake_path (K (File.platform_path (Resources.master_directory @{theory}))) › 就是一个例子。