7

Lisp でよく行うことを Perl でどのように行うことができるか疑問に思っています。

(defvar *verbose-level* 0)
(defun my-function (... &key ((:verbose-level *verbose-level*) *verbose-level*) ...) ...)

これはmy-function、現在の詳細レベルで実行されることを意味しますが、すべての呼び出しにも影響する別のレベルを渡すことができます。

(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

(異常な場合でも、関数からの終了時に変数バインディングが復元されることに注意してください)。

どうすればそのようなことを Perl で行うことができますか?

たとえば、 でmisc.pm、私は を持っていour $verbose=0;ます。$verbose引数の値にバインドし、戻り時にその値を復元する関数を作成するにはどうすればよいですか?

4

2 に答える 2