GNU Make 标准库
GNU Make 标准库(GMSL)是一个使用原生 GNU Make 功能实现的函数集合,提供了列表和字符串操作、整数运算、关联数组、栈以及调试工具。GMSL 以 BSD 许可证发布。[项目页面] [发布版本]
使用 GMSL
需要两个文件:gmsl 和 __gmsl。要在你的 Makefile 中包含 GMSL,可以这样做:
include gmsl
gmsl 会自动包含 __gmsl。要检查你使用的 GMSL 版本是否正确,可以使用 gmsl_compatible 函数(见下文)。当前版本是 1.2.3。GMSL 包还包含一个测试套件,只需运行 make -f gmsl-tests 即可。
逻辑运算符
GMSL 提供了布尔值 $(true)(非空字符串)和 $(false)(空字符串)。以下运算符可以与这些变量一起使用:
- not
参数:一个布尔值
返回值:如果布尔值为$(false),则返回$(true),反之亦然。 - and
参数:两个布尔值
返回值:如果两个布尔值都为$(true),则返回$(true)。 - or
参数:两个布尔值
返回值:如果任意一个布尔值为$(true),则返回$(true)。 - xor
参数:两个布尔值
返回值:如果恰好一个布尔值为$(true),则返回$(true)。 - nand
参数:两个布尔值
返回值:返回not and的结果。 - nor
参数:两个布尔值
返回值:返回not or的结果。 - xnor
参数:两个布尔值
返回值:返回not xor的结果。
列表操作函数
列表是一个由空格分隔的字符串。以下是常用的列表操作函数:
- first
参数:1: 一个列表
返回值:返回列表的第一个元素。 - last
参数:1: 一个列表
返回值:返回列表的最后一个元素。 - rest
参数:1: 一个列表
返回值:返回去掉第一个元素的列表。 - chop
参数:1: 一个列表
返回值:返回去掉最后一个元素的列表。 - map
参数:1: 要对列表每个元素调用的函数名 2: 要遍历的列表
返回值:对每个元素调用函数后的列表。 - pairmap
参数:1: 要对每对元素调用的函数名 2: 第一个列表 3: 第二个列表
返回值:对每对元素调用函数后的列表。 - fold
参数:1: 要对列表每个元素调用的函数名(该函数接受两个参数) 2: 要遍历的列表 3: 列表结束时使用的“零”元素
返回值:对每个元素调用函数后的结果。 - leq
参数:1: 要比较的列表 2: 另一个列表
返回值:如果两个列表相同,则返回$(true)。 - lne
参数:1: 要比较的列表 2: 另一个列表
返回值:如果两个列表不同,则返回$(true)。 - reverse
参数:1: 要反转的列表
返回值:反转后的列表。 - uniq
参数:1: 要去重的列表
返回值:去重后的列表。 - length
参数:1: 一个列表
返回值:列表中的元素数量。
字符串操作函数
字符串是任意字符序列。以下是常用的字符串操作函数:
- seq
参数:1: 要比较的字符串 2: 另一个字符串
返回值:如果两个字符串相同,则返回$(true)。 - sne
参数:1: 要比较的字符串 2: 另一个字符串
返回值:如果两个字符串不同,则返回$(true)。 - strlen
参数:1: 一个字符串
返回值:返回字符串的长度。 - substr
参数:1: 一个字符串 2: 起始偏移量(从1开始) 3: 结束偏移量(包含)
返回值:返回子字符串。 - split
参数:1: 分隔字符 2: 要分割的字符串
返回值:将字符串按分隔字符分割成列表。 - merge
参数:1: 分隔字符 2: 要合并的列表
返回值:将列表合并为单个字符串,元素之间用分隔字符分隔。 - tr
参数:1: 要替换的字符列表 2: 替换后的字符列表 3: 要翻译的文本
返回值:返回翻译后的文本。 - uc
参数:1: 要转换为大写的文本
返回值:返回大写的文本。 - lc
参数:1: 要转换为小写的文本
返回值:返回小写的文本。
集合操作函数
集合由排序且去重的列表表示。以下是常用的集合操作函数:
- set_create
参数:1: 集合元素列表
返回值:返回新创建的集合。 - set_insert
参数:1: 要添加到集合的元素 2: 一个集合
返回值:返回添加元素后的集合。 - set_remove
参数:1: 要从集合中移除的元素 2: 一个集合
返回值:返回移除元素后的集合。 - set_is_member
参数:1: 一个元素 2: 一个集合
返回值:如果元素在集合中,则返回$(true)。 - set_is_not_member
参数:1: 一个元素 2: 一个集合
返回值:如果元素不在集合中,则返回$(false)。 - set_union
参数:1: 一个集合 2: 另一个集合
返回值:返回两个集合的并集。 - set_intersection
参数:1: 一个集合 2: 另一个集合
返回值:返回两个集合的交集。 - set_is_subset
参数:1: 一个集合 2: 另一个集合
返回值:如果第一个集合是第二个集合的子集,则返回$(true)。 - set_equal
参数:1: 一个集合 2: 另一个集合
返回值:如果两个集合相同,则返回$(true)。
整数运算函数
整数由等量的 x 表示。例如,数字 4 表示为 x x x x。以下是常用的整数运算函数:
- int_decode
参数:1: 由x表示的数字
返回值:返回由x表示的整数。 - int_encode
参数:1: 一个整数
返回值:返回由x表示的整数。 - int_plus
参数:1: 由x表示的数字 2: 另一个由x表示的数字
返回值:返回两个数字的和。 - plus
参数:1: 一个整数 2: 另一个整数
返回值:返回两个整数的和。 - int_subtract
参数:1: 由x表示的数字 2: 另一个由x表示的数字
返回值:返回两个数字的差,如果出现下溢则输出错误。 - subtract
参数:1: 一个整数 2: 另一个整数
返回值:返回两个整数的差,如果出现下溢则输出错误。 - int_multiply
参数:1: 由x表示的数字 2: 另一个由x表示的数字
返回值:返回两个数字的乘积。 - multiply
参数:1: 一个整数 2: 另一个整数
返回值:返回两个整数的乘积。 - int_divide
参数:1: 由x表示的数字 2: 另一个由x表示的数字
返回值:返回第一个数字除以第二个数字的整数结果。 - divide
参数:1: 一个整数 2: 另一个整数
返回值:返回第一个整数除以第二个整数的结果。 - int_modulo
参数:1: 由x表示的数字 2: 另一个由x表示的数字
返回值:返回第一个数字除以第二个数字的余数。 - modulo
参数:1: 一个整数 2: 另一个整数
返回值:返回第一个整数除以第二个整数的余数。 - int_max, int_min
参数:1: 由x表示的数字 2: 另一个由x表示的数字
返回值:返回两个数字的最大值或最小值。 - max, min
参数:1: 一个整数 2: 另一个整数
返回值:返回两个整数的最大值或最小值。 - int_gt, int_gte, int_lt, int_lte, int_eq, int_ne
参数:两个由x表示的数字
返回值:返回$(true)或$(false),表示两个数字的比较结果。 - gt, gte, lt, lte, eq, ne
参数:两个整数
返回值:返回$(true)或$(false),表示两个整数的比较结果。 - int_inc
参数:1: 由x表示的数字
返回值:返回数字加1后的结果。 - inc
参数:1: 一个整数
返回值:返回整数加1后的结果。 - int_dec
参数:1: 由x表示的数字
返回值:返回数字减1后的结果。 - dec
参数:1: 一个整数
返回值:返回整数减1后的结果。 - int_double
参数:1: 由x表示的数字
返回值:返回数字乘以2后的结果。 - double
参数:1: 一个整数
返回值:返回整数乘以2后的结果。 - int_halve
参数:1: 由x表示的数字
返回值:返回数字除以2后的结果。 - halve
参数:1: 一个整数
返回值:返回整数除以2后的结果。 - sequence
参数:1: 一个整数 2: 另一个整数
返回值:返回从第一个整数到第二个整数的序列。 - dec2hex, dec2bin, dec2oct
参数:1: 一个整数
返回值:将十进制数转换为十六进制、二进制或八进制。
关联数组
关联数组将键(不含空格的字符串)映射到值(任意字符串)。以下是常用的关联数组操作函数:
- set
参数:1: 关联数组的名称 2: 键 3: 值
返回值:无。 - get
参数:1: 关联数组的名称 2: 键
返回值:返回数组中该键对应的值。 - keys
参数:1: 关联数组的名称
返回值:返回数组中所有定义的键。 - defined
参数:1: 关联数组的名称 2: 要测试的键
返回值:如果键已定义(即不为空),则返回$(true)。
命名栈
栈是一个有序的字符串列表(字符串中不能包含空格)。以下是常用的栈操作函数:
- push
参数:1: 栈的名称 2: 要压入栈顶的值(不能包含空格)
返回值:无。 - pop
参数:1: 栈的名称
返回值:返回并移除栈顶元素。 - peek
参数:1: 栈的名称
返回值:返回栈顶元素但不移除。 - depth
参数:1: 栈的名称
返回值:返回栈中的元素数量。
函数记忆化
为了减少对慢速函数(如 $(shell))的调用次数,GMSL 提供了一个记忆化函数:
- memoize
参数:1: 要记忆化的函数名 2: 函数的字符串参数
返回值:返回函数应用于参数的结果,但每个唯一的参数只调用一次函数。
杂项和调试工具
GMSL 定义了以下常量,所有常量都可以通过 $() 或 ${} 访问:
- true
值:T
用途:用于$(if)和 GMSL 函数的布尔返回值。 - false
用途:用于$(if)和 GMSL 函数的布尔返回值。 - gmsl_version
值:1 0 0
用途:GMSL 版本号,格式为主版本号 次版本号 修订号。 - gmsl_compatible
参数:包含所需库版本号的列表(主版本号 次版本号 修订号)
返回值:如果当前库版本与请求的版本号兼容,则返回$(true),否则返回$(false)。 - gmsl-print-%
参数:%应替换为要打印的变量名。
操作:输出匹配%的变量名及其值。 - gmsl-echo-%
参数:%应替换为要打印的变量名。
操作:输出匹配%的变量值。 - assert
参数:1: 必须为$(true)的布尔值,否则断言失败 2: 断言失败时输出的消息
返回值:无。 - assert_exists
参数:1: 必须存在的文件名,如果文件不存在则生成断言
返回值:无。
GMSL 还有一些环境变量(或命令行覆盖)用于控制功能:
- GMSL_NO_WARNINGS
如果设置,则阻止 GMSL 输出警告消息。 - GMSL_NO_ERRORS
如果设置,则阻止 GMSL 生成致命错误。 - GMSL_TRACE
启用函数跟踪。调用 GMSL 函数时将跟踪函数名和参数。
