我想知道我怎麼能在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
綁定到其參數值並在返回時恢復其值的函數?
看到Perl和CL之間的相似之處有趣。從編譯模型開始(爲什麼*不應該在代碼執行過程中執行代碼?)在特殊語法和詞法變量之間進行獨立的命名空間(CL:變量,函數,標籤,流......; Perl:標量,數組,哈希, subs,IO,...)。哦,和CLOS /駝鹿顯然有關係 – amon