标签: clojurescript

如何让 cljsbuild 在 uberjar 编译 clojure 应用程序之前运行?

我正在 clojure/clojurescript/reagentt 中制作一个同构应用程序。由于我依赖于用于服务器端渲染的 clojurescript 输出 js 文件,因此我希望在 jar 之前编译该文件。我怎么做?

这是“lein uberjar”的输出,注意首先编译jar。我的 clj 文件“nash.clj”需要运行编译好的 server-side.js 构建:

Johns-MacBook-Pro:bfa-clojure johnkealy$ lein uberjar

minifying assets...

minifying: resources/public/css/site.min.css
assets: site.css
original size: 88983
compressed size: 73886
gzipped size: 13676
Compiling bfa-clojure.api.auth
Compiling bfa-clojure.api.misc
Compiling bfa-clojure.api.photos
Compiling bfa-clojure.global
Compiling bfa-clojure.handler
Compiling bfa-clojure.nash
Compiling bfa-clojure.pages
Compiling bfa-clojure.server
2015-08-17 14:34:32.964:INFO::main: Logging initialized @21242ms
Compiling ClojureScript.
Compiling "resources/public/javascripts/server-side.js" from ("src/cljs" "src/server-cljs" "src/clj/bfa_clojure/queries" "src/cljs" "src/server-cljs" "src/clj/bfa_clojure/queries")...
Successfully compiled "resources/public/javascripts/server-side.js" in 7.441 seconds.
Run Code Online (Sandbox Code Playgroud)

而我的 project.clj...整个 cljsbuild 事情目前对我来说是个谜。

(defproject bfa-clojure "0.1.0-SNAPSHOT"
  :description …
Run Code Online (Sandbox Code Playgroud)

clojure clojurescript isomorphic-javascript

2
推荐指数
1
解决办法
1433
查看次数

如何处理 cljs-ajax 响应?

我正在使用 cljs-ajax 从 clojurescript 前端向使用 JSON 响应的 API 发出请求,但似乎我需要对它做一些事情才能在 cljs 中使用它。

(defn all-pieces []
  (GET "/art/pieces" {:handler ajax-success-handler}))
Run Code Online (Sandbox Code Playgroud)

当我初始化我的应用程序状态时,我分配了密钥 :all-pieces (all-pieces)

当我:all-pieces在组件中迭代时,我收到错误Uncaught Error: [object Object] is not ISeqable

(defn pieces-component []
  [:ul (for [piece (:all-pieces @app-state)]
         [:li (art-piece piece)])])
Run Code Online (Sandbox Code Playgroud)

编辑重新普拉特利:

下面的代码现在导致的状态all-pieces{},看到什么问题?

;; -------------------------
;; Remote Data

(defn all-pieces [handler]
  (GET "/art/pieces" {:handler handler}))

;; -------------------------
;; State Management

(def app-state (atom
  {:doc {}
    :saved? false
    :page-state {}
    :all-pieces {}}))


(defn set-pieces-fresh [] …
Run Code Online (Sandbox Code Playgroud)

ajax clojure clojurescript

2
推荐指数
1
解决办法
1357
查看次数

clojurescript 原子的哪些变化会导致试剂成分重新渲染?

考虑以下试剂成分。它使用 ref 函数,该函数根据 span 元素的实际大小更新局部状态原子。这样做是为了重新渲染显示其自身大小的组件

(defn show-my-size-comp []
  (let [size (r/atom nil)]
    (fn []
      (.log js/console "log!")
      [:div
       [:span {:ref (fn [el]
                      (when el (reset! size (get-real-size el))))} 
        "Hello, my size is:" ]
       [:span (prn-str @size)]])))
Run Code Online (Sandbox Code Playgroud)

如果 的实现get-real-size返回一个向量,则日志消息会不断打印,这意味着组件一直在不必要地重新渲染。如果它只返回一个数字或一个字符串,则日志只会出现两次 - 正如本场景中所预期的那样。

这是什么原因?是否可能在内部使用新向量(尽管包含相同的值)更新 clojure 脚本原子意味着将另一个 JavaScript 对象放在那里,从而更改原子?而放置一个值不会产生可观察到的变化?只是猜测...*

无论如何 - 对于实际用例,将跨度的大小保存在向量中肯定会更好.. 有没有办法实现这一点?

我在尝试增强问题中给出的答案时遇到了这一点


* 因为在 JS 中: ({} === {}) // false

clojure clojurescript reagent

2
推荐指数
1
解决办法
540
查看次数

何时在Clojure Macro中使用〜'some-symbol?

当我阅读Clojure的喜悦时,我遇到了一些代码.

(fn [~'key ~'r old# new#]
                  (println old# " -> " new#)
Run Code Online (Sandbox Code Playgroud)

这个声明的确切行为是什么〜'某些符号.

某些符号#和'~aother-symbol或gensym之间的区别?

Clojure的喜悦:(不明白)

你会在Clojure宏中看到模式〜'符号,用于有选择地捕获宏体中的符号名称.这种尴尬[11]的原因是Clojure的语法引用试图解析当前上下文中的符号,从而产生完全限定符号.因此,〜'通过不引用引号来避免该解决方案.

lisp macros functional-programming clojure clojurescript

2
推荐指数
1
解决办法
467
查看次数

clojurescript 试剂互换!原子否定原子值

我试图反转试剂原子的值 changeval

(def changeval(reagent/atom 0))
...
...
[:input {:type "button" :value "Invert!"
            :on-click #(swap! changeval(not= changeval0 ) ) }]
Run Code Online (Sandbox Code Playgroud)

什么也没发生,我怎样才能使 changeval = NOT(changeval)

clojurescript reagent

2
推荐指数
1
解决办法
1103
查看次数

Clojure是否对装饰者有一种高效,惯用的方法?

在Clojure(脚本)中,您使用deftype和定义编程构造defrecord.我们希望每个构造都有一个特定的,明确定义的目的.我们选择分离责任,而不是将任何一个构造演变成一个单一的全功能的东西.装饰器(例如,包装其他数据结构的数据结构)对此有利.

例如,您有一个记录器构造.您将时间戳添加为装饰器的功能.您稍后将警报支持人员蜂鸣器添加为另一个装饰器.理论上,我们可以通过这种方式对任意数量的特征进行分层.我们的配置文件干净地确定包含哪些功能.

如果我们的记录器实现了一个3方法的Logging协议,并且每个装饰器只增加一个,那么你仍然必须在每个装饰器上实现另外两个方法来维护契约api.这些无添加实现只是将消息传递给链.这是尴尬的一点.

构造的api越丰富,问题就越严重.考虑一个实现一些协议的构造,以及装饰处理12个左右方法的东西所需的工作.

您是否有机会,宏观或技术可以克服这个问题?

clojure decorator clojurescript

2
推荐指数
1
解决办法
481
查看次数

使用 lein 为 clojure 项目添加依赖项

尽管将所需的依赖项添加到我的 project.clj 文件中,

(defproject word-tree "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}

  :dependencies [[org.clojure/clojure "1.10.1"]
                 [org.clojure/clojurescript "1.10.520"]
                 [clojure-opennlp "0.5.0"] ; <----------------------here
                 [reagent "0.8.1"]]
 ...
Run Code Online (Sandbox Code Playgroud)

我无法访问依赖项提供的功能。

在我的一个文件中引用命名空间后,

(ns word-tree.suffix-tree
  (:require [clojure.string :as str]
            [opennlp.nlp :as nlp])) ; <-----this is the namespace of the dependency
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

没有这样的命名空间:opennlp.nlp,找不到 opennlp/nlp.cljs、opennlp/nlp.cljc 或提供“opennlp.nlp”的 JavaScript 源

最奇怪的是,当我运行lein deps :tree依赖项时出现了!

$ lein deps :tree
...
[cider/piggieback "0.4.1" :scope "test"]
 [cljfmt "0.5.7"]
   [rewrite-clj "0.5.2"]
   [rewrite-cljs "0.4.3"]
 [clojure-complete "0.2.5" …
Run Code Online (Sandbox Code Playgroud)

dependencies clojure leiningen clojurescript reagent

2
推荐指数
1
解决办法
169
查看次数

编译 ClojureScript 时出现“地址已在使用”

我正在遵循ClojureScript 快速入门指南 并在执行“构建和运行”步骤时

clj --main cljs.main --compile hello-world.core --repl
Run Code Online (Sandbox Code Playgroud)

得到错误:

Execution error (BindException) at java.net.PlainSocketImpl/socketBind (PlainSocketImpl.java:-2).
Address already in use (Bind failed)

Full report at:
/var/folders/c0/ykv1h_th8xl1tt006s7jd2lh0000gq/T/clojure-2487776791711977744.edn
Run Code Online (Sandbox Code Playgroud)

完整的报告如下所示:

{:clojure.main/message
 "Execution error (BindException) at java.net.PlainSocketImpl/socketBind (PlainSocketImpl.java:-2).\nAddress already in use (Bind failed)\n",
 :clojure.main/triage
 {:clojure.error/class java.net.BindException,
  :clojure.error/line -2,
  :clojure.error/cause "Address already in use (Bind failed)",
  :clojure.error/symbol java.net.PlainSocketImpl/socketBind,
  :clojure.error/source "PlainSocketImpl.java",
  :clojure.error/phase :execution},
 :clojure.main/trace
 {:via
  [{:type java.net.BindException,
    :message "Address already in use (Bind failed)",
    :at
    [java.net.PlainSocketImpl socketBind "PlainSocketImpl.java" -2]}],
  :trace
  [[java.net.PlainSocketImpl socketBind "PlainSocketImpl.java" -2]
   [java.net.AbstractPlainSocketImpl …
Run Code Online (Sandbox Code Playgroud)

clojure clojurescript

2
推荐指数
1
解决办法
315
查看次数

无法在类路径上找到 clojure/test/check__init.class、clojure/test/check.clj 或 clojure/test/check.cljc

我是 Clojure 和 Lisp 的新手。在Getting Clojure一书的第 14 章之后,它建议clojure.test.check.generators以一种在我看来好像它是嵌入在clojure.test.

事实证明不是。试图(require '[clojure.test.check.generators])给出一个错误:

Could not locate clojure/test/check__init.class, clojure/test/check.clj or clojure/test/check.cljc on classpath.

clojure clojurescript

2
推荐指数
1
解决办法
383
查看次数

带有外部绑定符号的 core.async go 块工作但不宏展开

在过去的几周里,我一直在 Clojure 和 Clojurescript 中使用“core.async”,想知道在 a 内部使用外部绑定符号是否是个好主意,go因为有一个线程池,并且可能其中任何一个都可以使用绑定符号。它可以对其进行评估,但宏扩展不起作用 - 请参阅以下代码段

我想它应该可以正常工作。该x是并发线程不变的,不会改变。对可变数据使用atomasx也应该会导致它的atomXD 例如,对象引用当然不起作用或可能会产生问题!

(let [x 5]
  (clojure.core.async/go
   (println x)))

;; => 5
;; nil
Run Code Online (Sandbox Code Playgroud)
(clojure.walk/macroexpand-all
   '(let [x 5]
      (clojure.core.async/go
        (println x))))

;; => Syntax error macroexpanding clojure.core.async/go at (your_project.cljc:93:3).
;;    Could not resolve var: x
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但这是一个坏主意吗?为什么?

任何人都可以解释为什么宏扩展不起作用?

clojure thread-safety threadpool clojurescript core.async

2
推荐指数
1
解决办法
102
查看次数