我刚刚开始使用clojure,我正在做一个有趣的项目。在下面的函数中,我只是尝试显示一些博客帖子(带有一些选项)。使用"as“选项,我想让客户端代码能够在矢量[]和地图{}之间进行选择。当我只有(into [] results)的时候,我可以让它工作,但是当我把(when)语句放进去的时候,它就停止工作了。我猜(when)只是返回nil,因为它就像一个隐式的(do)。对我来说,很明显,像这样在结尾使用(when)是错误的方式来结束一个您期望返回值的函数。我怎么才能让它工作呢?
(ns yf.models.post
(:require [clojure.java.jdbc :as sql]
[clojure.string :as str])
(:use [yf.models.helpers :only [date-format]]))
(defn all [& {:keys [order limit roots-only as]}]
(sql/with-connection (System/getenv "DATABASE_URL")
(sql/with-query-results results
[(str
"SELECT
id,
body,"
(date-format "created") ","
(date-format "modified")
"FROM post a"
(when (true? roots-only)
" WHERE NOT EXISTS (SELECT child_id from post_map b
WHERE a.id=b.child_id) ")
(when (and
(string? (order :column))
(string? (order :dir))
(or
(= (:dir order) "asc")
(= (:dir order) "desc")))
(str " ORDER BY a." (:column order) " " (:dir order)))
(when (and
(instance? Number limit)
(pos? limit))
(str " LIMIT " limit)))]
(when (and ;this is where the problem is
(string? as)
(not (str/blank? as)))
(when (= as "vector")
(into [] results))
(when (= as "map")
(into {} results))))))发布于 2012-10-22 04:34:10
问题并不在于(when)总是返回nil--它并不总是返回nil;它返回表达式集合中最后的内容。(when)是一个使用'(if)和(do)的宏,这正是(do)所做的:执行一个表达式列表并返回集合中最后一个表达式的值。
我尝试使用(case)宏,它可以工作:
...
(case as
"vector" (into [] results)
"map" (into {} results))或者,更好(感谢kotarak):
(into (empty as) results)as类似于vector的地方(我认为是与"vector"相反)
https://stackoverflow.com/questions/13001754
复制相似问题