gpt4 book ai didi

macros - 如何使用 defmacro 而不是 eval?

转载 作者:行者123 更新时间:2023-12-02 22:03:46 24 4
gpt4 key购买 nike

我想出了下面的函数,它按预期工作,但它使用了 eval,这很糟糕,而且在我打算使用它的 ClojureScript 中不存在。

(defn path [d p]
(eval
(concat '[-> d]
(flatten (map
#(conj (repeat (dec %) 'z/right) 'z/down)
(path-to-vector p))))))

如何将其转换为宏?我的尝试是这样的:

(defmacro path [d p]
`(concat (-> ~d)
(flatten
(map #(conj (repeat (dec %) z/right) z/down)
(path-to-vector ~p)))))

但这显然行不通。

最佳答案

不需要宏或 eval,操作只是一个reduce:

(defn path [d p]
(reduce (fn [s v]
(reduce #(%2 %1) s (conj (repeat (dec v) z/right) z/down)))
d (path-to-vector p)))

另请注意,(conj (repeat (dec %) z/right) z/down) 表示 z/down 然后所有 z/right coz repeate 返回一个序列,以备不时之需所有 z/right 第一个和最后一个项目应该是 z/down 然后你应该使用 (conj (vec (repeat (dec %)) z/right) z/down)

关于macros - 如何使用 defmacro 而不是 eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16444696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com