[博客翻译]GNU Make标准库


原文地址:https://gmsl.jgc.org/


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 函数时将跟踪函数名和参数。
阅读全文(20积分)