| macro | since v1.7.48 | Edit |
(goog-define sym default)Use instead of def when you want to configure its value at
compile-time with the :closure-defines compiler option.
Must be a string, number, or boolean.
You can use compile-time constants to signal code to remove from your build,
with :optimizations :advanced.
To make this work for booleans, the compiler needs some explicit hinting:
(goog-define ^boolean DEBUG true)
;; ^^^^^^^^ mark as boolean to allow compiler to optimize
(when DEBUG
(println "Hello World")) ;; <-- removed from build when DEBUG is false
To make this work for strings, the compiler needs an explicit identical? comparison:
(goog-define LOCALE "en")
(def messages
(cond
(identical? LOCALE "nl") i18n.nl/messages ;; <-- removed from build when unused
(identical? LOCALE "fr") i18n.fr/messages ;; <-- removed from build when unused
:else i18n.en/messages))
Defines a var using `goog.define`. Passed default value must be
string, number or boolean.
Default value can be overridden at compile time using the
compiler option `:closure-defines`.
Example:
(ns your-app.core)
(goog-define DEBUG! false)
;; can be overridden with
:closure-defines {"your_app.core.DEBUG_BANG_" true}
or
:closure-defines {your-app.core/DEBUG! true}(core/defmacro goog-define
[sym default]
(assert-args goog-define
(core/or (core/string? default)
(core/number? default)
(core/true? default)
(core/false? default)) "a string, number or boolean as default value")
(core/let [defname (comp/munge (core/str *ns* "/" sym))
type (core/cond
(core/string? default) "string"
(core/number? default) "number"
(core/or (core/true? default) (core/false? default)) "boolean")]
`(~(if (:def-emits-var &env) `return-first `do)
(declare ~(core/vary-meta sym
(core/fn [m]
(core/cond-> m
(core/not (core/contains? m :tag))
(core/assoc :tag (core/symbol type))
))))
(def ~(vary-meta sym assoc :goog-define type) (goog/define ~defname ~default)))))