mi chiedo su come posso fare in Perl quello che comunemente fanno in Lisp:le variabili dinamiche in perl
(defvar *verbose-level* 0)
(defun my-function (... &key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...)
ciò significa che my-function
viene eseguito al livello attuale di prolissità, ma posso passare un diverso livello che interesserà tutte le sue chiamate troppo:
(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
(notare che le associazioni variabili vengono ripristinate in uscita - anche anormale - dalle funzioni).
Come posso fare qualcosa del genere in Perl?
E.g., in misc.pm
, ho our $verbose=0;
. Come si scrive una funzione che legherà $verbose
ad un valore del suo argomento e ne ripristini il valore al ritorno?
È piuttosto divertente vedere le somiglianze tra Perl e CL. A partire dal modello di compilazione (perché * non dovrebbe * codice essere eseguito durante l'analisi?) Su vassoi lessici speciali o lessicali fino a spazi dei nomi separati (CL: variabili, funzioni, etichette, flussi, ...; Perl: scalari, matrici, hash, sottotitoli, IO, ...).Oh, e CLOS/Moose sono ovviamente correlati – amon