2014-11-05 56 views
1

因此,我正在實現一個函數,該函數獲取LISP(Allegro mlisp)中列表的前n個元素,並且我似乎無法弄清楚爲什麼我無法進行減法計算。我不斷收到無法從LISP中的數字中減去?

我對這種方法的代碼,它編譯聽者精細

(defun get_upto (n cut_list) 
(if (= n 0) cut_list 
    (cons (car cut_list) (get_upto ((- n 1) (cdr cut_list)))))) 

但如果我嘗試執行

$: (get_upto 3 '(1 2 3 4 5))

我得到的錯誤

Error: Illegal function object: (- n 1)

我在這裏做錯了什麼?我在傳遞一個數字,並且在檢查n = 0時沒有問題。

+1

在最後一行中有許多圓括號,它爲什麼認爲你想要我們e( - n 1)作爲函數。 – sebs 2014-11-05 04:55:25

+1

並且您可能希望將退出語句更改爲'(= n 0)nil' – sebs 2014-11-05 05:02:17

+0

Common Lisp要求您使括號正確。這與您可能習慣的其他語言不同。圓括號改變程序的含義。它們從不是可選的或無意義的。 – sigjuice 2014-11-05 17:23:01

回答

2

您有太多的參數!

這是 「與n減去1,並將結果傳遞作爲第一個參數get_upto

(get_upto (- n 1) (cdr cut_list)) 

但是你有這樣的:

(get_upto ((- n 1) (cdr cut_list))) 

這是「與n減去1使用該計算的結果作爲函數,其第一個參數是(cdr cut_list)

+0

謝謝!就像OCaml一樣,它在LISP中的小東西讓我時不時地瞭解它! – Chris 2014-11-05 05:43:33