关于这个,@alexmiller?把这个改动放入核心的可能性有多大? ;)
From c18ca3c055b8267fed84e40cb3dcd9513c263599 Mon Sep 17 00:00:00 2001
From: Thomas Spellman <
[email protected]>
Date: Sun, 12 Jan 2020 11:07:42 -0800
Subject: [PATCH] 线程lambda表达式
---
src/clj/clojure/core.clj | 14 +++++++++-----
test/clojure/test_clojure/macros.clj | 12 ++++++++++++
2 files changed, 21 insertions(+), 5 deletions(-)
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 ->
"通过表单对表达式进行线程处理。将x插入第一个表单的第二个位置,如果x不是一个列表,则将其转换为列表。如果还有更多表单,则将第一个表单插入第二个表单的第二个位置,依此类推。"
- 第二个元素在第一个表单中,如果它是一个lambda或者不是一个列表,则将其转换为列表。
+ 第二个元素在第一个表单中,如果它是一个lambda或者不是一个列表,则将其转换为列表。
[x & forms]
(loop [x x, forms forms]
{:added "1.0"}
(if forms
threaded (if (seq? form)
- (with-meta `(~(first form) ~x ~@(next form)) (meta form))
+ (if (#{'fn 'fn*} (first form))
+ (list form x)
+ (with-meta `(~(first form) ~x ~@(next form)) (meta form)))
- (list form x))]
-
+
-
-
x)))
(defmacro ->>
"通过表单对表达式进行线程处理。将x插入第一个表单的第二个位置,如果x不是一个列表,则将其转换为列表。如果还有更多表单,则将第一个表单插入第二个表单的第二个位置,依此类推。"
- 最后一个元素在第一个表单中,如果它是一个lambda或者不是一个列表,则将其转换为列表。
+ 最后一个元素在第一个表单中,如果它是一个lambda或者不是一个列表,则将其转换为列表。
[x & forms]
{:added "1.1"}
- (with-meta `(~(first form) ~@(next form) ~x) (meta form))
(if forms
threaded (if (seq? form)
- (with-meta `(~(first form) ~x ~@(next form)) (meta form))
+ (if (#{'fn 'fn*} (first form))
+ (list form x)
- (list form x))]
-
- (list form x))]
-
-
+
-
x)))
(定义 map)
(定义私有函数 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))))
+
+
+(运行测试 ->lambda-test
空格空格(is (= 'a (-> 'a ((fn [x] x)))))
空格空格(is (= 'a (-> 'a (fn [x] x))))
空格空格(is (= 'a (-> 'a #(identity %))))
+
空格空格(is (= 'a (-> 'a (#(identity %))))))
+
+(运行测试 ->>lambda-test
空格空格(is (= 'a (->> 'a ((fn [x] x)))))
空格空格(is (= 'a (->> 'a (fn [x] x))))
空格空格(is (= 'a (->> 'a #(identity %))))
--
空格空格(is (= 'a (->> 'a (#(identity %))))))
文件末尾没有换行符
2.21.0 (Apple Git-122.2)
成功了!
(> :hmm (fn [x] x))
=> :hmm
并且测试通过!
测试
[INFO] 执行了任务
测试
[INFO] ------------------------------------------------------------------------
[INFO] 构建成功
测试