循环通过一个;让我们-在Clojure中列出?
如果我有一个未知数量的论点,我想用一个“let”相互绑定,比如: 如果我将let绑定到函数/宏或类似的函数/宏中,并希望循环遍历列表,我将如何执行此操作 请注意,在let中有4个元素,但我只想循环遍历“键”。例如,可以检查绑定到键的值是否是像b这样的数字,即55 编辑:例如: 请注意,以下内容非常不完整,但仅用于解释问题:循环通过一个;让我们-在Clojure中列出?,clojure,let,Clojure,Let,如果我有一个未知数量的论点,我想用一个“let”相互绑定,比如: 如果我将let绑定到函数/宏或类似的函数/宏中,并希望循环遍历列表,我将如何执行此操作 请注意,在let中有4个元素,但我只想循环遍历“键”。例如,可以检查绑定到键的值是否是像b这样的数字,即55 编辑:例如: 请注意,以下内容非常不完整,但仅用于解释问题: (defn func [& arguments] (let [ ~arguments] ((println "omg no way!") (for [x let-
(defn func [& arguments]
(let [ ~arguments] ((println "omg no way!") (for [x let-list] (number? x (println "roar") )))
输入:
(func[a“你好”b 55]
所以基本上:
我想要一个函数:
- 将参数绑定到某种形式的列表,如:[a b]
- 打印“天哪,不行!”) -不应是循环的一部分,只应在函数中打印一次
- 某种循环,比如一个for循环,在“let list”中循环,它会这样说:“a,是一个数字吗?不,是b号吗?是的,打印“roar”
(因为b与55绑定,所以它是一个数字,但55也是一个数字,但没有必要使用55,因为55已经绑定到b)以下是一个宏示例,该宏获取交替名称和值的列表,将它们绑定到let中,然后通过引入一个名为“locals”的符号来保存刚创建的绑定映射,该符号将本地名称映射到本地值
(defmacro anaphoric-let [alternating-symbols-and-values & body]
`(let [~@alternating-symbols-and-values
names# (quote ~(flatten (partition 1 2 alternating-symbols-and-values)))
values# ~(vec (flatten (partition 1 2 alternating-symbols-and-values)))
~'locals (zipmap names# values#)]
~@body))
使用回指let
调用的任何表达式都将能够使用局部变量
名称中的值
user> (anaphoric-let [a 1 b 2 c 3 d 4] [a locals])
[1 {d 4, c 3, b 2, a 1}]
在使用let定义值之后和在主体之前将其保存在映射中对于防止多次执行和不卫生宏的其他罪恶非常重要
然后可以使用此地图根据当地人做出决策:
user> (anaphoric-let [a 1 b 2 c 3 d 4 e "cat"]
(map (fn [[local val]]
(str local " is " (if (number? val) val "woof")))
locals))
("e is woof" "d is 4" "c is 3" "b is 2" "a is 1")
或:
ps:anaphoic macros是在创建的代码中引入名称的任何宏,该名称在传递给它的代码中不存在。下面是一个宏的示例,该宏采用交替名称和值的列表,将它们绑定到let中,然后通过引入一个名为“locals”的符号来保存刚创建的绑定映射,该符号命名本地名称到本地值的映射
(defmacro anaphoric-let [alternating-symbols-and-values & body]
`(let [~@alternating-symbols-and-values
names# (quote ~(flatten (partition 1 2 alternating-symbols-and-values)))
values# ~(vec (flatten (partition 1 2 alternating-symbols-and-values)))
~'locals (zipmap names# values#)]
~@body))
使用回指let
调用的任何表达式都将能够使用局部变量
名称中的值
user> (anaphoric-let [a 1 b 2 c 3 d 4] [a locals])
[1 {d 4, c 3, b 2, a 1}]
在使用let定义值之后和在主体之前将其保存在映射中对于防止多次执行和不卫生宏的其他罪恶非常重要
然后可以使用此地图根据当地人做出决策:
user> (anaphoric-let [a 1 b 2 c 3 d 4 e "cat"]
(map (fn [[local val]]
(str local " is " (if (number? val) val "woof")))
locals))
("e is woof" "d is 4" "c is 3" "b is 2" "a is 1")
或:
ps:anaphoic macros是在创建的代码中引入名称的任何宏,该名称在传递给它的代码中不存在。听起来像是
loop
和recur
:Forms--(loop[bindings*]exprs*)一个输入和输出的例子在这里会有很大的帮助。这看起来像是使用映射可以更好地实现的。但是我同意@Arthurlfeldt的观点,一个带有上下文的例子确实可以帮助我们。看起来你想要的是(映射秒(分区2参数))
。听起来您想要的是循环
和重复
:表单--(循环[bindings*]exprs*)一个输入和输出的例子在这里会有很大的帮助。这看起来像是使用映射可以更好地实现的。但是我同意@Arthurlfeldt的观点,一个带有上下文的例子确实可以帮助我们。看起来你想要的是(映射秒(分区2参数))
。