我是clojurescript的新手,并希望通过实现一个纯粹在clojurescript中的先前编写的应用程序来进行更深入的研究,但是在实现ajax调用时却不知所措.任何人都可以在网上给我一个例子,或者给我一个或两个代码片段吗?
任何人都有任何用于访问javascript对象的idiomatic clojurescript的文档(作为json返回,本质上是哈希)?
我有一个通过AJAX请求返回的JSON对象:
{
list: [1,2,3,4,5],
blah: "vtha",
o: { answer: 42 }
}
Run Code Online (Sandbox Code Playgroud)
如何使用clojurescript访问这些字段?
我可以:
(.-list data)
Run Code Online (Sandbox Code Playgroud)
但是当我有嵌套值和对象时,它是如何工作的?
(.-answer (.-o data))
Run Code Online (Sandbox Code Playgroud)
以上似乎非常笨拙,特别是考虑到良好的js语法:data.o.answer.
用clojurescript访问json对象的惯用方法是什么?
注意:
我意识到我实际上可以使用JS语法来引用元素,这实际上非常方便.所以以下内容将正常工作:
(str data.o.answer)
Run Code Online (Sandbox Code Playgroud) 我在Clojurescript命名空间键入以下内容.
cljs.user> (use '[clojure.zip :only [insert-child]])
WARNING: Use of undeclared Var cljs.user/use at line 1
"Error evaluating:" (use (quote [clojure.zip :only [insert-child]])) :as "cljs.user.use.call(null,cljs.core.vec([\"\\uFDD1'clojure.zip\",\"\\uFDD0'only\",cljs.core.vec([\"\\uFDD1'insert-child\"])]));\n"
#<TypeError: Cannot call method 'call' of undefined>
TypeError: Cannot call method 'call' of undefined
at eval (eval at <anonymous> (http://localhost:3000/main.js:32728:147), <anonymous>:1:85)
at eval (eval at <anonymous> (http://localhost:3000/main.js:32728:147), <anonymous>:6:3)
at http://localhost:3000/main.js:32728:142
at evaluate_javascript (http://localhost:3000/main.js:32741:4)
at Object.callback (http://localhost:3000/main.js:32806:138)
at goog.messaging.AbstractChannel.deliver (http://localhost:3000/main.js:31059:13)
at goog.net.xpc.CrossPageChannel.deliver_ (http://localhost:3000/main.js:32164:14)
at Function.goog.net.xpc.NativeMessagingTransport.messageReceived_ (http://localhost:3000/main.js:31732:13)
at goog.events.Listener.handleEvent (http://localhost:3000/main.js:22590:26)
at Object.goog.events.fireListener (http://localhost:3000/main.js:22924:21)
nil
Run Code Online (Sandbox Code Playgroud)
似乎在说明cljs.user命名空间中不存在'use'方法.这种方式对我来说很有意义,因为Clojurescript本身无法评估Clojure表达式.但是,我知道Clojurescript有一个clojure.zip命名空间,我在命名空间声明中使用了clojure.zip (:use [clojure.zip :only …
LightTable中的文档似乎很少.我想在LightTable中创建一个非常简单的ClojureScript Web应用程序作为构建的起点.我在Clojure中的Instarepl工作正常,然后我创建了一个名为dummy.cljs的新文件,其中包含以下内容:
(ns dummy)
(js/alert "Hello lighttable")
Run Code Online (Sandbox Code Playgroud)
我该怎么办呢?
我现在已经想到了这一点,我将发布一个关于如何使用它的视频,因为它非常直观.
这是视频:
虽然clojure和clojurescript功能基本相同(除了明显的差异),但宏不是.当我想要一个clojurescript中的宏时,我必须在clojure中编写它并且需要它与require-macros.这是javascript的技术限制还是仅仅是设计决策?为什么不能两者都一样?
是否可以在没有Java的情况下编译ClojureScript?
我阅读了clojurescript nodejs快速入门,但我发现它们仍然使用java进行编译.
我检查了cljs-bootstrap,但它们也依赖于java.
有没有办法只使用npm install并开始使用clojurescript?
通常当我在库中看到clojure协议时,协议方法将被包装在一个函数中,通常几乎没有添加任何功能.例如:
(defprotocol Pfoo
(foo-method [this]))
(deftype Atype [x y]
Pfoo
(foo-method [this] (do-something)))
(defn foo [arg] (foo-method arg))
Run Code Online (Sandbox Code Playgroud)
并且通常期望客户端调用函数foo,而不是协议中的foo方法.(有关此类事情的具体示例,请参阅clojurescript核心顶部的协议.
那么为什么协议经常被屏蔽功能呢?协议方法不能成为面向客户端的部分,而不是包装功能吗?
我必须在这里遗漏一些非常明显的东西,但我正在尝试设置一个非常基本的程序,将一个项目放到一个通道上,然后阻止,直到我再次取消它.整个计划如下:
(ns shopping-2.core
(:require [cljs.core.async :as async :refer [>!! <!! put! chan <! close! <!!]]))
(let [c (chan)]
(>!! c "hello")
(.write js/document (<!! c))
(close! c))
Run Code Online (Sandbox Code Playgroud)
我得到的JavaScript错误是:
Uncaught TypeError: Cannot call method 'call' of undefined
Run Code Online (Sandbox Code Playgroud)
在我忘记之前我有这个错误:引用chan(如果我只是打开通道,然后再关闭它,程序运行正常)
但是,当我想使用<!!或>!!宏时,这段代码似乎会窒息.
如何从Javascript调用ClojureScript代码(不是相反!).
已经可以从Java调用Clojure,但我不知道如何在ClojureScript中执行等效操作.
通常,Clojure源文件被命名为(例如)foo.clj,而Clojurescript源文件被命名为foo.cljs.我的印象是,在Clojure的版本> = 1.7,我可以命名一个文件foo.cljc如果我希望它是可与加载require或use无论从Clojure的和Clojurescript.
它是否正确?它似乎隐含在使用cljc 和读取器条件的主要文档页面中,但据我所知,它从未明确说明.
这不是关于使用reader条件来指定在Clojure和Clojurescript中运行的备用代码的问题.它更基本.例如,我有一个源文件,其中包含完全通用的代码:它将在Clojure和Clojurescript中运行不变.我可以假设通过命名为".cljc",require总是会从Clojure和Clojurescript中找到它(假设它的名字正确,位于正确的位置,等等)?
[我很确定我是对的,但我不确定,我认为如果我是正确的话,在这里记录答案是值得的.]
clojurescript ×10
clojure ×8
javascript ×2
ajax ×1
java ×1
json ×1
jsonp ×1
lighttable ×1
node.js ×1
protocols ×1