gpt4 book ai didi

coding-style - Lisp Style 问题标签是否是局部函数?

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

我想知道是否有关于在 Lisp 中使用标签的标准做法。我一直在弄乱这里第一个答案中描述的算法的 Lisp 实现 Generating permutations lazily我当前的版本使用标签来分解部分功能。

(defun next-permutation (pmute)
(declare (vector pmute))
(let ((len (length pmute)))
(if (> len 2)
(labels ((get-pivot ()
(do ((pivot (1- len) (1- pivot)))
((or (= pivot 0)
(< (aref pmute (1- pivot))
(aref pmute pivot)))
pivot)))
(get-swap (pivot)
(let ((swp (1- len)))
(loop for i from (1- len) downto pivot do
(if (or (and (> (aref pmute i)
(aref pmute (1- pivot)))
(< (aref pmute i) (aref pmute swp)))
(< (aref pmute swp) (aref pmute (1- pivot))))
(setf swp i)))
swp))
(next (swp pivot)
(rotatef (aref pmute (1- pivot)) (aref pmute swp))
(reverse-vector pmute pivot (1- len))))
(let ((piv (get-pivot)))
(if (> piv 0)
(next (get-swap piv) piv)
nil))))))

由于每个标签只被调用一次,我想知道这是否被认为是不好的做法,因为在这种情况下这样做的唯一原因是出于美学原因。我认为带有标签的当前版本更清晰,但这可能违背了我不知道的常识,因为我是 Lisp 的新手。

最佳答案

不,没关系。编写命名函数可以使代码更加自文档化和更加模块化。

有时我还会列出函数 arglist 中使用的所有变量,而不使用封闭函数中的变量。这使界面更清晰一些,并有助于在代码中移动函数(如有必要)。

本地函数还提供了添加本地文档字符串和接口(interface)描述的可能性。

如果局部函数变得太大并且它们也可能在外部使用,那么我会将它们提取出来并使它们成为全局函数。

关于coding-style - Lisp Style 问题标签是否是局部函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2403484/

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