parametterize形式在它方法體執(zhí)行中關聯(lián)了一個值到固定參數税产。
(parameterize ([parameter-expr value-expr] ...)
body ...+)
術語“參數化”有時候被用來指函數的參數焙矛,但是在Racket里面有特殊含義。
比如掀虎,參數error-print-width指定了在錯誤信息里有多少字符會被打印羡宙。
更一般的情況下狸剃,參數化實現(xiàn)了一種動態(tài)的綁定。函數make-parameter接受一個值并把它賦值給一個參數狗热。像函數一樣調用一個參數將返回它的當前值钞馁。
>(define location (make-parameter "here"))
>(location)
"here"
每個parameter-expr必須產生一個參數。在執(zhí)行的方法體中匿刮,每個指定的參數都已經被初始化相應的value-expr的值僧凰。當離開parameterize形式,不管是return熟丸,exception训措,或者其它逃逸,參數都會恢復成之前的值光羞。
parameterize在整個方法體執(zhí)行期間都會調整參數值绩鸣,即使在方法體之外定義的parameterize,對內部也有影響纱兑。
>(define (would-you-could-you?)
(and (not (equal? (location) "here"))
(not (equal? (loaction) "there"))))
>(would-you-could-you?)
#f
>(parameterize ([location "on a bus"])
(would-you-could-you?))
#t
如果在parameterize定義內部定義的時候沒有執(zhí)行的表達式呀闻,當它在外部執(zhí)行時,它將無法使用parameterize定義的值潜慎。
給參數的函數傳遞一個值捡多,將給參數重新賦值蓖康。
使用parameterize更適合用來更新一個參數值,基于相同的理由set垒手!更適合用來更新一個變量蒜焊。
使用set!也可以解決parameterize的問題科贬。例如
>(define lokation "here")
>(define (would-ya-could-ya?)
(and (not (equal? lokation "here"))
(not (equal? lokation "there"))))
>(set! lokation "on a bus")
>(would-ya-could-ya?)
#t
但是parameterize有幾個重要區(qū)別
parameterize在操作逃逸到異常時山涡,可以自動重置值。但是在異常處理后其它形式里回溯set!值很麻煩唆迁。
參數化可以很好的和尾調用協(xié)同工作。
參數化可以在線程中使用竞穷。parameterize只會調整當前線程的值唐责,可以避免和其它線程發(fā)生沖突。