小编jch*_*eat的帖子

用于"让"匹配Clojure的Common Lisp宏

Clojure的let比Common Lisp更简洁,括号更少:

 ;Clojure
(let [a 1 b 2]
     (+ a b))


;Common Lisp
(let ( (a 1) (b 2))
    (+ a b))
Run Code Online (Sandbox Code Playgroud)

你如何在Common Lisp中编写一个宏来等效?:

(letmac ( a 1 b 2)
    (+ a b))
Run Code Online (Sandbox Code Playgroud)

macros clojure common-lisp

3
推荐指数
1
解决办法
160
查看次数

Clojure doseq嵌套循环以创建新集

在Clojure中,我希望能够将一组中的所有数字相乘并将它们全部添加到一个新的集合中以返回.

=>(multiply-all #{ 1 2 3})

#{1 4 6 3 2 9}
Run Code Online (Sandbox Code Playgroud)

这是我的实现:

(defn multiply-all [num-set]
  (loop [new-set num-set
         cur-set num-set]
       (if (= 0 (count cur-set))  new-set
       (recur (into new-set (map #(* (first cur-set) %) num-set)) (rest cur-set)))))
Run Code Online (Sandbox Code Playgroud)

有没有办法使用doseq而不使用瞬态来做到这一点.像这样的东西:

(let [s #{ 1 2 3}]
 (doseq [outer s]
   (doseq [inner s]
     (let [multiplied (* outer inner)]
      (println (conj s multiplied))
      ))))
Run Code Online (Sandbox Code Playgroud)

我对任何有关更清洁方式的建议感兴趣.

---编辑----这是使用reduce的另一种方式:

(defn multiply-all2 [num-set]
  (let [step (fn [[ result ] mult]
           [(into result (map #(* mult %) num-set))])] …
Run Code Online (Sandbox Code Playgroud)

loops clojure

0
推荐指数
1
解决办法
832
查看次数

标签 统计

clojure ×2

common-lisp ×1

loops ×1

macros ×1