簡體   English   中英

使用 for 循環在宏中運行主體與在主體上映射 `exec' 之間的區別

[英]Difference between using a for loop to run a body in a macro versus mapping `exec' over the body

在以下代碼中使用(map exec ~body)(for [node ~body] node)有什么區別?

(defmacro with-cwd [dir #* body]
          `(let [ cwd (.cwd Path) ]
               (try (.chdir os ~dir)

                    ;; Should I use this?
                    (map exec ~body)

                    ;; Or this?
                    (for [node body] node)

                    ;; UPDATE: Or this...
                    (do ~@body)

                    ;; UPDATE: Or this?
                    ~@body

                    (finally (.chdir os cwd)))))

哪個更安全,或者它們都好嗎? exec()似乎不再運行代碼字符串了,我相信這在Python 3中已經改變了,所以現在可以了嗎? 我只是想使用更簡潔的東西; 我不擅長命名變量。

更新:我也剛剛意識到(do ~@body)也是一種選擇,這似乎是大多數人所做的; 那和簡單地做~@body有什么區別?

使用(map exec ~body)(for [node ~body] node)有什么區別

map收集結果,而for忽略它們。 exec運行一串 Python 代碼或 Python 代碼對象,因此無論body的返回值是什么,它都可能不會做任何有用的事情。

exec()似乎不再運行代碼字符串

確實如此。 你必須閱讀文檔,我的男人。

(do ~@body)也是一個選項,這似乎是大多數人所做的; 那和簡單地做~@body有什么區別?

在這個位置,什么都沒有,因為try已經按順序計算了它的主體形式並返回最后一個,就像do

暫無
暫無

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

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