flan/examples/core-input-mouse-wheel.flan
Joseph Ferano a4c6b996ff def re-runs its initialiser, and defvar is renamed defonce
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.
2026-09-21 07:12:04 +07:00

55 lines
2.0 KiB
Plaintext

;;;; raylib [core] example - input mouse wheel
;;;;
;;;; examples/core/core_input_mouse_wheel.c. Needed get-mouse-wheel-move, now
;;;; bound.
;;;;
;;;; This is the first example with a `TextFormat` in it. The C draws
;;;;
;;;; DrawText(TextFormat("Box position Y: %03i", boxPositionY), ...)
;;;;
;;;; and the number half of that is now sayable: (string (i64->bytes n)).
;;;; What is not is the "%03" — i64->bytes has no field width — so the label
;;;; is drawn with draw-text and the number with draw-int-padded from
;;;; examples/digits.flan, which draws the leading zeroes itself and then the
;;;; number in one call. A number wider than three digits is drawn in full,
;;;; exactly as printf's minimum-width means.
;;;;
;;;; The position is signed and goes negative as soon as the box scrolls past
;;;; the top, which is why draw-int-padded handles a sign at all.
(import rl "vendor:raylib")
(import d "digits.flan")
(defconst screen-width 800)
(defconst screen-height 450)
(defconst scroll-speed 4)
(defonce box-y i32)
(defn main [] ()
(rl/init-window screen-width screen-height
"raylib [core] example - input mouse wheel")
(defer (rl/close-window))
(set box-y (- (/ screen-height 2) 40))
(rl/set-target-fps 60)
(until (rl/window-should-close?)
;; Update. The wheel reading is a per-frame delta, so it is 0.0 on every
;; frame the wheel did not turn and this is a no-op then.
(set box-y (- box-y (i32 (* (rl/get-mouse-wheel-move) (f32 scroll-speed)))))
;; Draw
(rl/with-drawing
(rl/clear-background rl/raywhite)
(rl/draw-rectangle (- (/ screen-width 2) 40) box-y 80 80 rl/maroon)
(rl/draw-text "Use mouse wheel to move the cube up and down!" 10 10 20
rl/gray)
;; The two halves of the C's one TextFormat call: the literal, measured,
;; and then the number starting where it ended.
(rl/draw-text "Box position Y: " 10 40 20 rl/lightgray)
(d/draw-int-padded box-y 3 (+ 10 (rl/measure-text "Box position Y: " 20))
40 20 rl/lightgray))))