如果我有一个未知数量的参数,我想用“let”绑定到彼此,如:
let [a "hello" b 55 ]
如果我将let绑定到函数/宏或类似的内部并且我想循环遍历列表,我该怎么做?
请注意,在let中有4个元素,但我只想循环遍历“keys”。使用的一个示例可以是检查绑定到键的值是否是像b这样的数字,即55
编辑:举个例子: 请注意,以下内容非常简单,但它仅用于解释问题:
(defn func [& arguments]
(let [ ~arguments] ((println "omg no way!") (for [x let-list] (number? x (println "roar") )))
输入: (func [a“hello”b 55]
所以基本上: 我希望有一个功能:
输出: 没有办法 轰鸣
再一次: 我想知道是否有办法访问函数内部的let关键字。正如for循环所示,我想访问每个单独的元素并使用元素执行操作。如果我使用(对于[x arguments]而言,它会给出: 没有办法, 怒吼 怒吼 (因为b与55绑定所以它是一个数字,但55也是一个数字,但是没有必要使用55,因为55已经与b绑定了)
答案 0 :(得分:1)
这是一个宏的示例,它采用交替名称和值的列表,在let中绑定它们然后通过引入一个名为'的符号来保存它刚刚创建的绑定的地图 locals'将本地名称的地图命名为local-values。
(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))
任何使用anaphoric-let
调用的表达式都可以使用locals
名称中的值。
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")
或:
user> (anaphoric-let [a 1 b 2 c 3 d 4 e "cat"]
(println "omg no way!")
(dorun (for [x (vals locals)]
(if (number? x) (println "roar")))))
omg no way!
roar
roar
roar
roar
nil
ps:anaphoic宏是指在其创建的代码中引入名称的任何宏,这些代码在传递给它的代码中不存在。