gpt4 book ai didi

haskell - 如何在 Shake 中编写定点构建规则,例如 latex

转载 作者:行者123 更新时间:2023-12-03 14:56:36 25 4
gpt4 key购买 nike

使用 Shake Haskell 构建库,如何使用需要达到固定点的程序编写规则?想象一下我有一个程序foo需要一个文件input并产生一个输出文件,它应该有 foo重复应用,直到输出文件不改变。我怎样才能在 Shake 中写出来?

这种模式的典型例子是 LaTeX。

最佳答案

首先,请注意重复调用 Latex 并不总是产生一个固定点,因此请确保您对迭代有限制。此外,一些发行版 (MikTex) 提供了可以根据需要自动运行多次的 Latex 版本,因此如果您使用这些版本,问题就会消失。

写你自己的foo_transitive命令

解决问题的最简单方法,假设每次运行 foo具有相同的依赖关系,是为了解决构建系统之外的问题。只需写一个foo_transitive命令,无论是作为 shell 脚本还是作为 Haskell 函数,当提供输入文件时,通过重复运行并检查它是否已达到固定点来生成输出文件。构建系统现在可以使用 foo_transitive并且没有关于依赖关系的问题。

在构建系统中对其进行编码

你需要写两条规则,一条是一步,另一条是确定哪一步是正确的:

let step i = "tempfile" <.> show i

"tempfile.*" *> \out -> do
let i = read $ takeExtension out :: Int
if i == 0 then
copyFile "input" out
else
let prev = step (i-1)
need [prev]
-- perhaps require addition dependencies, depending on prev
system' "foo" [prev,out]

"output" *> \out -> do
let f i = do
old <- readFile' $ step (i-1)
new <- readFile' $ step i
if old == new || i > 100 then copyFile (step i) out else f (i+1)
f 1

第一条规则生成 tempfile.2来自 tempfile.1等等,所以我们可以 need ["tempfile.100"]获得第 100 次迭代。如果每个步骤中的依赖关系发生变化,我们可以查看之前的结果来计算新的依赖关系。

第二条规则循环检查序列中的每一对值,并在它们相等时停止。如果您在生产构建系统中实现此功能,您可能希望避免调用 readFile'在每个元素上两次(一次为 i-1 一次为 i )。

关于haskell - 如何在 Shake 中编写定点构建规则,例如 latex ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14622169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com