繁体   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