gpt4 book ai didi

macros - 如何使用 defmacro 简化一些代码

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:00 25 4
gpt4 key购买 nike

我写了两个这样的函数,但是正如你所看到的,它们的大部分是相同的,所以我想写一个宏来简化它们。

我看懂了教科书上的简单宏示例,但我不知道如何编写自己的示例。

这是我的代码:

 (defn load-dict
; "Load database from a txt file previous saved"
[fname]
(with-open [rdr (io/reader fname)]
(doseq [line (line-seq rdr)]
(println line)
(def vvv (clojure.string/split line #"\s"))
;(println (str "count of vvv is " (count vvv)))
(if (< 1 (count vvv))
(add- dict (gen-word (nth vvv 0) (nth vvv 2) (nth vvv 1))))
)))
(defn load-article
; "Load article from a txt file"
[fname]
(with-open [rdr (io/reader fname)]
(doseq [line (line-seq rdr)]
(println line)
(def vvv (clojure.string/split line #"\s"))
;(println (str "count of vvv is " (count vvv)))
(if (< 1 (count vvv))
(add- article vvv ))
)))

我应该写一个像这样的宏吗:

(defmacro load- [target fname &expr)
`(...
(add- ~target expr)))

我其实不知道怎么写这样的宏。我只是讨厌重复的代码。

PS,牵引功能工作正常。我不关心变量,这是代码的一部分。

最佳答案

我会使用 let block 而不是 def。使用 def 将绑定(bind)一个 var 并在您的命名空间中定义 vvv。真的不需要宏。您可以像这样简化代码:

(defn load-from
"Load database from a txt file previous saved"
[fname load-fn]
(with-open [rdr (io/reader fname)]
(doseq [line (line-seq rdr)]
(println line)
(let [vvv (clojure.string/split line #"\s")]
(when (< 1 (count vvv))
(load-fn vvv))))))

然后像这样调用它

(load-from "myfile.txt" #(add- dict (apply gen-word (take 3 %))))
(load-from "myfile.txt" #(add- article %))

关于macros - 如何使用 defmacro 简化一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951031/

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