Lisp 代码向我抛出一个错误:空格是冒号后面的非法字符。

Lisp 代码向我抛出一个错误:空格是冒号后面的非法字符。,lisp,Lisp,排序代码,这基本上是我从这一个翻译: insertion(A) for i from 2 to n j=i-1 while (j>=1) AND (A[j]>A[j+1])do t=A[j+1] A[j+1]=A[j] A[j]=t j=j-1 我对lisp的翻译是 (defun insertion (unsorted-vector) (let ((vector (copy-se

排序代码,这基本上是我从这一个翻译:

insertion(A)
  for i from 2 to n
      j=i-1
      while (j>=1) AND (A[j]>A[j+1])do
         t=A[j+1]
         A[j+1]=A[j]
         A[j]=t
         j=j-1
我对lisp的翻译是

(defun insertion (unsorted-vector)
  (let ((vector (copy-seq unsorted-vector))
        (n (length unsorted-vector)))
    (loop :for i : from 2: below (n)
      :do ((j (- i 1))
        (loop :do (AND (>= (j 1))
                       (> (aref vector j) (aref vector (+ j 1))))
                  (rotatef (aref vector j) (aref vector (+ j 1))) 
                  (j (- j 1))))
    vector)))

(insertion #(5 1 3 2))

但它给了我一条信息:读取时出错:#\Space是冒号后面的非法字符。我不明白这是什么意思,也不知道代码中是否还有其他错误。

因为有空格。看看你的代码,你应该写
:from
或者仅仅是
from
,而不是
:from
,下面的
也是一样

(defun insertion (unsorted-vector)
  (let ((vector (copy-seq unsorted-vector))
        (n (length unsorted-vector)))
    (loop :for i : from 2: below (n) ;; your problem
;;;             ^^^     ^^^          ;; <= is here
;;; Change to :from and :below 
      :do ((j (- i 1))
        (loop :do (AND (>= (j 1))
                       (> (aref vector j) (aref vector (+ j 1))))
                  (rotatef (aref vector j) (aref vector (+ j 1))) 
                  (j (- j 1))))
    vector)))
(定义插入(未排序向量)
(let((向量(复制顺序未排序向量))
(n(长度未排序向量)))
(循环:对于i:from 2:below(n);;您的问题

(>(aref向量j)(aref向量(+j1)))
(旋转因子(aref向量j)(aref向量(+j1)))
(j(-j1)))
(向量)

这里还有许多其他问题:
n
不是函数,
j
不是函数,
j
未定义,您似乎从未使用
表单的返回值。不要试着做语法翻译,试着理解你在做什么。这正是我想说的(在我现在删除的答案中),但我不认为
循环
的语法(至少在公共Lisp中;OP没有说他们使用的方言)使用关键字。@ChrisJester-Young:您可以使用任何包中的符号,即使是关键字包。CL只查看循环关键字的名称,而不查看包。这很好:
(loop foo::for i:in'(1 2 3)bar::do(print i))
,因为foo和bar是包。因此,错误无论如何不在循环中,但s表达式已经错了。@Rainer谢谢!今天学到了一些新东西。不过我还是要说,将它们视为关键字或可选的包符号似乎是不符合实际的。@ChrisJester-Young:循环语句中的关键字在新代码中并不少见(过去十年;-)。在旧代码中,这种情况曾经很少见。我不用,但我老了