frage ich mich, wie ich in Perl tun kann, was ich tue, häufig in Lisp:Dynamische Variablen in Perl
(defvar *verbose-level* 0)
(defun my-function (... &key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...)
bedeutet dies, dass my-function
auf dem aktuellen Niveau von Ausführlichkeit ausgeführt wird, aber ich kann es passiert ein andere Ebene, die auch alle ihre Anrufe beeinflussen:
(defun f1 (&key ((:verbose-level *verbose-level*) *verbose-level*))
(format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*)
(f2 :verbose-level 1)
(format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*)
(f2 :verbose-level (1+ *verbose-level*))
(format t "~S: ~S=~S~%" 'f1 '*verbose-level* *verbose-level*))
(defun f2 (&key ((:verbose-level *verbose-level*) *verbose-level*))
(format t "~S: ~S=~S~%" 'f2 '*verbose-level* *verbose-level*))
[17]> (f1)
F1: *VERBOSE-LEVEL*=0
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=0
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=0
NIL
[18]> (f1 :verbose-level 4)
F1: *VERBOSE-LEVEL*=4
F2: *VERBOSE-LEVEL*=1
F1: *VERBOSE-LEVEL*=4
F2: *VERBOSE-LEVEL*=5
F1: *VERBOSE-LEVEL*=4
(beachten Sie, dass die Variablenbindungen beim Beenden gestellt werden - auch abnormal - von Funktionen).
Wie kann ich so etwas in Perl machen? B. in misc.pm
, habe ich our $verbose=0;
. Wie schreibe ich eine Funktion, die $verbose
an einen Wert seines Arguments binden und seinen Wert bei Rückgabe wiederherstellen würde?
Es ist irgendwie lustig, die Ähnlichkeiten zwischen Perl und CL zu sehen. Beginnend mit dem Kompilierungsmodell (warum * sollte * Code nicht während des Parsens ausgeführt werden?) Über spezielle vs. lexikalische vars bis zu separaten Namespaces (CL: Variablen, Funktionen, Labels, Streams, ...; Perl: Skalare, Arrays, Hashes, Subs, IO, ...).Oh, und CLOS/Moose sind offensichtlich verwandt – amon