2017-02-01 6 views
1

У меня возникла проблема с записью функции LISP. Функция определяется какс использованием COND по необязательным аргументам в общем lisp

(defun foo (arg1 &optional cont)) 
    (cond ((null arg1) nil) 
     ((= 0 cont) arg1) 
     ((do_something)) 
     ((recursive call)))) 

Когда я вызвать функцию с cont все работает отлично, но когда я называю это только с arg1 ошибки возвращаемые:

Error: in ZEROP of (NIL) arguments should be of type NUMBER 

Я предполагаю, что-то не так в условие ((= 0 cont) arg1), вы можете помочь мне решить эту проблему? Thanks

+1

Если вы хотите узнать, предоставлен ли дополнительный аргумент, вы можете сделать это: '(defun foo (arg1 & optional (cont nil contp))' ... например – tfb

+1

Кстати, сообщение об ошибке, похоже, указывает на то, что вызов '=' был заменен вызовом 'zerop' компилятором. –

ответ

7

Функция =, а также некоторые другие, ожидают только цифры.

Вам необходимо использовать EQL или более общее сравнение равенства (равное, equalp), если вы ожидаете, что NIL будет действительным входом; здесь ожидается NIL, поскольку это значение по умолчанию необязательного аргумента.

Вы также мог бы обеспечить численное значение по умолчанию cont:

... &optional (cont 0) ... 

... что может быть правильным подходом, если cont не имеет никаких оснований, чтобы быть ничем иным, кроме числа.

+0

Большое спасибо, проблема решена. –

+1

Альтернатива:' cond'ition может быть '(и (numberp cont) (= 0 cont)) 'if' cont' может иметь повод не быть числом. –

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

  • Нет связанных вопросов^_^