我定义了一个外部语法命令imake
来将一些代码写入文件并执行其他操作。预期用途如下:
theory Scratch
imports Complex_Main "~/Is0/IsS"
begin
imake ‹myfile›
end
上面的示例会将一些内容写入文件myfile
。 myfile
应该是相对于Scratch
理论位置的路径。
ML ‹val this_path = File.platform_path(Resources.master_directory @{theory})
我希望能够在指定this_path
时使用值myfile
。 imake
命令在导入~/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
。
如果我想到最后一点,那是因为在过去,我浪费了很多时间来获取错误的文件夹,因为我不明白如何正确使用上面的命令。
我怎样才能做到这一点?
答案 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})))
›
就是一个例子。