小编Kev*_*vin的帖子

ORM for clojure?

我正在阅读这个关于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 clojureql

38
推荐指数
4
解决办法
9723
查看次数

当宏观的时候

我正在浏览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)

为什么用这种不太常见的方式写出实际的宏?

clojure

32
推荐指数
1
解决办法
1626
查看次数

使用clojure符号函数进行间接函数调用

我期待在下面,我应该可以通过符号函数间接调用我的函数,但它不起作用.我在这做错了什么:

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

27
推荐指数
1
解决办法
5205
查看次数

clojure和^:动态

我试着理解动态变量和绑定函数,所以我尝试了这个(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)

clojure dynamic-scope

26
推荐指数
1
解决办法
1万
查看次数

具有自动装箱功能的三元运算符中的Java NPE?

今天早上我遇到了一个非常奇怪的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)

java nullpointerexception

20
推荐指数
1
解决办法
1669
查看次数

如何用react +酶选择元素文本

正如它所说的那样.一些示例代码:

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和正则表达,但......

有没有办法只获取元素的内容,所以我可以断言它.

reactjs enzyme

19
推荐指数
3
解决办法
2万
查看次数

noir vs compojure?

我无法理解clojure的Noir库.它似乎是一个在compojure之上编写的框架,它将defroute重命名为defpage并将其称为一天.显然是一种不公平的简化,但Noir到底带来了什么呢?为什么我会使用Noir而不是简单的组合+打嗝?

编辑/更新:Noir已被弃用,有趣的是在这里写:http://blog.raynes.me/blog/2012/12/13/moving-away-from-noir/.

clojure compojure noir

18
推荐指数
3
解决办法
5476
查看次数

springframework获取所有请求标头

我知道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)

java servlets spring-mvc

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

clojure需要语法基本原理

我很难理解(并因此记住)这里描述的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)

有人可以回答这些问题:

  1. 在第一个例子中为什么需要引用向量?
  2. 为什么不需要在ns宏中引用它?
  3. 为什么列表符号不允许:as

我想知道为什么事情就是这样,或者是否在设计时没有发现不一致的原因.

syntax clojure include quoting

17
推荐指数
1
解决办法
647
查看次数

为什么我会选择不使用clojure 1.5减速器功能?

我正在阅读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,它是并行的,而其他功能是特定于集合的实现,旨在为特定集合产生最高性能.我只是误读了这里的发行说明吗?

clojure

17
推荐指数
2
解决办法
1260
查看次数