parametterize形式在它方法體執(zhí)行中關(guān)聯(lián)了一個(gè)值到固定參數(shù)。
(parameterize ([parameter-expr value-expr] ...)
body ...+)
術(shù)語(yǔ)“參數(shù)化”有時(shí)候被用來(lái)指函數(shù)的參數(shù),但是在Racket里面有特殊含義。
比如,參數(shù)error-print-width指定了在錯(cuò)誤信息里有多少字符會(huì)被打印。
更一般的情況下,參數(shù)化實(shí)現(xiàn)了一種動(dòng)態(tài)的綁定。函數(shù)make-parameter接受一個(gè)值并把它賦值給一個(gè)參數(shù)。像函數(shù)一樣調(diào)用一個(gè)參數(shù)將返回它的當(dāng)前值。
>(define location (make-parameter "here"))
>(location)
"here"
每個(gè)parameter-expr必須產(chǎn)生一個(gè)參數(shù)。在執(zhí)行的方法體中,每個(gè)指定的參數(shù)都已經(jīng)被初始化相應(yīng)的value-expr的值。當(dāng)離開parameterize形式,不管是return,exception,或者其它逃逸,參數(shù)都會(huì)恢復(fù)成之前的值。
parameterize在整個(gè)方法體執(zhí)行期間都會(huì)調(diào)整參數(shù)值,即使在方法體之外定義的parameterize,對(duì)內(nèi)部也有影響。
>(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定義內(nèi)部定義的時(shí)候沒(méi)有執(zhí)行的表達(dá)式,當(dāng)它在外部執(zhí)行時(shí),它將無(wú)法使用parameterize定義的值。
給參數(shù)的函數(shù)傳遞一個(gè)值,將給參數(shù)重新賦值。
使用parameterize更適合用來(lái)更新一個(gè)參數(shù)值,基于相同的理由set!更適合用來(lái)更新一個(gè)變量。
使用set!也可以解決parameterize的問(wèn)題。例如
>(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有幾個(gè)重要區(qū)別
parameterize在操作逃逸到異常時(shí),可以自動(dòng)重置值。但是在異常處理后其它形式里回溯set!值很麻煩。
參數(shù)化可以很好的和尾調(diào)用協(xié)同工作。
參數(shù)化可以在線程中使用。parameterize只會(huì)調(diào)整當(dāng)前線程的值,可以避免和其它線程發(fā)生沖突。