MacDev 板


LINE

1F:推 Killercat:其實template block...我還真想不到哪裡非用這種不可@@ 09/21 23:13
2F:→ Killercat:block其實就是lambda 就是個只需要用一次用過即丟的東西 09/21 23:13
3F:推 Killercat:這個我倒是很樂觀clang會把它們整合在一起.... 09/23 03:33
4F:→ Killercat:不過我還是想不出有什麼原因會讓你不用templated func 09/23 03:33
5F:→ Killercat:而非得搞個templated lambda不可 =P 09/23 03:33
在開發新的 programming 方式 最主要是讓部分程式碼以 block 包裝 然後在一個 function/method 內 讓這些 blocks 串在一起 (類似queue/chain) 然後從第一個 block 開始執行 並會在適當時機呼叫下一個 block 但也有可能不呼叫下一個 block 就立刻返回 目前已經開發差不多 (其實只有短短幾行 code) 但是遇到如果 function 有 return 值的話 每個中間經手的 block 都必須要回傳下一個 block 的回傳值 直到最後沒有 block 為止 通常最後一個 block 才是真正要執行的內容 而在執行最後一個 block 之前 可以先執行別的程式碼 我先把主架構(目前稱它為 Block-In-Block, BIB)的 code 貼上來: ===== Block-In-Block 主架構 ===== typedef void* (^BIBExecutionBlock)(); typedef BIBExecutionBlock (^BIBAdviceBlock)(BIBExecutionBlock executionBlock); BIBExecutionBlock BIBHandler(BIBAdviceBlock advice, ...); BIBExecutionBlock composeAdvices(BIBAdviceBlock headBlock, va_list tailBlocks); BIBExecutionBlock BIBHandler(BIBAdviceBlock advice, ...){ va_list advices_list; va_start(advices_list, advice); BIBExecutionBlock composedBlock = composeAdvices(advice, advices_list); va_end(advices_list); return composedBlock; } BIBExecutionBlock composeAdvices(BIBAdviceBlock headBlock, va_list tailBlocks){ if (headBlock == nil) { return nil; } return headBlock(composeAdvices(va_arg(tailBlocks, BIBAdviceBlock), tailBlocks)); } ========= 實作幾個 AdviceBlock ========= AOPAdviceBlock advice_1 = ^AOPExecutionBlock(AOPExecutionBlock furtherBlock){ return ^void*(){ void *retVal = NULL; printf("before advice_1\n"); // 若不呼叫 furtherBlock() 則不會執行下一個 block retVal = furtherBlock(); printf("after advice_1\n"); return retVal; }; }; AOPAdviceBlock advice_2 = ^AOPExecutionBlock(AOPExecutionBlock furtherBlock){ return ^void*(){ void *retVal = NULL; printf("before advice_2\n"); retVal = furtherBlock(); printf("after advice_2\n"); return retVal; }; }; =========== 實作兩個 method 使用 advice_1/advice_2 =========== @implementation BIBTest + (NSInteger) doubleTheNumber:(NSInteger)number{ return * (NSInteger*)BIBHandler(advice_1, advice_2, ^BIBExecutionBlock(BIBExecutionBlock furtherBlock){ return ^void*(){ NSLog(@"action"); NSInteger numberValue = number *2; void *retVal = &numberValue; return retVal; }; }, nil)(); } + (NSString*) logConsole:(NSString*)string{ return (__bridge NSString *)(BIBHandler(advice_1, advice_2, ^BIBExecutionBlock(BIBExecutionBlock furtherBlock){ return ^void*(){ NSLog(@"action for string: %@", string); NSString *newString = [NSString stringWithFormat:@"Hello, %@!", string]; return (__bridge void *)(newString); }; }, nil)()); } @end ========== 在 main() 呼叫這兩個 method ======== int main(int argc, char *argv[]) { NSLog(@"%@", [BIBTest logConsole: @"Tom"]); NSLog(@"===================="); NSLog(@"doubleTheNumber: %d", [BIBTest doubleTheNumber:50]); } =========== Console ============ > before advice_1 > before advice_2 > action for string: Tom > after advice_2 > after advice_1 > Hello, Tom! > ==================== > before advice_1 > before advice_2 > action > after advice_2 > after advice_1 > doubleTheNumber: 100 目前在處理 block-in-block 的回傳值問題 (應該還會牽扯到記憶體管理) 必須使用 void* 作為 BIBExecutionBlock 的回傳值 並在 function/method 內要重新 cast 才能回傳 希望可以自動判斷回傳型別 而不需要手動 cast 這個 progamming 的方式 可以讓各 block 決定是否呼叫下一個 block 並且可以竄改後面 block 回傳回來的值 (如果有必要的話) 因為目前 method 的實作 其實內部很多都是在做很多雜事 想把這些雜事轉為 block 可以讓 code 乾淨很多 (當然還是得搭配 macro) --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.198.184.235 ※ 編輯: leondemon 來自: 114.198.184.235 (09/24 01:01)
6F:→ Killercat:你說的很像COR Pattern(Chains of Responbility) 09/24 01:21
7F:→ Killercat:指的是這個嗎?所以你需要一個block產生器? 09/24 01:21
8F:→ Killercat:噢搭macro的話....那可能能做的會比想像多很多... 09/24 01:21
不知道你說搭配的 marco 可以做的事有哪些 我已經有寫好 macro 可以比較像敘述的語法來寫 Code 會看起來比較簡潔 目前就是卡在 block 的回傳值要如何傳遞回去給 function 去 return 一直希望有解法至少可以看起來比較整潔一點... (如果可以用 Obj-C++ 解也OK) 這比較不像是責任鏈 責任鏈目的是要找到 responder 由它來負責處理 event 我的這個比較像是一個 hook 構造 假如 block 的排列順序為 A -> B -> C -> D -> T(目標 block) ... (後面還可以接其他 block) 則會執行 A -> B -> C -> D -> T -> D' -> C' -> B' -> A' 中間可以依判斷而終止往後傳而進行返回 例如 C 決定不呼叫下一個 block 則 A -> B -> C -> B' -> A' 搭配創造 block 的 method
9F:推 johnlinvc:感覺像是js 的future/promise或是 FP的monad 09/24 10:31
沒特別研究別的 不過有空的話我再參考看看 Block-in-Block 只是一時興起的念頭 覺得這個 programming 方法有趣且應該有用 就開發來玩玩 ※ 編輯: leondemon 來自: 114.198.184.235 (09/25 00:55)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP