2017-02-11 6 views
1

Я пытаюсь понять, почему я получаю эту ошибку, поскольку я довольно новичок в 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

Ваш вопрос не совсем ясно для меня, но если я правильно понимаю, что-то, как это должно работать:

(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 
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.

Смежные вопросы