首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure函数中使用条件的替代方法,这样我就可以返回值

在Clojure函数中使用条件的替代方法,这样我就可以返回值
EN

Stack Overflow用户
提问于 2012-10-22 04:14:28
回答 1查看 223关注 0票数 1

我刚刚开始使用clojure,我正在做一个有趣的项目。在下面的函数中,我只是尝试显示一些博客帖子(带有一些选项)。使用"as“选项,我想让客户端代码能够在矢量[]和地图{}之间进行选择。当我只有(into [] results)的时候,我可以让它工作,但是当我把(when)语句放进去的时候,它就停止工作了。我猜(when)只是返回nil,因为它就像一个隐式的(do)。对我来说,很明显,像这样在结尾使用(when)是错误的方式来结束一个您期望返回值的函数。我怎么才能让它工作呢?

代码语言:javascript
复制
(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))))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 04:34:10

问题并不在于(when)总是返回nil--它并不总是返回nil;它返回表达式集合中最后的内容。(when)是一个使用'(if)(do)的宏,这正是(do)所做的:执行一个表达式列表并返回集合中最后一个表达式的值。

我尝试使用(case)宏,它可以工作:

代码语言:javascript
复制
...
(case as
  "vector" (into [] results)
  "map" (into {} results))

或者,更好(感谢kotarak):

代码语言:javascript
复制
(into (empty as) results)

as类似于vector的地方(我认为是与"vector"相反)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13001754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档