Если вы хотите сравнить оба объекта, не разбирая их вообще, тогда да.
ОДНАКО, проблема с этим методом состоит в том, что он сравнивает только данные, привязанные к двум объектам синтаксиса, и фактически не будетсравните их обязательную информацию.
Аналогия, которую я слышал (от Райана Калпеппера ), это то же самое, что взять две картины, выпить их цвета и посмотреть,они одинаковые.Хотя они могут быть похожи в некоторых отношениях, вы пропустите много отличий от разных цветов.
Лучший подход (хотя и требует некоторой работы), это использовать syntax-e
чтобы разрушить объект синтаксиса в более примитивные списки объектов синтаксиса и делать это до тех пор, пока вы не получите идентификаторы (в основном, объект синтаксиса, данные которого являются символом), оттуда обычно можно использовать free-identifier=?
(а иногда bound-identifier=?
, чтобы увидеть, может ли каждый идентификатор связывать друг друга, и identifier-binding
для сравнения идентификаторов уровня модуля.
Причина, по которой не существует ни одного простого предиката для сравнения двух объектов произвольного синтаксиса, заключается в том, что, как правило, на самом деле не существует одного хорошего определения того, что делает два фрагмента кода равными, даже если вы заботитесь только о синтаксическом равенстве. Например,использование функций, упомянутых выше, не отслеживает внутренние привязки в объекте синтаксиса, поэтому вы все равно получите очень строгое определение того, что значит быть«Равно».то есть оба объекта синтаксиса имеют одинаковую структуру с идентификаторами, которые либо связаны с одним и тем же модулем, либо free-identifier=?
.
Таким образом, прежде чем использовать этот ответ, я настоятельно рекомендую вам сделать шаг назади убедитесь, что это действительно то, что вы хотите сделать.Однажды на голубой луне это так, но большую часть времени вы на самом деле пытаетесь решить похожую, но более простую проблему.