The trio the author decided on 2026-09-20 is now all built: def is CL's defparameter — its initialiser runs on every daemon re-run, unguarded, so an edited initialiser repaints the same storage on C-c C-c plus re-run — defonce (Clojure's name for CL's defvar, per the author) initialises once behind the .init~once. flag, and defconst stays the image. One parse arm reads both forms; the difference is Ast.reinit, carried to Tast.global's grerun. Emit.startup_plan gives a def no guard flag, and Check.check_global lifts every def initialiser — zero and literal included — into global/<n>, so the host's startup reaches it through the function cell and a re-evaluated def swaps it (Session's def_inits; Emit.redefinition declares the cell for a non-sibling target). The old defvar spelling is refused with the rename and both compiling spellings, and every program, test, doc and editor list is swept — except sand.flan, the author's live WIP, whose seven defvar lines are flagged in FIX.org and keep its three dependent tests red on this branch.
67 lines
2.8 KiB
Plaintext
67 lines
2.8 KiB
Plaintext
;;;; raylib [core] example - window should close
|
|
;;;;
|
|
;;;; examples/core/core_window_should_close.c. Needed set-exit-key, and one
|
|
;;;; enum member to go with it: raylib.flan's `Key` now has `null 0`, read off
|
|
;;;; KEY_NULL in raylib.h. The binding is hand-written rather than taken from
|
|
;;;; the generated half because the Flan face differs — raylib declares
|
|
;;;; `void SetExitKey(int key)` and the generated line therefore takes an i32,
|
|
;;;; where this one takes a Key, so `(rl/set-exit-key :key-null)` is checked
|
|
;;;; against the enum and `:nul` is a compile error instead of a 0.
|
|
;;;;
|
|
;;;; The whole example is about what window-should-close? means. It is not a
|
|
;;;; flag raylib latches: it is "the close button was clicked, or the exit key
|
|
;;;; is down", recomputed each frame, and it goes back to false on its own.
|
|
;;;; That is what lets this program ask for confirmation and then carry on —
|
|
;;;; and it is also why the loop is driven by a `defonce` of its own rather
|
|
;;;; than by the predicate, which is the one structural difference from every
|
|
;;;; other example in this directory.
|
|
;;;;
|
|
;;;; `(set-exit-key :null)` takes ESC away from raylib so the program can read
|
|
;;;; it itself. The window's X button still works and is still what
|
|
;;;; window-should-close? reports.
|
|
|
|
(import rl "vendor:raylib")
|
|
|
|
(defconst screen-width 800)
|
|
(defconst screen-height 450)
|
|
|
|
(defonce exit-requested bool)
|
|
(defonce exiting bool)
|
|
|
|
(defn main [] ()
|
|
(rl/init-window screen-width screen-height
|
|
"raylib [core] example - window should close")
|
|
(defer (rl/close-window))
|
|
|
|
;; No key closes the window any more. ESC is an ordinary key from here on.
|
|
(rl/set-exit-key :key-null)
|
|
|
|
(rl/set-target-fps 60)
|
|
|
|
(until exiting
|
|
;; Update. Either way of asking to leave raises the question; only Y and N
|
|
;; answer it. window-should-close? is false again on the next frame, so
|
|
;; the request has to be remembered in a variable.
|
|
(when (or (rl/window-should-close?) (rl/key-pressed? :key-escape))
|
|
(set exit-requested true))
|
|
|
|
;; The C's `if (Y) ... else if (N) ...`, which is an `if` with a `when`
|
|
;; in its else and not a `cond`: a `cond` needs an `:else` arm and there
|
|
;; is nothing to do when neither key was pressed.
|
|
(when exit-requested
|
|
(if (rl/key-pressed? :key-y)
|
|
(set exiting true)
|
|
(when (rl/key-pressed? :key-n) (set exit-requested false))))
|
|
|
|
;; Draw
|
|
(rl/with-drawing
|
|
(rl/clear-background rl/raywhite)
|
|
|
|
(if exit-requested
|
|
(do
|
|
(rl/draw-rectangle 0 100 screen-width 200 rl/black)
|
|
(rl/draw-text "Are you sure you want to exit program? [Y/N]" 40 180 30
|
|
rl/white))
|
|
(rl/draw-text "Try to close the window to get confirmation message!"
|
|
120 200 20 rl/lightgray)))))
|