1

私は clojure を使い始めたばかりで、楽しみのためにプロジェクトを行っています。以下の関数では、いくつかのブログ投稿を表示しようとしています (いくつかのオプション付き)。[]「as」オプションを使用して、クライアント コードに vectorと mapのどちらかを選択できるようにしたいと考えています{}。しか持っていなかったときにこれが機能していましたが、ステートメント(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))))))
4

1 に答える 1

4

問題は、常にが返されるということではありません。(when)常に返されるとはnil限りませんnil。式のコレクションの最後にあるものを返します。は ' and(when)を使用するマクロであり、まさにその通りです: 式のリストを実行し、コレクション内の最後の式の値を返します。(if)(do)(do)

代わりにマクロを試してみましたが、(case)うまくいきます:

...
(case as
  "vector" (into [] results)
  "map" (into {} results))

または、より良い(kotarakに感謝):

(into (empty as) results)

どこasに似ていますvector(とは対照的に"vector"、私は思います)

于 2012-10-21T20:34:09.567 に答える