Почему он использует две подстановки, чтобы определить, равны ли две строки?
Чтобы справиться с ситуацией, когда одна строка повторяется другой строкой. Поскольку $(subst)
удалит все вхождения строки seq
потерпит неудачу ужасно, если это было написано так:
seq = $(if $(subst $1,,$2),$(false),$(true))
при тестировании строк aa
и aaaa
как $(subst aa,,aaaa)
будет пустая строка, которая дала бы ответ $(false)
, но обратное строки и $(subst aaaa,,aa)
будут aa
, которые дали бы ответ.
Таким образом, замена выполняется в обоих направлениях, чтобы гарантировать, что когда $1
удаляется из $2
результат является пустой строкой, и наоборот (я использую $(subst)
как оператор вычитания здесь).Из-за того, как работают $(if)
, два $(subst)
s по существу являются ANDed вместе (пустая строка == true и поэтому объединение строк становится AND).
Зачем это необходимо для двух строк: x
?
seq
реализуется следующим образом:
seq = $(__gmsl_tr2)$(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true))
К сожалению, мои рассуждения за то вставляться перед x
«s, кажется, были потеряны в тумане времени. Я подозреваю, что это было связано с тем, что GNU make часто удаляет пробелы, а в случае удаления $(subst)
пробелов. См. Вывод
$(subst ,,the quick brown)
Обратите внимание на двойное пространство в начале работы. Теперь посмотрим на выходе
$(subst e, ,the quick brown)
В первом случае пространство потребленной GNU сделать и $(subst)
не сделал ничего. Во втором случае пространство было не потребляется.
Однако в контексте, в котором я использую $(subst)
, это не имеет значения, поскольку сохраняются пробелы, исходящие из таких переменных, как $1
(то есть удаление пространства происходит до расширения). Вы можете видеть, что со следующим:
space :=
space +=
$(subst $(space),,the quick brown)
Это ставит один символ пробела в space
, а затем использует его удаляет пробелы из the quick brown
.
Итак, я считаю, что x
s не нужны.
Да, но почему? Кроме того, зачем добавлять персонажа? –
@MatheusMoreira Мое предположение: есть какая-то комбинация ввода, возможно, пробелов или '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – user657267
@MatheusMoreira Я запустил файл 'gsml-tests', но все тесты' seq' преуспели даже без 'x', я начинаю думать, что это артефакт возможной более ранней реализации' seq', который не вызывал ' subst' дважды. – user657267