4.13動(dòng)態(tài)綁定:parameterize

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ā)生沖突。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容