with-slots-read-only

Das Macro with-slots-read-only ist eine Variante von with-slots. Es erwartet drei Argumente. Nur das erste Argument wird nicht ausgewertet. Das erste Argument ist eine Liste von Namen von Instanzvariablen. Das zweite Argument ist eine Instanz. Das dritte Argument ist ein Ausdruck, der innerhalb einer Umgebung ausgewertet wird, in der die Namen der Instanzvariablen ihrem Wert in der Instanz zugeordnet sind.

Werden diese Werte geändert, werden die Änderungen nicht in die Instanz übernommen. Das ist der Unterschied zur Funktionsweise von with-slots, das Änderungen in die Instanzvariablen übernimmt.

Das Macro with-slots-read-only basiert im Wesentlichen auf let und slot-value:

(setq with-slots-read-only
  (mlambda args
    (let
      ((slots (first args))
       (instance (second args)))
      (list
        let
        (map-with
          (lambda (slot)
            (list
              slot
              (list
                slot-value
                instance
                (list quote slot))))
          slots)
        (third args)))))