我试图理解为什么我会收到此错误,因为我对lisp相当新。我想创建一个从用户那里获取数字n
的函数,并根据该数字创建最多五个数字的列表。然后该函数获取列表中的第一个数字并将其发送到列表的末尾。
示例
> (my_func 1)
> (2 3 4 5 1)
这是我到目前为止,我能够获得返回列表的函数,但我不确定如何将第一个元素发送到列表的后面。
(defun my_rotate (y)
(labels ((var (list) (loop for i from y to list collect i)))
(var 5) (append (rest list)(list (first list))))
)
答案 0 :(得分:2)
让我们从“正确”格式化代码开始,这样可以更容易地看到代码的结构:
(defun my_rotate (y)
(labels ((var (list)
(loop for i from y to list collect i)))
(var 5)
(append (rest list) ;; This form is not in a lexical context
(list (first list))))) ;; where list is bound
我们可以清楚地看到我们收到错误的原因是因为list
没有绑定,所以本地函数var
实际上并没有用(它被调用,但会抛出值)离开,因为它没有副作用,理论上它可以被优化掉。)
最简单的解决方法是将append
调用移到labels
之外,删除labels
表单,然后将输入参数的名称更改为list
。
答案 1 :(得分:0)
我的问题并不完全清楚,但如果我理解正确,这样的事情应该有效:
(defun my_rotate (y)
(let ((list (loop for i from y to (+ 4 y) collect i))) ;; create the list you want
(append (rest list) (subseq list 0 1)))) ;; move first element to end