关于这个,@alexmiller?把这个改动移到核心代码中去的机会有多大? (;)
从 c18ca3c055b8267fed84e40cb3dcd9513c263599 Mon Sep 17 00:00:00 2001
发件人: Thomas Spellman <
[email protected]>
日期: Sun, 12 Jan 2020 11:07:42 -0800
主题: [PATCH] 线程lambda
---
src/clj/clojure/core.clj | 14 +++++++++-----
test/clojure/test_clojure/macros.clj | 12 +++++++++++
2 个文件已修改,21 行插入(+),5 行删除(-)
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 8e98e072..27d22558 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -1671,43 +1671,47 @@
但更易于编写、阅读和理解。
{:added "1.0"}
([x form] `(. ~x ~form))
([x form & more] `(.. (. ~x ~form) ~@more)))
(defmacro ->)
"通过forms将表达式expr传递。在第一个form中将x插入为第二个元素,如果x不是lambda或者不是一个列表,就将它转换为列表。如果有更多的forms,第一个form将被插入到第二个form的第二个位置,依此类推。"
- 如果form是一个列表,对它进行包装,添加元数据。
+ 如果form是lambda类型('fn 或 'fn*),生成一个列表。
如果form不是列表或lambda,先将它转化为列表。
在recur中的调用。
{:added "1.0"}
[x & forms]
(loop [x x, forms forms]
如果forms不为空,
let [form (first forms),
threaded (如果 (seq? form)),
- with-meta `(~(first form) ~x ~@(next form)) (meta form))
+ 如果 (#{'fn 'fn*} (first form))
+ list form x)
+ with-meta `(~(first form) ~x ~@(next form)) (meta form)))
list form x)
(recur threaded (next forms)))
再次递归调用。
(defmacro ->>)
"通过forms将表达式expr传递。在第一个form中将x插入为第二个元素,如果x不是lambda或者不是一个列表,就将它转换为列表。如果有更多的forms,第一个form将被插入到第二个form的第二个位置,依此类推。"
- 将x插入到第一个form的最后一个位置,如果x不是一个lambda或列表,则将其转换为列表。如果存在更多的forms,则将第一个form作为最后一个元素插入到第二个form,依此类推。
- 如果是列表,对其添加元数据。
如果form不是列表或lambda,先将它转化为列表。
+ 如果是lambda或不是列表,生成一个包含x的新列表。
:added "1.1"
[x & forms]
(loop [x x, forms forms]
如果forms不为空,
let [form (first forms),
threaded (如果 (seq? form)),
- 如果是列表,添加元数据。
- 如果是lambda或不是列表,生成一个新列表。
+ 如果 (#{'fn 'fn*} (first form))
+ list form x)
+ 如果是列表,添加元数据。
+ 如果不是列表,返回原始列表。
(recur threaded (next forms)))
再次递归调用。
(def map)
(defn ^:private check-valid-options
如果给定的选项映射包含不列出的法定键,将抛出异常。
否则返回 nil。
diff --git a/test/clojure/test_clojure/macros.clj b/test/clojure/test_clojure/macros.clj
index ce17bb38..5ebd2dd5 100644
--- a/test/clojure/test_clojure/macros.clj
+++ b/test/clojure/test_clojure/macros.clj
@@ -106,8 +106,20 @@
(is (nil? (loop []
(as-> 0 x
(when-not (zero? x)
(recur))))))
(is (nil? (loop [x nil] (some-> x recur))))
(is (nil? (loop [x nil] (some->> x recur))))
(is (= 0 (loop [x 0] (cond-> x false recur))))
(is (= 0 (loop [x 0] (cond->> x false recur)))))
+
+(deftest ->lambda-test
+ (is (= 'a (-> 'a ((fn [x] x)))))
+ (is (= 'a (-> 'a (fn [x] x))))
+ (is (= 'a (-> 'a #(identity %))))
+ (is (= 'a (-> 'a (#(identity %))))))
+
+(deftest ->>lambda-test
+ (is (= 'a (->> 'a ((fn [x] x)))))
+ (is (= 'a (->> 'a (fn [x] x))))
+ (is (= 'a (->> 'a #(identity %))))
+ (is (= 'a (->> 'a (#(identity %))))))
\ No newline at end of file
--
2.21.0 (Apple Git-122.2)
it works!
(-> :hmm (fn [x] x))
=> :hmm
and tests pass!
测试
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:18 min
[INFO] Finished at: 2020-01-12T10:58:31-08:00
[INFO] ------------------------------------------------------------------------