2014-11-02 72 views
0

我想編寫一個類似於mapcar的函數,但它將函數映射到一系列數字上。函數必須從開始到結束或結束迭代,具體取決於哪個更大。是的,這是針對一個班級的,但我不是在尋找代碼,只是提示如何實現這一點。我被告知先計算迭代器,但不使用let。除了使用let之外,還有另外一種更有效的方法來聲明和使用局部變量嗎?這裏是我的代碼:LISP - 在循環之前計算動態迭代器不會讓

(defun mapnum (fun start end) 
    (cond 
    ((< start end) 
    (loop for x from start to (- end 1) 
     collect (funcall fun x))) 
    ((> start end) 
    (loop for x from start downto (+ end 1) 
     collect (funcall fun x))) 
    (t nil))) 

感謝您的幫助提前。

回答

2

我會利用signum函數來知道我應該增加還是減少。

(defun mapnum (func start end) 
    (do ((i start) 
     (j end (+ j (signum (- start end)))) 
     (res nil)) 
    ((equal i j) res) 
    (setf res (cons (funcall func j) res)))) 

編輯:修改代碼以避免追加到列表的末尾。

+1

追加到列表的末尾是不好的。 – 2014-11-02 19:14:46

+0

事實上,我會修改代碼。 – turingcomplete 2014-11-02 19:15:53

+0

非常感謝 – angerboy 2014-11-02 19:32:33