Next: Beispiel 2 , Previous: Erklärung des Beispiels , Up: Exkurs GUI , Home: Einführung

musikinformatik-wise-24.org

Wichtiger Hinweis

Die Funktion #'set-on-new-window muss im vorigen Beispiel jedesmal neu ausgeführt werden, wenn die Funktionsdefinition von slider-gui geändert und evaluiert wurde, da #set-on-new-window eine Assoziation zwischen der URL Seite und dem kompilierten Funktionsobjekt zum Zeitpunkt ihres Aufrufs (compile-time) herstellt. Spätere Änderungen von slider-gui werden nicht berücksichtigt, da eine Re-Evaluation der Funktionsdefinition ein neues Funktionsobjekt erzeugt.

Wenn man möchte, dass ein Reload der URL immer die aktuelle Definition von #'slider-gui lädt, kann man das durch eine Indirektion erreichen, indem man die Funktion, die mit #'set-on-new-window assoziiert wird, als Hilfsfunktion verwendet. Diese Hilfsfunktion enthält einen Aufruf von #'slider-gui. Die assoziierte Hilfsfunktion ändert sich nicht, ruft aber beim Laden der Browserseite immer die zu diesem Zeitpunkt (run-time) aktuelle Definition von #'slider-gui auf:

(in-package :clamps)

(defparameter *slider1* (make-ref 0.0))

(defun slider-gui (body)
  "handler for /slider-gui."
  (setf (title (html-document body)) "Slider")
  (create-o-slider body (bind-refs-to-attrs *slider1* "value")
                   :min 0 :max 127 :direction :up
                   :css `(:display "inline-block" :margin "0.5em"
                          :background "white" :height "90%" :width "2em")))

(defun call-current-gui-def (body)
  "helper function calling the current definition of #'slider-gui at the
time of URL reload."
  (slider-gui body))

(set-on-new-window #'call-current-gui-def :path "/slider-gui")

Created: 2025-02-12 Mi 20:35

Validate