Coding style Lisp风格的问题标签本地函数与否?

Coding style Lisp风格的问题标签本地函数与否?,coding-style,lisp,common-lisp,Coding Style,Lisp,Common Lisp,我想知道是否有一个关于在Lisp中使用标签的标准实践。我一直在胡思乱想第一个答案中描述的算法的Lisp实现 我的当前版本使用标签来划分部分功能 (defun next-permutation (pmute) (declare (vector pmute)) (let ((len (length pmute))) (if (> len 2) (labels ((get-pivot () (do ((pivot (1- le

我想知道是否有一个关于在Lisp中使用标签的标准实践。我一直在胡思乱想第一个答案中描述的算法的Lisp实现 我的当前版本使用标签来划分部分功能

(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))))))
(定义下一个置换(pmute)
(申报(矢量pmute))
(let((len(长度pmute)))
(如果(>len 2)
(标签((获取轴)()
(do((枢轴(1-透镜)(1-枢轴)))
((或(=轴0)
(<(aref pmute(1-枢轴))
(aref pmute枢轴)
轴心)
(获取交换(透视)
(let((swp(1-len)))
(i从(1-透镜)向下循环到轴do
(如果(或)和(>(aref pmute i)
(aref pmute(1-枢轴)))
(<(aref pmute i)(aref pmute swp)))
(<(aref pmute swp)(aref pmute(1-枢轴)))
(setf swp i)
swp)
(下一个(swp枢轴)
(旋转(aref pmute(1-枢轴))(aref pmute swp))
(反向向量pmute枢轴(1-len)))
(让((piv(获取轴)))
(如果(>piv 0)
(下一个(获取交换piv)piv)
无(()())()))

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

不是Lisp新手,我认为你做的是正确的:通过命名块来提高代码的可读性。

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

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

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


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

我看不出有什么不好的地方。您正在使这两个子流程非常清晰且易于组块,从而可以通过查看主体快速了解函数的实际功能。如果需要,现在也可以很容易地将内部函数升级为全局函数。

如果函数不需要相互(或自身)引用,则可以使用
flet
而不是
标签。这样做除了向阅读代码的其他人传达额外的信息之外,还有什么好处吗?可能没有。但是,请记住,您应该为下一个阅读代码的人编写代码,编译器/解释器不是您的主要读者。