我为什么要变量' list'没有价值?

时间:2017-02-11 01:07:43

标签: list lisp common-lisp clisp

我试图理解为什么我会收到此错误,因为我对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))))
)

2 个答案:

答案 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