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
对应于空字符串,该字符串在Make中逻辑上为false0
-
是可交换的,因此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
。