我正在研究蓝图包,这是项目经理和系统设计师使用的图形工具包,现在是时候整理库设计了。
库中有多个模块,我想让每个模块确保其先决条件定义已加载。例如,模块milestonesdiagram
需要模块reveal
并应发出警告,如果后者尚未加载,前者应发出错误消息并终止 METAPOST。
实现这一目标的最佳方法是什么? 我正在考虑在每个模块中定义版本信息,但是:
- 对于不遵守此约定的外部库,这不起作用。
- 版本信息的验证确实应该在库之间共享。
答案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 子句。endinput
fi
关于版本管理,MetaPost 对此的支持并不多。您所能做的就是提供在每个模块中检索版本号的方法,以便用户可以在input
安装模块后检查模块版本。
对于不提供版本信息的外部模块,您可以使用known
如上所示的运算符检查特定功能(变量或宏)是否存在。但这无助于识别模块的特定补丁级别(修复了某些错误)。如果需要细粒度的版本信息,一种选择是联系模块作者并提出功能请求。