Clojure / Script Compatibility Magic

Acabei de ter uma biblioteca com a qual estou tentando manter a compatibilidade de Clojure E ClojureScript (usando crossovers ) e precisava analisar um inteiro de uma string. Fácil, você pensa … Mas infelizmente o jeito Clojure …

(Integer/parseInt "123")

E o jeito ClojureScript …

(js/parseInt "123")

Não vai ser compilável em um único namespace. Com lein-cljsbuild , acredito que você pode fornecer diferentes implementações de namespace para cada linguagem, mas para um pequeno ajuste, procurei uma maneira mais simples. Eu encontrei com um pouco de magia negra de construção de lein-clj.

A seguinte string pode ser incluída em arquivos de origem .clj e é removida durante o processamento para .cljs.

;*CLJSBUILD-REMOVE*;

Então, com um pouco de hackeamento …

(ns mynamespace)

;*CLJSBUILD-REMOVE*;(js* "window.Integer = {parseInt: parseInt};")

Temos uma função acessível em ClojureScript (raiz excluída por questões de brevidade) que corresponde ao equivalente em Clojure! Dias felizes.

Este tipo de patching de macaco certamente não é a técnica que você deveria usar normalmente, mas pode ser útil em certas situações