LINUX.ORG.RU

SDL2 && CommonLisp

 , , ,


1

3
После первого запуска,второй запуск происходит с ошибкой.Помогает только перезапуск SLIME.

Код + Backtrace https://pastebin.com/rm2uebkE

Что происходит то?Как починить,ну или скажите как перезапустить SLIME без потери (ql:quickload "sdl2").

У тебя у :quit скобки уехали вниз. Надо так:

:quit () ...
:idle () ...

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

Да, значит со зрением проблемы.

anonymous
()

ПРоверить можно, напечатав из твоего цикла что-нибудь типа:

(print sb-thread:*current-thread*)

НАпечатается что-то типа

#<SB-THREAD:THREAD "repl-thread" RUNNING {100A250033}>

Цифры - это вроде как адрес. Адрес может поменяться при сборке мусора. repl-thread в SLIMe один, а worker-thread-ов может быть много.

Чтобы быть уверенным, заведи переменную, присвой в неё тред при первом запуске, а при последующем сравни со старым значением.

Под CCL пробовал?

den73 ★★★★★
()

Тебе ответ дали в первом комменте. Лисперы все такие тупые?

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

Адрес во время выполнения программы не меняется,так же не меняется при перезапуске функции. Так же,значение переменной остается тем же,что я и присвоил в 1 запуске.Проверил в emacs/sbcl (cli)

CCL сейчас попробую

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

Состояние бывает только у пидоров!

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

Если адрес объекта тред не меняется, то у тебя один и тот же тред в обоих случаях. Хотя я смотрю, там какие-то манипуляции с тредами в самой лисповой библиотеке происходят. Т.е., то, что у тебя один тред сванка, может ни о чём не говорить.

Ты пробовал примеры запускать из исходников? Работают они?

https://github.com/lispgames/cl-sdl2/blob/master/examples/renderer.lisp

den73 ★★★★★
()

У тебя макрос принимает destroy-render за параметер :quit:

(:quit (sdl2:destroy-renderer render)

Офигеть лисперы аутисты. Шел второй день.

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

Скопипастил пример,все работает.Видимо sdl2:with-init надо юзать,иначе деструктор не вызывается (вроде так он работает,да?)

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

Ну,тут я не в теме, как он работает и т.п. Это ты сам исходники посмотри. Я тут чисто методически действую, без конкретики: если оно не работает, то

а) оно действительно не работает б) оно неправильно применено

Пример нужно было запустить только лишь для того, чтобы отличить случаи (а) и (б) между собой.

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

На случай, если отредактирует пост, чтобы каждый мог проверить:

https://pastebin.com/rm2uebkE

Тебе в первом же комменте указали на ошибку и потом еще десять раз напомнили. Идиот, что сказать.

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

Ошибка была не в этом мудила,от :quit (...) ничего не зависит,пропуск нужен обязательно только в :idle () (...)

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

Лол, это не пропуск, это обязательный список параметров. В данном случае пустой.

А значит, как минимум, у тебя (sdl2:destroy-renderer render) просто пропадет, а, как максимум, макрос раскроется в непредсказуемую кашу.

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

Работает только с with-init

(defmacro with-init ((&rest sdl-init-flags) &body body)
  `(progn
     (init ,@sdl-init-flags)
     (unwind-protect
          (in-main-thread () ,@body)
(quit))))
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.