在Clojure中通过“let”列表循环?

时间:2013-01-13 20:15:08

标签: clojure let

如果我有一个未知数量的参数,我想用“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]

所以基本上: 我希望有一个功能:

  • 将参数绑定到某种形式的列表,例如:[a b]
  • 打印“omg no way!”)       - 不应该是循环的一部分,只应在函数
  • 中打印一次
  • 某种类似循环的循环,循环遍历“let-list”所以它会:“a,是一个数字?不,是b数?是的,打印”咆哮“

输出: 没有办法 轰鸣

再一次: 我想知道是否有办法访问函数内部的let关键字。正如for循环所示,我想访问每个单独的元素并使用元素执行操作。如果我使用(对于[x arguments]而言,它会给出: 没有办法, 怒吼 怒吼 (因为b与55绑定所以它是一个数字,但55也是一个数字,但是没有必要使用55,因为55已经与b绑定了)

1 个答案:

答案 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宏是指在其创建的代码中引入名称的任何宏,这些代码在传递给它的代码中不存在。