亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5643 | 回復(fù): 1
打印 上一主題 下一主題

scheme的宏為什么是衛(wèi)生的? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-10-21 22:20 |只看該作者 |倒序瀏覽
網(wǎng)上找到的這些內(nèi)容:
當(dāng)macro展開時會在當(dāng)前的scope里引入新的symbol,而這些新引入的symbol會和原有的symbol同名,所謂capturing problem。而這種錯誤,因為在展開macro時產(chǎn)生的,所以程序員光看源代碼很難察覺。

比如,你定義一個宏 or 如下:
(or e1e2) ---> (let ((v e1)) (if v v e2))


如果你的程序這樣寫 (or nil v), 展開后就是:
(or nil v) ---> (let ((v nil)) (if v v v))

原來“(or nil v)”中的v是free variable,但展開后就和macro中的binding variable v同名,成了bound variable。

早先的解決辦法,只是展開macro時,把所有新的symbol都“篡改”一下,好比 v 改成 v0340。但這樣只是減少了重名的可能,顯然沒有徹底解決問題,"不衛(wèi)生"也。Hygienic macro(衛(wèi)生宏)就是指不會產(chǎn)生這種capturing problem的宏展開機制。具體方法,感興趣可以讀 Hygienic Macro Expansion 這篇文章。




但是我還是不明白,我把R5RS翻來覆去的看,都快崩潰了,哪位高手指教一下,跪求!
如果用syntax-rules來寫這個宏應(yīng)該怎么寫呢?又怎么避免這個問題呢?為什么可以避免這個問題呢?

R5RS里是這樣的:

(define-syntax or
  (syntax-rules ()
    ((or) #f)
    ((or test) test)
    ((or test1 test2 ...)
     (let ((x test1))
       (if x x (or test2 ...))))))

這里引入了變量x,那么,如果求值(or y x)會怎么樣?為什么不會出現(xiàn)前面的類似問題?
是不是因為,syntax-rules不是簡單的字面意義上的替換,所以可以避免前面的問題?是這樣嗎?

注意,這里最后一句不是寫成 (if test1 test1 (or test2 ...),不是直接展開,
而是用x 替換了test1,用什么用意???????????

論壇徽章:
0
2 [報告]
發(fā)表于 2010-10-21 22:38 |只看該作者
想明白了,把 test1 bind到x,是為了避免求值兩次



但是還是不明白scheme的宏是怎么實現(xiàn)“衛(wèi)生“的,,,,


踢教一下,高人
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP