2016-05-26 3 views
3

GNU Make Standard Library содержит функцию seq. Он сравнивает две строки и возвращает логическое значение в форме $(true) и $(false), указывая, являются ли они равными.Выполнение функции GMSL seq

Он реализуется с помощью функции subst:

seq = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),$(false),$(true)) 

То, что я хотел бы понять:

  • Почему использовать два замены, чтобы определить, являются ли две строки равны?

  • Зачем это необходимо для обеих строк: x?


Отчетливо тестирование равенства путем оценки x - y = 0, где:

  • Двоичный - оператор соответствует функции subst
  • две строки соответствуют x и y переменных
  • 0 соответствует пустая строка, которая является логически ложным в Make

- коммутативности, так x - y = y - x.

Итак, есть ли причина, по которой эта функция была выполнена, оценивая (x - y) + (y - x) = 0?

ответ

2

Почему он использует две подстановки, чтобы определить, равны ли две строки?

Чтобы справиться с ситуацией, когда одна строка повторяется другой строкой. Поскольку $(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 не нужны.

0

Смотрите, что происходит, если вы только сравнить раз

seq = $(if $(subst x$1,,x$2),false,true) 
$(error $(call seq,,xxxxxx)) 

Makefile: 2: *** верно. Стоп.

К сожалению.

+0

Да, но почему? Кроме того, зачем добавлять персонажа? –

+0

@MatheusMoreira Мое предположение: есть какая-то комбинация ввода, возможно, пробелов или '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – user657267

+0

@MatheusMoreira Я запустил файл 'gsml-tests', но все тесты' seq' преуспели даже без 'x', я начинаю думать, что это артефакт возможной более ранней реализации' seq', который не вызывал ' subst' дважды. – user657267

Смежные вопросы