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.
55 lines
2.0 KiB
Plaintext
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))))
|