在我的Clojure共享源代码中,我有以下内容(这是我无耻地偷来的):
在我的Clojurescript代码中,我有以下内容(我:需要宏,如c)
很不幸,当我编译时,出现了以下错误:
当我在浏览器中打开JavaScript时,弹出“嘿,Stephen”的对话框,但是在按下“嘿,Stephen”对话框上的“确定”后立即出现了普遍存在的“Uncaught TypeError: Cannot call method 'call' of undefined”错误。确实,在查看生成的JavaScript代码时,我的js / alert变成了:
(defmacro hey-str [name]
`(str "hey " ~name))
{:author "Laurent Petit (and others)"
:doc "Functions/macros variants of the ones that can be found in clojure.core
(note to other contrib members: feel free to add to this lib)"}
(defmacro- defnilsafe [docstring non-safe-name nil-safe-name]
`(defmacro ~nil-safe-name ~docstring
{:arglists '([~'x ~'form] [~'x ~'form ~'& ~'forms])}
([x# form#]
`(let [~'i# ~x#] (when-not (nil? ~'i#) (~'~non-safe-name ~'i# ~form#))))
([x# form# & more#]
`(~'~nil-safe-name (~'~nil-safe-name ~x# ~form#) ~@more#))))
(defnilsafe
"Same as clojure.core/-> but returns nil as soon as the threaded value is nil itself (thus short-circuiting any pending computation).
Examples :
(-?> \"foo\" .toUpperCase (.substring 1)) returns \"OO\"
(-?> nil .toUpperCase (.substring 1)) returns nil
"
-> -?>)
(defnilsafe
"Same as clojure.core/.. but returns nil as soon as the threaded value is nil itself (thus short-circuiting any pending computation).
Examples :
(.?. \"foo\" .toUpperCase (.substring 1)) returns \"OO\"
(.?. nil .toUpperCase (.substring 1)) returns nil
"
.. .?.)
(defnilsafe
"Same as clojure.core/->> but returns nil as soon as the threaded value is nil itself (thus short-circuiting any pending computation).
Examples :
(-?>> (range 5) (map inc)) returns (1 2 3 4 5)
(-?>> [] seq (map inc)) returns nil
"
->> -?>>)
在我的Clojurescript代码中,我有以下内容(我:需要宏,如c)
(def a nil)
(def b [])
(def c [{:a 23}])
(js/alert (c/hey-str "Stephen")) ;; should display "hey Stephen"
(js/alert (c/-?> a first :a)) ;; should display nil
(js/alert (c/-?> b first :a)) ;; should display nil
(js/alert (c/-?> c first :a)) ;; should display 23
很不幸,当我编译时,出现了以下错误:
WARNING: Use of undeclared Var webstack.client/-?> at line 56 cljs-src/webstack/client.cljs
WARNING: Use of undeclared Var webstack.client/-?> at line 57 cljs-src/webstack/client.cljs
WARNING: Use of undeclared Var webstack.client/-?> at line 58 cljs-src/webstack/client.cljs
当我在浏览器中打开JavaScript时,弹出“嘿,Stephen”的对话框,但是在按下“嘿,Stephen”对话框上的“确定”后立即出现了普遍存在的“Uncaught TypeError: Cannot call method 'call' of undefined”错误。确实,在查看生成的JavaScript代码时,我的js / alert变成了:
alert([cljs.core.str("hey "), cljs.core.str("Stephen")].join(""));
alert(webstack.client.__QMARK__GT_.call(null, webstack.client.__QMARK__GT_.call(null, webstack.client.a, cljs.core.first), "\ufdd0'a"));
alert(webstack.client.__QMARK__GT_.call(null, webstack.client.__QMARK__GT_.call(null, webstack.client.b, cljs.core.first), "\ufdd0'a"));
alert(webstack.client.__QMARK__GT_.call(null, webstack.client.__QMARK__GT_.call(null, webstack.client.c, cljs.core.first), "\ufdd0'a"))
很明显,我可以使用宏,但是与-?>(及相关宏)的编写方式有关会导致它们无法编译。为了使用这些-?>
、.?.
和-?>>'
宏,我需要做什么?
some->
宏已经存在了,所以不需要重新实现。 - porglezomp