即将发布的C库STC v4.3已支持块定义风格的协程

新版STC将支持如下Block-style的协程(Coroutine)定义:

cco_routine (ctx) {
    puts("1");
    cco_yield(1);
    puts("2");
    cco_yield(2);
    puts("3");
    cco_yield(3);
}
puts("ending");
return -99;

https://github.com/stclib/STC/pull/57

而在此之前,用的是相对丑陋的配对的cco_begin(ctx) cco_end(ret)

cco_begin(ctx);
    puts("1");
    cco_yield(1);
    puts("2");
    cco_yield(2);
    puts("3");
    cco_yield(3);
cco_end(-99);

相比旧版,新版写法浑然天成,风格上更贴近C语言,摒弃了原来人为刻意构造的 cco_begin/cco_end,把返回值也从cco_end参数里拿出来,用纯粹的C语法return表达协程返回值,而且还额外支持在协程结束之前执行任意代码,这也是相对旧版的重要改进。

为了支持新版写法,我花费了不少心思,灵活运用和借鉴了达夫设备思想,把 case n: 写在 case 0: 后面的花括号内,外面再套一个for循环,内部实现的确是反常规的另类思路,但体现到外部API上却又十分优雅自然。我的 PR 得到 stclib 作者 Tyge Løvset (tylov) 的充分肯定,并三番四次对我表示感谢,甚至还特意在后续 commit 中在源代码里点名感谢我。数周之后 tylov 依然念念不忘:

Btw, I am still in awe over your previous pull request! I had no idea it was possible to have the first switch case outside the block, which allowed this. Thanks again!!


Tyge Løvset 开发的 STC 库深受我的喜爱(没有之一),我关注这个项目超过两年,可以说是见证了它从诞生初期到逐步发展壮大的全过程。STC库主要提供规范的跨平台的高性能的类型安全的泛型数据结构,其作者 tylov 把C语言的宏运用的深入浅出,代码固然艰深难读,但其对外提供的API却既优雅又友好。在许多年前,我曾经特别反感和排斥这样的大量使用宏的C语言库,甚至一度躺平情愿接受更繁琐的写法,后来逐步碰壁反思,我才逐渐意识到,除非大量的宏运用,很难在C库中提供优雅而类型的API接口,这业已成为行业共识。很多东西如果你不做到自动化规范化,反而要求C库使用者时刻记忆遵守某些铁规,是不太现实的,因为不断地犯错是写在人性之中的。

STC is a modern, typesafe, fast and compact container and algorithms library for C99. The API naming is similar to C++ STL, but it takes inspiration from Rust and Python as well. The library handles everything from trivial to highly complex data using templates.


在接触到 STC 之前,我还考察过 klib, zpl, mlib, tbox 等,印象中 mlib 对宏的运用更加走火入魔让人避而远之,相对来说 stclib 还是比较克制的。

mlib (MLib, MStarLib) 这个C语言库把宏(Macro)运用到极致,其中OPLIST是其创新之精华("An OPLIST is a fundamental notion of MLIB that hasn’t be used in any other library.")。对外,它提供了丰富实用的泛型数据结构及其文档和测试用例;在内部,它大量使用各种宏技巧,无所不用其极,例如m-core.h在编译时计算宏参数个数是否为1。初看是作者炫耀奇技淫巧,仔细想想要实现泛型的优雅的C语言数据结构,往往也只能用宏(参考)。所以我认为,它的实用性值得使用,它的技巧值得学习。

可后来遇到STC之后,瞬间觉得mlib不香了,mlib的实现代码过于复杂,而stc要简洁很多。当时的stc还是下面这种接口:

using_cvec(i, int);
cvec_i vec = cvec_i_init();

当时一见如故。后来历经多次大的改版,API早已不是这个样子。至今依然喜爱STC。

你可能感兴趣的:(C/C++,liigo,数据结构,stclib,coroutine,C语言,liigo,mlib,collections)