@ВeekeeCZ's routine spaces the Blocks' insertion points equally, at your specified spacing, so if you choose something that's not as wide as the widest Block, or if any Blocks' insertion point locations vary a lot in their relation to the drawn content, you can end up with Blocks overlapping, or larger spaces between them than you probably want, and even large variability from being [visually] in a "row." It also allows selection by means [e.g. Window, Crossing, Lasso, Last] that are without control over the order it will use to place them [involving drawn order in some way].
@pendean's linked routine apparently [I only watched the video, but didn't try it] aligns things, but keeps them in their sequence, not your selected order, and either doesn't change the horizontal spacing or if equal spacing is chosen, bases it on the existing spacing between the extreme objects in the selection.
So I offer something that I think is more in line with your request, the attached EntityRow.lsp with its ERow command. It uses the actual size [extents] of each object, not Block insertion points, to establish the position of each in its Moved location relative to the previous Moved object [or relative to the start-of-row location for the first one]. Because it's based on extents rather than insertion points, it can be used for any object type(s), not just Blocks [hence the name with Entity, not Block]. And it requires you to pick things in ways that are clear about the sequence you want [individual picks or Fence], ignoring things selected by other means [and scolding you for it]. See more commentary at the top of the file.
[It could be edited to ask for the 'gap' variable value, rather than have it built in. And it could have an Undo Begin/End wrapper, and if so, an *error* handler would also be appropriate.]
Kent Cooper, AIA