There are other potential uses for conditionally including code based on factors other than platform (host architecture or presence of some external capability).
Copy / paste
One approach is to maintain two versions of the same file that are largely the same but modify the platform-specific parts in each copy. This obviously works but is gross.
lein-cljsbuild provides a (deprecated, to be removed) feature called "crossovers" that provides a very limited preprocessing of certain files during the cljsbuild build process; a special comment string is removed, allowing one to work around the
-macros declarations required in ClojureScript
ns forms. Crossover files must otherwise be fully portable. Language/runtime-specific code must be maintained in separate files. However, (my) experience shows that this can quickly lead to the situation where one has to think a lot about in which file to put a specific function, in order to go though the whole preprocessing machinery. Functions are split into namespaces because of conditional compilation, and not because they belong to the same part or module of the program.
Define a tagged literal #feature[<feature expr> <value>].
Proof of concept here: https://github.com/miner/wilkins
Proposed Solution: feature expressions