(ffi:clines " #include SDL_Renderer *renderer; SDL_Window *window; SDL_Event e; const Uint8 *state; int mx, my; Uint32 mdown; int quitted; ") (Defpackage "jam-no-theme" (:use cl) (:nicknames :ja)) (in-package :ja) (defmacro game (shared-vars shared-declares &rest update-closures) `(let ,shared-vars (declare ,@shared-declares) (ffi:c-progn () " if (SDL_Init(SDL_INIT_VIDEO) < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Failed to init %s\", SDL_GetError()); " (error "failed to SDL_Init(video)") " } if (SDL_CreateWindowAndRenderer(640,480,SDL_WINDOW_RESIZABLE, &window, &renderer)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Failed to create w & r%s\", SDL_GetError()); " (error "failed to create window and renderer") " } quitted = 0; for (;;) {" " while(SDL_PollEvent(&e)) if (e.type == SDL_QUIT) quitted = 1; else if (e.type == SDL_KEYDOWN) switch (e.key.keysym.sym) { case SDLK_q: quitted = 1; break; } if (quitted) break; mdown = SDL_GetMouseState(&mx, &my); " " SDL_SetRenderDrawColor(renderer, 0, 10, 20, 255); SDL_RenderClear(renderer);" ,@(loop for clos in update-closures collect `(funcall ,clos)) " SDL_RenderPresent(renderer); SDL_Delay(25); " "} SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit();"))) (defun play () (game () ()))