String GMSL seq函数的实现

String GMSL seq函数的实现,string,makefile,gnu-make,equality,gmsl,String,Makefile,Gnu Make,Equality,Gmsl,包含一个seq函数。它比较两个字符串并以$(true)和$(false)的形式返回布尔值,指示它们是否相等 它通过以下功能实现: seq = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true)) 我想了解的是: 为什么它使用两个替换来确定两个字符串是否相等 为什么它在两个字符串前都加上一个x 通过评估x-y=0,显然是在测试平等性,其中: 二进制-运算符对应于subst函数 这两个字符串对应于x和y变量 0对应于空字符串,该

包含一个
seq
函数。它比较两个字符串并以
$(true)
$(false)
的形式返回布尔值,指示它们是否相等

它通过以下功能实现:

seq = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true))
我想了解的是:

  • 为什么它使用两个替换来确定两个字符串是否相等

  • 为什么它在两个字符串前都加上一个
    x


通过评估
x-y=0
,显然是在测试平等性,其中:

  • 二进制
    -
    运算符对应于
    subst
    函数
  • 这两个字符串对应于
    x
    y
    变量
  • 0
    对应于空字符串,该字符串在Make中逻辑上为false
-
是可交换的,因此
x-y=y-x


那么,这个函数是通过计算
(x-y)+(y-x)=0来实现的,这有什么原因吗?

如果只比较一次,请注意会发生什么

seq = $(if $(subst x$1,,x$2),false,true)
$(error $(call seq,,xxxxxx))
Makefile:2:**true。停下来

哎呀

为什么它使用两个替换来确定两个字符串是否相等

处理一个字符串正好重复另一个字符串的情况。因为
$(subst)
将删除所有出现的字符串
seq
如果这样编写,则会严重失败:

seq = $(if $(subst $1,,$2),$(false),$(true))
当测试字符串
aa
aaaa
时,
$(subst-aa,aaaa)
将是一个空字符串,它将给出答案
$(false)
,但将字符串反转,
$(subst-aaaa,aa)
将是
aa
,它将给出正确的答案

因此,替换是双向的,以确保当从
$2
中删除
$1
时,结果是空字符串,反之亦然(我在这里使用
$(subst)
作为减法运算符)。由于
$(if)
的工作方式,两个
$(subst)
基本上是在一起进行and运算的(空字符串==true,因此字符串的串联变成and)

为什么它在两个字符串前都加上一个
x

seq
实现如下:

seq = $(__gmsl_tr2)$(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true))
不幸的是,我关于设置
x
的理由似乎已经在时间的迷雾中消失了。我怀疑这与gnumake经常删除空白有关,在
$(subst)
的情况下,删除空白。参见

$(subst  ,,the quick brown)
$(subst e, ,the quick brown)
注意开始处的双空格。现在看一下

$(subst  ,,the quick brown)
$(subst e, ,the quick brown)
在第一种情况下,GNU make占用了空间,而
$(subst)
什么也没做。在第二种情况下,空间没有被消耗

但是,在我使用
$(subst)
的上下文中,这并不重要,因为来自
$1
等变量的空格会被保留(即,空格剥离发生在扩展之前)。您可以通过以下内容看到这一点:

space :=
space +=
$(subst  $(space),,the quick brown)
将单个空格字符放入
空格
,然后使用它从快速棕色
中删除空格


因此,我认为
x
s是不必要的。

是的,但为什么?还有,为什么要在字符前加前缀?@MatheusMoreira我猜有一些需要转义的输入组合,可能是空格或
$
s,但是我还没有找到任何东西。@MatheusMoreira我运行了
gsml测试
文件,但是所有
seq
测试即使没有
x
,也会成功,我开始认为这可能是
seq
早期实现的产物,它没有两次调用
subst