Scala语言将加入宏指令
Scala開發團隊正在將實驗版宏指令加入到即將發行的2.10版中。Scala宏指令提供了編譯時元編程的高級形式。Scala宏網站描述道:
\u0026#xD;\n\u0026#xD;\n“宏指令顯著簡化了代碼分析和代碼生成,這使得它們成為處理大量現實用例的一種可選工具。傳統上涉及編寫和維護樣板的場合可用宏以簡單且易維護的方式實現。因此我們認為宏對于Scala編程語言是一項非常有價值的資產。”
\u0026#xD;\n\u0026#xD;\nScala的宏指令允許開發者創建方法時以語法樹轉化的形式實現。這些是標準方法的定義,其在編譯期間被顯式地轉換。舉一個簡單的例子,如assert方法:
\u0026#xD;\n\u0026#xD;\nimport scala.reflect.makro.Context\u0026#xD;\nimport language.experimental.macros\u0026#xD;\nobject Asserts {\u0026#xD;\n def assert(cond: Boolean, msg: Any) = macro Asserts.assertImpl\u0026#xD;\n def raise(msg: Any) = throw new AssertionError(msg)\u0026#xD;\n def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[Any]): c.Expr[Unit] =\u0026#xD;\n if(assertionsEnabled) c.reify(if(!cond.splice) raise(msg.splice))\u0026#xD;\n else c.reify(())\u0026#xD;\n}\u0026#xD;\n\u0026#xD;\nassert宏就像代碼中的一個普通的方法。該實現使用macro方法委托成為編譯器擴展。該編譯器擴展是方法assertImpl。assertImpl使用當前編譯的上下文作為參數,而參數傳給assert作為語法樹(Expr)。這些語法樹接下來被用作產生一個新的語法樹并被插入至assert宏方法被調用的位置。
\u0026#xD;\n對于assert宏來說,調用assert的方法assert(x != null, \"X is null\") 會給cond變量填充x != null的語法樹而給msg變量填充\"X is null\"的語法樹。對reify的調用會產生一個 if(x != null) Asserts.raise(\"X is null\")的或者()的新語法樹。這個語法樹會替代原始的assert(x != null, \"X is null\") 調用。
\u0026#xD;\nreify和自清潔宏系統的更多細節可參考自清潔宏建議。
\u0026#xD;\n有些人懷疑添加宏的效果,在一份題為《Scala Macros: \"Oh God Why?\"》博客中, Jay Kreps 評論道:
\u0026#xD;\n\u0026#xD;\n“這也是我對于Scala 宏指令的看法(Oh God Why?)。并不是因為宏指令或者這項提議有什么壞處,問題在于這真的是最重要的事情嗎?”
\u0026#xD;\n\u0026#xD;\nKreps接下來列舉了一系列更重要的事情,包括編譯速度、IDE支持、文檔和編譯文件大小。
\u0026#xD;\n支持Kreps觀點的大有人在。Ivan Todoroski在一封給Scala郵件列表的信中寫到:
\u0026#xD;\n\u0026#xD;\n“在搜索問題的時候,Scala宏指令看起來只是一個低級別的、hacking風格的解決方案。它們在編寫時太復雜,不太像Scala的風格,調試也麻煩,而且可能不過是為Scala的‘太多高深莫測的魔法’的形象增添了一筆。”
\u0026#xD;\n\u0026#xD;\n對此,Scala的發明者Martin Odersky回復說:
\u0026#xD;\n\u0026#xD;\n“宏的設計初衷和Scala語言的其他一般設計一樣,都是為了使事情簡單化。我們已經實現通過宏替換代碼,希望其他功能也能這樣實現。比如說,有一種強推在某種情況下消除 atomic { implicit transaction =\u0026gt; ... }中的隱含參數和許多其他相關情形。有了宏,這類問題就微不足道了。”
\u0026#xD;\n\u0026#xD;\n圍繞著Scala宏的討論已經逐漸偃旗息鼓,社區成員們正在等著看最終的實現。最終發布的版本始終沒有放棄在宏指令方面的冒險。許多社區內基于宏的項目已經逐漸生根發芽,包括:
\u0026#xD;\nMacrocosm——測試宏指令實際用例的庫。
\u0026#xD;\nExpecty——Groovy的Spock框架中的斷言語句在Scala中的適應性改編。
\u0026#xD;\nSlick——引進類似LINQ的數據庫操作的嘗試。Slick能轉化Scala語法為數據庫查詢。
\u0026#xD;\nScalaMock——Scala的模擬對象測試庫。
\u0026#xD;\n在2.10.0-M4發布說明里可以找到其他一系列Scala2.10中的功能,包括:
\u0026#xD;\n字符串插值
\u0026#xD;\nFutures和Promises
\u0026#xD;\nValue類
\u0026#xD;\n動態類型
\u0026#xD;\n隱式類
\u0026#xD;\nScala2.10版馬上就要發布了,Scala開發團隊號召人們試用最新的milestone發行版并提供反饋意見。你可以從這里下載最新版本。
\u0026#xD;\n感謝楊賽對本文的審校。
\u0026#xD;\n給InfoQ中文站投稿或者參與內容翻譯工作,請郵件至editors@cn.infoq.com。也歡迎大家通過新浪微博(@InfoQ)或者騰訊微博(@InfoQ)關注我們,并與我們的編輯和其他讀者朋友交流。
總結
以上是生活随笔為你收集整理的Scala语言将加入宏指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 考验你对《艾尔登法环》地图熟悉度的时候到
- 下一篇: 2012年我读过的十本好书