我正在 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) 我正在使用 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) 考虑以下试剂成分。它使用 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的喜悦时,我遇到了一些代码.
(fn [~'key ~'r old# new#]
(println old# " -> " new#)
Run Code Online (Sandbox Code Playgroud)
这个声明的确切行为是什么〜'某些符号.
某些符号#和'~aother-symbol或gensym之间的区别?
Clojure的喜悦:(不明白)
你会在Clojure宏中看到模式〜'符号,用于有选择地捕获宏体中的符号名称.这种尴尬[11]的原因是Clojure的语法引用试图解析当前上下文中的符号,从而产生完全限定符号.因此,〜'通过不引用引号来避免该解决方案.
我试图反转试剂原子的值 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)
在Clojure(脚本)中,您使用deftype和定义编程构造defrecord.我们希望每个构造都有一个特定的,明确定义的目的.我们选择分离责任,而不是将任何一个构造演变成一个单一的全功能的东西.装饰器(例如,包装其他数据结构的数据结构)对此有利.
例如,您有一个记录器构造.您将时间戳添加为装饰器的功能.您稍后将警报支持人员蜂鸣器添加为另一个装饰器.理论上,我们可以通过这种方式对任意数量的特征进行分层.我们的配置文件干净地确定包含哪些功能.
如果我们的记录器实现了一个3方法的Logging协议,并且每个装饰器只增加一个,那么你仍然必须在每个装饰器上实现另外两个方法来维护契约api.这些无添加实现只是将消息传递给链.这是尴尬的一点.
构造的api越丰富,问题就越严重.考虑一个实现一些协议的构造,以及装饰处理12个左右方法的东西所需的工作.
您是否有机会,宏观或技术可以克服这个问题?
尽管将所需的依赖项添加到我的 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) 我正在遵循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 和 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 中使用“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)
它似乎有效,但这是一个坏主意吗?为什么?
任何人都可以解释为什么宏扩展不起作用?
clojurescript ×10
clojure ×9
reagent ×3
ajax ×1
core.async ×1
decorator ×1
dependencies ×1
leiningen ×1
lisp ×1
macros ×1
threadpool ×1