我正在阅读这个关于clojure web堆栈的网站:
http://brehaut.net/blog/2011/ring_introduction
对于clojure,它有关于ORM的说法:
"出于显而易见的原因,Clojure没有SQL/Relational DB ORM."
我可以看到的显而易见的原因是,当您执行clojure.contrib.sql或clojureql查询时,将自动映射到对象.然而,似乎需要一些额外的工作来做一对多或多对多的关系(尽管可能没有太多的工作).
我发现这写了一对多:http://briancarper.net/blog/493/
我不确定我同意哪个; 它似乎假设从数据库中提取了两个表,然后在内存中过滤了连接表.在实践中我认为sql查询将指定where条件.
所以我想知道,是否有一些相当明显的方法可以通过clojureql或clojure.contrib.sql自动执行一对多关系?我唯一能想到的是这样的事情(使用典型的博客文章/评论示例):
(defn post [id]
@(-> (table :posts)
(select (where :id id))))
(defn comments [post_id]
@(-> (table :comments)
(select (where :post_id post_id))))
(defn post-and-comments [id]
(assoc (post id) :comments (comments id)))
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以自动化这个概念,还是这样做得好?
我正在浏览clojure源,我对定义when宏的方式感到惊讶:
user=> (source when)
(defmacro when
"Evaluates test. If logical true, evaluates body in an implicit do."
{:added "1.0"}
[test & body]
(list 'if test (cons 'do body)))
nil
user=>
Run Code Online (Sandbox Code Playgroud)
我期待它写成这样的东西:
(defmacro when [test & body] `(if ~test (do ~@body)))
Run Code Online (Sandbox Code Playgroud)
为什么用这种不太常见的方式写出实际的宏?
我期待在下面,我应该可以通过符号函数间接调用我的函数,但它不起作用.我在这做错了什么:
user=> (defn squared [x] (* x x))
#'user/squared
user=> (squared 2)
4
user=> ((symbol "squared") 2)
nil
user=> ((symbol "user" "squared") 2)
nil
user=>
Run Code Online (Sandbox Code Playgroud) 我试着理解动态变量和绑定函数,所以我尝试了这个(clojure 1.3):
user=> (defn f []
(def ^:dynamic x 5)
(defn g [] (println x))
(defn h [] (binding [x 3] (g)))
(h))
#'user/f
user=> (f)
5
nil
Run Code Online (Sandbox Code Playgroud)
困惑,我尝试了这个稍微简单的代码:
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn g [] (println y))
#'user/g
user=> (defn h [] (binding [y 3] (g)))
#'user/h
user=> (h)
3
nil
Run Code Online (Sandbox Code Playgroud)
这两段代码有什么区别?为什么第二个例子有效但第一个没有?
提示:我刚刚意识到以下工作(仍然不完全理解为什么):
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn f [] (defn g [] (println y)) (defn h [] (binding [y 3] (g))) (h)) …Run Code Online (Sandbox Code Playgroud) 今天早上我遇到了一个非常奇怪的NPE,并将其简化为一个简单的例子.这是JVM错误还是正确的行为?
public class Test1 {
class Item {
Integer id = null;
public Integer getId() {return id;}
}
public Integer f() {
Item item = new Item();
// this works:
//return item == null ? new Integer(1) : item.getId();
// NPE??
return item == null ? 1 : item.getId();
}
public static void main(String[] args) {
Test1 t = new Test1();
System.out.println("id is: " + String.valueOf(t.f()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行的输出:
$ javac Test1.java
$ java Test1
Exception in thread "main" java.lang.NullPointerException …Run Code Online (Sandbox Code Playgroud) 正如它所说的那样.一些示例代码:
let wrapper = shallow(<div><button class='btn btn-primary'>OK</button></div>);
const b = wrapper.find('.btn');
expect(b.text()).to.be.eql('OK'); // fails,
Run Code Online (Sandbox Code Playgroud)
此html方法还返回元素的内容,但也返回元素本身以及所有属性,例如它给出<button class='btn btn-primary'>OK</button>.所以我猜,最坏的情况是,我可以打电话html和正则表达,但......
有没有办法只获取元素的内容,所以我可以断言它.
我无法理解clojure的Noir库.它似乎是一个在compojure之上编写的框架,它将defroute重命名为defpage并将其称为一天.显然是一种不公平的简化,但Noir到底带来了什么呢?为什么我会使用Noir而不是简单的组合+打嗝?
编辑/更新:Noir已被弃用,有趣的是在这里写:http://blog.raynes.me/blog/2012/12/13/moving-away-from-noir/.
我知道spring3必须@RequestHeader在控制器中获得单个请求头.我想知道是否有一种简单的方法来获取所有请求标头?我希望这样的事情:
@RequestMapping(value="/some/url",RequestMethod.GET)
public void endpoint(RequestParams params, BindingResult result, @RequestHeader MultiValueMap<String,String> headers, HttpServletRequest request, ModelMap model) {
}
Run Code Online (Sandbox Code Playgroud)
目前我正在做这样的事情:
MultiValueMap<String,String> headers = new HttpHeaders();
for (Enumeration names = request.getHeaderNames(); names.hasMoreElements();) {
String name = (String)names.nextElement();
for (Enumeration values = request.getHeaders(name); values.hasMoreElements();) {
String value = (String)values.nextElement();
headers.add(name,value);
}
}
Run Code Online (Sandbox Code Playgroud) 我很难理解(并因此记住)这里描述的clojure需要语法:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require.它似乎既反直观又不统一.
例如,在下面的原因中,为什么需要引用此向量:
(require '[clj-json.core :as json])
Run Code Online (Sandbox Code Playgroud)
反直觉,因为通常在clojure中不引用向量(引用列表并将向量视为数据).
并且不均匀,因为在这种情况下,矢量未被引用:
(ns xxx
(:require [clj-json.core :as json]))
Run Code Online (Sandbox Code Playgroud)
我意识到:requirens 函数和ns宏中的用法只是在光学上相似,但仍然如此.
还有其他一些古怪的东西,例如我可以这样做:
(require '(clj-json.core))
Run Code Online (Sandbox Code Playgroud)
但我不能这样做:
(require '(clj-json.core :as json))
Run Code Online (Sandbox Code Playgroud)
有人可以回答这些问题:
:as?我想知道为什么事情就是这样,或者是否在设计时没有发现不一致的原因.
我正在阅读1.5中介绍的有关clojure reducer的内容:https://github.com/clojure/clojure/blob/master/changes.md.我的理解是它们是对现有map/filter/reduce函数的性能增强.因此,如果是这种情况,我想知道他们为什么在新的命名空间中,并且不要简单地替换现有的map/reduce/filter实现.换句话说,为什么我不选择使用新的Reducer功能呢?
编辑:
针对初步的两个答案,这里有一个澄清:
我将在这里引用发行说明:
Reducers提供了一组用于处理集合的高性能函数.实际的折叠/减少算法通过减少的集合来指定.这允许每个集合定义减少其内容的最有效方法.
这对我来说听起来并不像新的map/filter/reduce函数本质上是并行的.例如,在发行说明中进一步说明:
它包含一个新的函数fold,它是一个并行的reduce + combine
因此,除非发行说明写得不好,否则在我看来有一个新功能,fold,它是并行的,而其他功能是特定于集合的实现,旨在为特定集合产生最高性能.我只是误读了这里的发行说明吗?