Skip to content

Instantly share code, notes, and snippets.

@mfikes
Last active March 4, 2016 13:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mfikes/4e39c29c668e21f1bb71 to your computer and use it in GitHub Desktop.
Save mfikes/4e39c29c668e21f1bb71 to your computer and use it in GitHub Desktop.
Tower Unnecessary!

bar/core.clj:

(ns bar.core)

(defmacro unless [pred a b]
  `(if (not ~pred)
     ~a
     ~b))

(defmacro abs [x]
  `(unless (neg? ~x)
     ~x
     (- ~x)))

foo/core.cljs

(ns foo.core
  (:require-macros bar.core))

(defn taxicab-norm [a b]
  (+ (bar.core/abs a) 
     (bar.core/abs b)))
cljs.user=> (require 'foo.core)
nil
cljs.user=> (foo.core/taxicab-norm -4 5)
9

Minimal repro:

(require 'cljs.js)

(let [st (cljs.js/empty-state)]
  (cljs.js/eval-str
    st
    "(ns foo.core
       (:require-macros bar.core))"
    nil
    {:eval    cljs.js/js-eval
     :context :expr
     :load    (fn [m cb]
                (prn m)
                (cb {:lang   :clj
                     :source "(ns bar.core)

                              (defmacro unless [pred a b]
                                `(if (not ~pred)
                                  ~a
                                 ~b))

                              (defmacro abs [x]
                                `(unless (neg? ~x)
                                  ~x
                                  (- ~x)))"}))}
    (fn [{:keys [value error]}]
      (if error
        (prn 'error error)
        (cljs.js/eval-str
          st
          "(bar.core/abs -17)"
          nil
          {:ns 'foo.core
           :eval cljs.js/js-eval
           :context :expr}
          identity)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment