💬 Pofat 的話
在本期發刊前一天是 DOOM 發行三十週年的日子,兩個核心製作人 John Romero 與 John Carmack (雙醬)一起搞了個直播大聊那些經典的 FPS 作品,推薦給想沉浸懷舊情懷的人。
🌎 On Swift Community
Swift Async Algorithm 1.0
基於 AsyncSequence
,以時間為 index 的演算法庫終於 API 穩定,釋出 1.0 正式版。
🗣️ On Swift Forum
[SE-0415] Function Body Macros (Reviewing)
Swift Macros 在擴充程式碼上已能做不少事,增加宣告、運算式等,但是卻無法直接實做或擴充函數的程式碼,SE-0415 想要讓開發者可以直接用 Macros 定義整個函數的實做內容(@attached(boyd) macro
)或是在函數裡增加程式碼(@attached(preamble)
),這個提案看起來非常強大,可是我覺得目前的內容並不是很好用。
前者比較容易理解,直接把函數內容定義在 Macros 裡,只要套用函數的宣告就完事,但我實在想不出 overloadin 之外會需要重覆撰寫高度相似內容函數的場合,況且這種 macro 不能疊加。在 variadic generic 之前我們得手寫多個泛型的 overloading,但有了 type packs 後不再需要這麼做,且為了編譯的效能,目前提案的內容是在撰寫 macro 內容時不做型別檢查,只在應用時檢查,這會喚起大家白板題的 PTSD 吧。
至於後者,擴充的方式是在現有的函數內容前後插入程式碼,嚴格來說只有在前端插入而已,「後」的程式碼是靠在 Macros 裡插入 defer 來達成,可以疊加 macro 以組合不同的擴充。
@Logged
func g(a: Int, b: Int) -> Int {
return a + b
}
// expands into
func g(a: Int, b: Int) -> Int {
log("Entering g(a: \(a), b: \(b))")
defer {
log("Exiting g")
}
return a + b
}
乍看這很適合用於效能追蹤(要插入監視區間的開始/結束 )、log 等,但 defer
無法取得最終返回值,也無法知道是否是被 throw,用途其實有非常多限制,得轉回 body
,但 body
無法疊加。
理想情況是有 @Logged
@Instrumented
,能夠處理 happy 與 unhappy path (比如 throw)再疊加到感興趣的函數上,不過目前似乎無解。
🤪 Pofat 選推
從下面的 bug 回報案例中,我們看到社畜的最佳生存原則:球不要在手上,最好傳到黑洞裡。
@attached(preamble)有个挺好的用法是实现python @lru_cache