2014-11-05 2 views
1

Итак, я реализую функцию, которая получает первые n элементов списка в LISP (Allegro mlisp) для проекта, и я не могу понять, почему я не могу выполнить вычисление вычитания. Я получаюНевозможно вычесть из числа в 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

+1

, и вы можете захотеть изменить свой оператор exit на '(= n 0) nil' – sebs

+0

Общие Lisp требует, чтобы вы вернули свои круглые скобки. Это отличается от других языков, к которым вы могли бы привыкнуть. Скобки меняют смысл вашей программы. Они никогда не являются факультативными или бессмысленными. – sigjuice

ответ

2

У вас слишком много парен!

Это «вычесть 1 из п, и передать результат в качестве первого аргумента get_upto»

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

Но у вас есть это:

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

, который «вычесть 1 из п и используйте результат этого вычисления как функцию, первый аргумент которой равен (cdr cut_list). «

+0

Спасибо! Точно так же, как OCaml, это мелочи в LISP, которые заставляют меня время от времени! – Chris

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