尝试将C转换为Lisp



我正在尝试将此代码转换为lisp代码。但不知道怎么做对吗?

for (j=i-1; j>=0 && list[j]>key; j--) {
list[j+1] = list[j];
}
(loop (set j (- i 1))
(setq (aref x(+ j 1) (aref x j))
(setq j (- j 1)
(when (or(>= j 0)
(> (aref x j) key)
(return-from foo 0))

最直接的方法是使用扩展的loop:

(loop :for j :downfrom (1- i)
:while (and (not (minusp j))
(> (aref list j) key))
:do (setf (aref list (1+ j))
(aref list j)))

(注意:我更喜欢使用关键字作为循环关键字,因为这给了我免费的语法高亮显示。你经常会发现它们是纯符号,例如for而不是:for。(

虽然这不是逐字翻译,但我可能会选择这样的东西:

(let* ((data (vector 1 2 3 4 5 6 7 8 9))
(key 3)
(pos (or (position-if (lambda (x) (<= x key)) data :from-end t)
0)))
(setf (subseq data (1+ pos))
(subseq data pos))
data)

在我看来更像CL风格。

最新更新