我想使用ClojureScript编写Google Chrome扩展程序.使用ClojureScript,我可以使用所有Google Closure库,但这些库中不包含对Chrome浏览器的访问权限.所以我想在我自己的JavaScript库中包装所有Chrome内容.
到目前为止,我尝试创建自己的jar,它有一个JavaScript文件,只创建一个Foo对象并导出构造函数.我把这个jar添加到ClojureScript编译器的lib目录中(也有goog.jar),但到目前为止没有运气:
Exception in thread "main" java.lang.IllegalArgumentException: No implementation of method: :-compile of protocol: #'cljs.closure/Compilable found for class: nil
at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:494)
at cljs.closure$eval1056$fn__1057$G__1047__1064.invoke(closure.clj:187)
at cljs.closure$get_compiled_cljs.invoke(closure.clj:422)
at cljs.closure$cljs_dependencies.invoke(closure.clj:440)
at cljs.closure$add_dependencies.doInvoke(closure.clj:462)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.core$apply.invoke(core.clj:602)
at cljs.closure$build.invoke(closure.clj:701)
at user$eval1246.invoke(cljsc.clj:21)
at clojure.lang.Compiler.eval(Compiler.java:6406)
at clojure.lang.Compiler.load(Compiler.java:6843)
at clojure.lang.Compiler.loadFile(Compiler.java:6804)
at clojure.main$load_script.invoke(main.clj:282)
at clojure.main$script_opt.invoke(main.clj:342)
at clojure.main$main.doInvoke(main.clj:426)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:405)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.Var.applyTo(Var.java:518)
at clojure.main.main(main.java:37)
Run Code Online (Sandbox Code Playgroud)
有人曾尝试过这个吗?
想象一下,任务是在clojurescript中创建一些实用程序库,以便可以从JS中使用它.
例如,假设我想生成相当于:
var Foo = function(a, b, c){
this.a = a;
this.b = b;
this.c = c;
}
Foo.prototype.bar = function(x){
return this.a + this.b + this.c + x;
}
var x = new Foo(1,2,3);
x.bar(3); // >> 9
Run Code Online (Sandbox Code Playgroud)
实现这一目标的一种方法是:
(deftype Foo [a b c])
(set! (.bar (.prototype Foo))
(fn [x]
(this-as this
(+ (.a this) (.b this) (.c this) x))))
(def x (Foo. 1 2 3))
(.bar x 3) ; >> 9
Run Code Online (Sandbox Code Playgroud)
问题:clojurescript中有更优雅/惯用的方法吗?
我们假设我有一个X.clojurescript和一个X.clojure命名空间.X.clojurescript中的所有内容都是Clojurescript代码,X.clojure中的所有内容都是Clojure代码.不幸的是,我不能直接在Clojurescript中定义宏,我必须在Clojure中定义它们,然后使用它们将它们带入Clojurescript命名空间
(ns X.clojurescript.abc
(:require-macros [X.clojure.def :as clj]))
Run Code Online (Sandbox Code Playgroud)
这可以.但是,如果宏(在X.clojure中定义)需要引用Clojurescript命名空间(X.clojurescript)中定义的内容,该怎么办?问题是Clojure编译器在解析其他命名空间时不会查看我的Clojurescript命名空间(单独的目录).
我通过简单地在我的Clojure代码中创建一个命名空间来解决这个问题,该命名空间具有与Clojurescript中相同的命名空间和所需的定义,但这看起来有点愚蠢.所以,举例来说,如果我需要X.clojurescript.abc.y在我的宏,我只是将创建Clojure的一侧DEFS一个伪Y在X.clojurescript.abc我Clojure的版本额外的命名空间; 有点愚蠢.
我如何处理需要在Clojurescript方面引用某些内容的宏?
给出以下代码:
[:input {:type "text"
:value (:text @app-state)
:on-change (fn [e]
(if (= 31 (.-keyCode e))
(println "ENTER")
(println "NOT ENTER")))}]
Run Code Online (Sandbox Code Playgroud)
如何更改if条件以便输入按键可以与普通键区分开来?e除了target似乎为null 之外的所有属性.
我正在将一些ClojureScript代码与一个带有回调函数的JS库调用集成在一起.JS库使用JavsScript的"this"关键字将数据传递给回调.
我可以使用(js*"this")来使用它.例如:
(libraryCall (fn [] (.log console (js* "this"))))
Run Code Online (Sandbox Code Playgroud)
有没有办法从ClojureScript获取"this"上下文而不诉诸js*?
任何人都可以列出Clojure和ClojureScript之间的一些区别吗?(请和谢谢)语法明智的区别?
我想在ClojureScript上做一些基本的,但不是非常基本的与日期相关的操作,比如在两个日期之间获取日期.有一个clj-time是Joda时间的包装,所以它只是Clojure.我也知道Google Closure Library中的日期类.JavaScript有许多可能性,请参阅/sf/ask/56200301/或/sf/ask/69789681/.我想知道是否有一种惯用的ClojureScript方法.如果没有这样的野兽,我想知道哪个JavaScript库最适合包装.
正如我们所知道- core.async 采用 CSP,类似于够程从去浪.现在对于像select和alt 这样的场景来说,这很有道理.
大卫·诺伦在这里做了一个惊人的演示,在Clojure中展示了Clojure中的core.async.
然而,我可以通过简单的for循环复制类似的功能.你可以在这里看到一个演示.
function animationLoop() {
for (var i =0;i<100;i++) {
for (var j= 0; j<100;j++) {
//decision to animate or hold off
var decisionRange = randomInt(0,10);
if (decisionRange < 1) {
var cell = document.getElementById('cell-' + i + j);
cell.innerHTML = randomInt(0,9);
cell.setAttribute('class','group' + randomInt(0,5));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是在'10,000进程动画场景'中core.async的实际好处是什么?
我正在从我的Reagent应用程序执行Ajax GET,从数据库加载一些东西.
我不完全确定将这样的ajax调用的结果发送到我的页面的最佳方法是什么,考虑到如果我把它放在一个原子中,那么当原子被解除引用时,Reagent会自动重新渲染一个组件,这意味着我得到了无限的ajax调用序列.
对于一些代码,
(def matches (atom nil))
(defn render-matches [ms]
(reset! matches (into [:ul] (map (fn [m] ^{:key m}[:li m])
(walk/keywordize-keys (t/read (t/reader :json) ms)))))
Run Code Online (Sandbox Code Playgroud)
这个功能基本上创建一个 [:ul [:li "Stuff here"] [:li "And here"]]
我想在我的页面上显示,现在有以下代码.
(defn standings-page []
(GET "/list-matches"
{:handler render-matches})
@matches)
Run Code Online (Sandbox Code Playgroud) 我想了解with-redefs和之间的区别with-redefs-fn.
具体的例子可以很好地理解fns行为.
clojurescript ×10
clojure ×6
javascript ×2
reagent ×2
ajax ×1
core.async ×1
date ×1
datetime ×1
goroutine ×1
interop ×1
macros ×1
mocking ×1