未展開マクロは任意の名前を追加で定義しうるこのため、未展開マクロの残っているモジュールでは、ある識別子が存在しないことを結論づけることはできないという追加規則が必要です。シャドウイングに関してはRFC1560に追加の規則が定義されています。names.これにより、globインポートのシャドウイングを検討するときにマクロを気にする必要はなくなっています。名前解決に対するグローバルな影響があります。いうパスが解決可能になってしまうからです。そのため、ExternPreludeの解決時はクレートルートに未解決のマクロがある場合、ExternPreludeの非存在を結論づけないという追加規則が必要です。使うと、任意の位置からクレートルートに名前を挿入できてしまいます。このせいで名前解決が進まないのは本望ではないので、マクロ内定義マクロのパスによる参照を禁止するという方向で対策されています。これにより、マクロ解決時に未展開マクロを気にする必要はほぼなくなっています。まとめRustはマクロに衛生性を導入しており、そのせいで識別子に対する処理が複雑になっています。歴史的な事情もあって衛生性には3段階のレベルがあるので、このことをきちんと理解しつつ名前解決の挙動を追うのは大変です。インポート解決とマクロ展開が相互作用するのも、この部分を複雑にしている一因となっています。いえ、こういった細かい配慮によって全体としてはそれなりに一貫した体感のモジュールシステムが提供されており、一般的なRustプログラマーはここまで複雑な問題を気にする必要がないようになっていると思います。ここまで7日間かけて名前解決についてまとめましたが、2年前に同じ部分を調べたときに比べて全容がより複雑になっていると感じます。その一方で、当時からあった細かい仕様や実装についてもより深く理解できるようになったので、この記事をまとめた甲斐があると思います。この記事を通しで読む人がどれくらいいるかはわかりませんが、きちんと読めば(すぐには役立たなくても)Rustでのプログラミングを底から支える力になると思います。何か細かい仕様で困った人にとっての辞書としても使える記事に仕上がったと思います。2014年のモジュール改革。