Making this change would not be backwards compatible:
# a.rbif__FILE__==$0# $LOADED_FEATURES << File.expand_path(__FILE__) # would break thingsrequire'./b'elsedefa1endend# b.rbrequire'./a'pa
The main script is treated specially compared to required files, in ways beyond this. I'm not sure that it is worth changing this and introducing backwards compatibility issues. Especially since this would still be a circular require, which Ruby issues a warning for in verbose warning mode.
A similar case that I have found surprising is if e.g. I use a file for a quick test called like a stdlib, say openssl.rb, then require 'openssl' in that file would not require the stdlib but load the main script a second time, if -I. or so.
That's really unfortunate.
It seems pretty clear nobody wants to load the main script twice, so what's the compatibility issue with adding (the absolute path of the) main script to $LOADED_FEATURES like other (require'd) files?
First, the importance of the stated problem is not clear. Circular require should be fixed. The OP should clearly state the background for wanting this resolved (if any).
Also, a critical problem was noted that irb and many CLI tools would stop working with the proposed solution. For example, bin/irb does require "irb". With the proposed workaround, $LOADED_FEATRUES will contain "/path/to/bin/irb" when the irb command is executed. Then require "irb" will not read /path/to/lib/irb.rb, instead return false immediately. Thus, this proposal will make irb and many other CLI tools inoperable.
With the proposed workaround, $LOADED_FEATRUES will contain "/path/to/bin/irb" when the irb command is executed. Then require "irb" will not read /path/to/lib/irb.rb, instead return false immediately. Thus, this proposal will make irb and many other CLI tools inoperable.
Unless I'm missing something, that would be no problem.
Because /path/to/bin is not in $LOAD_PATH so it won't be considered for require "irb", isn't it?