Skip to content

Instantly share code, notes, and snippets.

@joshuamiller
Last active May 7, 2021 22:20
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 joshuamiller/20773273a234948013358f91e74c0392 to your computer and use it in GitHub Desktop.
Save joshuamiller/20773273a234948013358f91e74c0392 to your computer and use it in GitHub Desktop.
Issues with Clojurescript eval
(ns eval.test
(:require [cljs.js :refer [empty-state eval js-eval]]))
(defn present?
[x]
(not (or (nil? x)
(and (not (string? x)) (js/isNaN x))
(and (seq? x) (empty? x)))))
(present? 1) ;; true
(def aliases
{'present? present?})
(defn resolve-alias
[x]
(if (seq? x)
(map resolve-alias x)
(get aliases x x)))
(defn rewrite
[expr]
(map resolve-alias expr))
(rewrite '(present? 1)) ;; (#object[eval$test$present_QMARK_] 1)
(eval (empty-state) (rewrite '(present? 1)) {:eval js-eval} :value) ;; true
(eval (empty-state) (rewrite '(or (present? 1))) {:eval js-eval} :value) ;; true
(rewrite '(or (present? 1) true)) ;; (or (#object[eval$test$present_QMARK_] 1) true)
;; why?
(eval (empty-state) (rewrite '(or (not (nil? 1)) true)) {:eval js-eval} :value) ;; nil
(eval (empty-state) (rewrite '(or (present? 1) true)) {:eval js-eval} :error) ;; nil
;;; Logging what's going on in js-eval
(defn js-eval*
"A default JavaScript evaluation function."
[{:keys [source] :as resource}]
(println source)
(js/eval source))
(eval (empty-state) (rewrite '(present? 1)) {:eval js-eval*} :value)
;; cljs.js.get_fn( 90 ).call(null,(1));
(eval (empty-state) (rewrite '(or (present? 1))) {:eval js-eval*} :value)
;; cljs.js.get_fn( 91 ).call(null,(1));
;; Compiled down to the same thing.
(eval (empty-state) (rewrite '(or (present? 1) true)) {:eval js-eval*} :value)
;; var or__43529__auto___44 = cljs.js.get_fn( 97 ).call(null,(1));
;; if(cljs.core.truth_(or__43529__auto___44)){
;; } else {
;; }
;; Doesn't seem to be returning anything?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment