如何处理 METAPOST 中的依赖关系

如何处理 METAPOST 中的依赖关系

我正在研究蓝图包,这是项目经理和系统设计师使用的图形工具包,现在是时候整理库设计了。

库中有多个模块,我想让每个模块确保其先决条件定义已加载。例如,模块milestonesdiagram需要模块reveal并应发出警告,如果后者尚未加载,前者应发出错误消息并终止 METAPOST。

实现这一目标的最佳方法是什么? 我正在考虑在每个模块中定义版本信息,但是:

  1. 对于不遵守此约定的外部库,这不起作用。
  2. 版本信息的验证确实应该在库之间共享。

答案1

惯例是每个模块使用模块顶部的保护来防止自身被多次解释。用户代码和其他模块根据需要加载外部模块。

可以通过声明变量或宏然后使用known运算符测试其是否存在来实现保护。 如果在声明之前就存在,则模块已被读取,并且代码解释通过 停止endinput。 这是一个示例保护:

if known my_module:
  message "module my_module loaded twice";
  expandafter endinput
fi
string my_module;
my_module := "";
message "module my_module loaded once";

<module code>

endinput

if子句中,稍微expandafter推迟一点效果,让 MetaPost 有机会看到结束语句。否则,只要模块被读取多次,MetaPost 就会抱怨存在一个开放的 if 子句。endinputfi


关于版本管理,MetaPost 对此的支持并不多。您所能做的就是提供在每个模块中检索版本号的方法,以便用户可以在input安装模块后检查模块版本。

对于不提供版本信息的外部模块,您可以使用known如上所示的运算符检查特定功能(变量或宏)是否存在。但这无助于识别模块的特定补丁级别(修复了某些错误)。如果需要细粒度的版本信息,一种选择是联系模块作者并提出功能请求。

相关内容