Zastanawiam się, jak mogę to zrobić w Perlu co ja zwykle zrobić w Lisp:zmienne dynamiczne w Perl
(defvar *verbose-level* 0)
(defun my-function (... &key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...)
oznacza to, że my-function
prowadzony jest na obecnym poziomie gadatliwości, ale może on przechodzić inny poziom, który wpłynie na wszystkie swoje połączenia za:
(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
(pamiętać, że zmienne są przywracane wiązania na wyjściu - nawet nienormalny - od funkcji).
Jak mogę zrobić coś takiego w Perlu?
Np. W misc.pm
, mam our $verbose=0;
. Jak napisać funkcję, która zwiąże $verbose
z wartością jego argumentu i przywróci jej wartość po powrocie?
Zabawne jest widzieć podobieństwa między Perl i CL. Zaczynając od modelu kompilacji (dlaczego * nie powinno się * kodu wykonywać podczas parsowania?) Przez znaki specjalne vs. leksykalne do oddzielnych przestrzeni nazw (CL: zmienne, funkcje, etykiety, strumienie, ...; Perl: skalary, tablice, skróty, subs, IO, ...).Aha, i CLOS/Moose są oczywiście spokrewnieni – amon