序列理解得到 运行

sequence comprehensions to get run

下面的代码是我从一本书(Functional Programming Patterns in Scala and Clojure)中找到的。 for语句使用close-zip?过滤掉拉链外的人,然后它会向剩下的人发出问候语。但是,我不太确定人们应该如何作为 generate-greetingsprint-greetings 函数的参数?

(def close-zip? #{19123 19103})

(defn generate-greetings [people]
  (for [{:keys [name address]} people :when (close-zip? (address :zip-code))]
    (str "Hello, " name ", and welcome to the Lambda Bar And Grille!")))

(defn print-greetings [people]
  (doseq [{:keys [name address]} people :when (close-zip? (address :zip-code))]
    (println (str "Hello, " name ", and welcome to the Lambda Bar And Grille!"))))

它们需要是带有 :name:address 键的地图,例如:

{:name "A Person", :address {:zip-code 19103}}

for 将从 people 中取出每个元素并将每个元素分配给 {:keys [name address]}。这叫做destructuring,只是为了方便。等于说:

(for [person people
      :let [name (:name person)
            address (:address person)]
      :when (close-zip? (:zip-code address))]
  (str ...))