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:循环语句中的关键字在新代码中并不少见(过去十年;-)。在旧代码中,这种情况曾经很少见。我不用,但我老了