2012-10-28 23 views
1

這是我的小程序:語法綁定值必須是關鍵字:alpha。這是什麼意思?

(let-syntax ((alpha (lambda (x) 
         (list (syntax quote) 
          (list))))) 
    (alpha)) 

而且狡詐執行它,並返回()。但mit-scheme輸出以下內容:

;Syntactic binding value must be a keyword: alpha 
;To continue, call RESTART with an option number: 
; (RESTART 1) => Return to read-eval-print level 1. 

爲什麼?

(我的版本是:9.1版||微碼15.3 ||運行15.7 || SF 4.41 || LIAR/I386 4.118 ||埃德溫3.116)

+0

你在做什麼,在這裏?爲什麼沒有**語法規則**關鍵字?你確定要使用** let-syntax **而不是** let **的常規版本嗎? – itsbruce

+0

是的,它是故意完成的。我正在研究低層次的宏觀擴張機制。其實我讀過這個網頁:http://www.cs.indiana.edu/scheme-repository/R4RS/r4rs_12.html – Necto

+0

但是你濫用這個機制;那裏沒有變壓器規格。你希望實現什麼? – itsbruce

回答

1

MIT Scheme僅提供syntax-rules,句法閉包以及用於定義語法變換器的顯式重命名。對於後兩種,您需要sc-macro-transformerer-macro-transformer表單。如果要使用語法對象,則需要使用支持語法對象(通常附帶syntax-case)的實現,例如RacketGuile

順便說一句,即使是使用語法對象的語言,您的宏定義可能無法正常工作,因爲您要從變換器而不是語法返回列表。此外,您鏈接到的網頁是一個相當古老的標準。您可能想要閱讀宏上更新的源代碼,例如TSPL4

1

您鏈接到的文件明確表明,你絕對必須使用帶有let語法的語法規則。這是確切的句法合同。

<macro block> ==> 
      (let-syntax (<syntax spec>*) <body>) 
     | (letrec-syntax (<syntax spec>*) <body>) 
    <syntax spec> ==> (<keyword> <transformer spec>) 
    <transformer spec> ==> 
      (syntax-rules (<identifier>*) <syntax rule>*) 

根據規範,使用除語法規則以外的任何內容都不會出現錯誤。在MIT方案中而不是在Guile中產生錯誤的唯一原因是由於MIT方案更多的異常應用(即MIT方案的let語法專門用於確保您給出它的語法規則)。這是無效的R4RS代碼,不應該在任何R4RS兼容的Scheme實現中工作。