2017-02-11 82 views
1

我想理解爲什麼我會得到這個錯誤,因爲我是相當新的lisp。我想創建一個函數,該函數從用戶處獲取數字n,並根據該數字創建最多五個數字的列表。該功能然後將列表中的第一個數字發送到列表的末尾。爲什麼我變量'list'沒有價值?

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

相關問題