LINUX.ORG.RU

Проблемы со стэком в Lisp


0

0

(defmacro bla ( a b )
   .....
   (bla a1 b1))
(bla aa bb)
Макро с рекурсией. Один Работает хорошо.
Делаю:

(defun lala (a b)
   ......
   (bla d f))
Ошибка при компиляции:

Control stack exhausted (no more space for function call frames).
 This is probably due to heavily nested or infinitely recursive
 function calls, or a tail call that SBCL cannot or has not optimized
 away.

Отдельно макро работает хорошо, бесконечной рекурсии не может быть.
Что ещё может быть ? и как бороться ?
anonymous
Ответ на: комментарий от Begemoth

А кстати можно увидеть минимальный пример кода вызывающего такую ошибку? Что за макро там у тебя?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Да смотрел. Нармально расширяется и работает нормально отдельно. ТОка в ф-ции такое вылазит.

anonymous
()
Ответ на: комментарий от anonymous

> or a tail call that SBCL cannot or has not optimized away.

вот этого у тебя там нет?

Begemoth ★★★★★
()

Дай упрощенный пример, приводящий к такой же ошибке. Без кода -- темный лес с этими bla и lala :)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

(defmacro lala (list-la func)
  (setf c-st (first (eval list-la))
	 n-st (cdr (eval list-la))
	 fun-in (eval func))
  `(cond ((eq crr (cadr ,c-st))
       (print "lalala"))
      (t (if n-st (lala n-st fun-in)))))
(setf crr 'S1)
(setf func1 'F1)
list-la - список списков.
Вот такой незамасловатый макро. 
(lala list1 func1) - всё прекрасно

(defun blabla ()
   (lala list-la func1)) - ошибка при компиляции

anonymous
()
Ответ на: комментарий от anonymous

Сорри очепятка произошла:

(defun blabla ()
   (lala list1 func1)) - ошибка при компиляции
list1 вместо list-la, например, (setf list1 list-la)...

anonymous
()
Ответ на: комментарий от anonymous

> Ну а как же ? Макро ведь получает имена, а не значения...

Ты как-то очень криво используешь макры... И передача куда-либо имён, а не самих переменных, тоже выглядит криво и непонятно зачем (это я про предыдущие примеры).

Почему бы тебе просто не подставлять аргументы в макрах? А-ля

(defmacro m1 (a1 a2) (my-code ... `(my-next-code ... ,a1 ,a2)...))

И любая обработка аргументов макры должна быть после "`", а не до, если только не задано строго, что аргументы - конкретные значения, а не переменные или выражения.

P.S. Извини, но складывается впечатление, что ты не видел ни одной толковой книги по CL.

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.