标签: clojurescript

如何将自己的JavaScript库添加到ClojureScript?

我想使用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)

有人曾尝试过这个吗?

javascript clojure google-closure clojurescript

11
推荐指数
2
解决办法
1465
查看次数

如何在ClojureScript中使用方法和构造函数创建JS对象

想象一下,任务是在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中有更优雅/惯用的方法吗?

javascript interop clojure clojurescript

11
推荐指数
2
解决办法
2736
查看次数

如何处理Clojurescript宏中所需的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方面引用某些内容的宏?

macros clojure clojurescript

11
推荐指数
1
解决办法
1110
查看次数

如何在试剂中检测"进入"Keypress?

给出以下代码:

  [: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 reagent

11
推荐指数
2
解决办法
3504
查看次数

你怎么从clojurescript引用javascript这个关键字?

我正在将一些ClojureScript代码与一个带有回调函数的JS库调用集成在一起.JS库使用JavsScript的"this"关键字将数据传递给回调.

我可以使用(js*"this")来使用它.例如:

(libraryCall (fn [] (.log console (js* "this"))))
Run Code Online (Sandbox Code Playgroud)

有没有办法从ClojureScript获取"this"上下文而不诉诸js*?

clojurescript

10
推荐指数
1
解决办法
1179
查看次数

clojure和clojurescript之间的区别?

任何人都可以列出Clojure和ClojureScript之间的一些区别吗?(请和谢谢)语法明智的区别?

clojure clojurescript

10
推荐指数
2
解决办法
3492
查看次数

ClojureScript日期时间库

我想在ClojureScript上做一些基本的,但不是非常基本的与日期相关的操作,比如在两个日期之间获取日期.有一个clj-timeJoda时间的包装,所以它只是Clojure.我也知道Google Closure Library中的日期类.JavaScript有许多可能性,请参阅/sf/ask/56200301//sf/ask/69789681/.我想知道是否有一种惯用的ClojureScript方法.如果没有这样的野兽,我想知道哪个JavaScript库最适合包装.

datetime date clojurescript

10
推荐指数
2
解决办法
3607
查看次数

core.async和10,000个动画过程 - 这种情况下的实际好处是什么?

正如我们所知道- 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的实际好处什么?

clojure goroutine clojurescript core.async

10
推荐指数
1
解决办法
794
查看次数

Ajax GET with Reagent

我正在从我的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)

ajax clojurescript reagent

10
推荐指数
1
解决办法
3475
查看次数

在Clojure中with-redefs和with-redefs-fn有什么区别?

我想了解with-redefs和之间的区别with-redefs-fn.

具体的例子可以很好地理解fns行为.

clojure mocking clojurescript

10
推荐指数
2
解决办法
1681
查看次数