簡體   English   中英

遍歷Clojure中的“ let”列表?

[英]Looping through a “let”-list in Clojure?

如果我想使用“ let”將彼此綁定的參數數量未知,例如:

let [a "hello" b 55 ]

如果我將let綁定在一個函數/宏或類似對象內,並且想遍歷列表,我該怎么做?

請注意,在let中有4個元素,但我只想遍歷“鍵”。 一個使用示例是檢查鍵綁定的值是否是像b這樣的數字,即55

編輯:作為一個示例:請注意,以下內容非常混亂,但僅用於解釋問題:

(defn func [& arguments] 
 (let [ ~arguments] ((println "omg no way!") (for [x let-list] (number? x (println "roar") )))

輸入:(func [a“ hello” b 55]

所以基本上:我想有一個功能,它:

  • 將參數綁定到某種形式的列表,例如:[ab]
  • 打印“ omg no way!”)-不應該是循環的一部分,應該只在函數中打印一次
  • 類似於for循環的某種循環,它循環遍歷“ let-list”,因此它會運行:“ a,是數字嗎?否,b是數字嗎?是,打印“咆哮”

輸出:omg沒辦法吼

再次: 我想知道是否有一種方法可以訪問函數內部的let內部的關鍵字。 如for循環所示,我想訪問每個單獨的元素並對該元素進行操作。 如果我使用了(對於[x參數],它會給出:omg絕不,吼吼(因為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))

使用with 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:厭音宏是將名稱引入其創建的代碼中的任何宏,該名稱在傳遞給它的代碼中不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM