#life #dev duangsuse 落实 10:30 准时睡觉『政策』。 🐱
考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉
== duangsuse::Echo 参考 #Telegram hashtags
duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)
以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):
== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki
== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code
== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)
== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet
== 软件技术领域部分
#backend #sysadmin #frontend #sysadmin_net
#OI #CS #IT #Informatics
#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization
考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉
== duangsuse::Echo 参考 #Telegram hashtags
duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)
以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):
== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki
== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code
== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)
== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet
== 软件技术领域部分
#backend #sysadmin #frontend #sysadmin_net
#OI #CS #IT #Informatics
#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization
#Go #Qt #Cplusplus 🤔 让我想到了
int main(int argc, char **argv) { QApplication app(argc, argv); return app.exec(); }
Forwarded from 依云的技术资源分享
https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride #go #programming_language #code_design #rust
fasterthanli.me
I want off Mr. Golang's Wild Ride
My honeymoon with the Go language is extremely over. This article is going to have a different tone from what I've been posting the past year - it's a proper rant. And I always feel bad writing tho...
https://github.com/wkgcass/Latte-lang#%E4%B8%AD%E6%96%87%E7%89%88-chinese-version-readme #recommend #plt #jvm Latte ,记住了. Java6 的class编译实现
zig,red; scala.js RustPython moonscript nelua jsweet java2script
https://zserge.com/posts/jvm/ 这个是 #go #bin 实现读classfile常量池&栈执行
https://github.com/axkr/symja_android_library #math #android #tool 符号代数/绘图工具
https://github.com/JacksonTian/stone-lang/tree/master/src/chap12 适合小白读物配套(确信
https://github.com/enso-org/enso 图形编程,可视化, enso.org
https://vlang.io/ 类Go C目标语言,默认no-mut,支持内部序列化. 作者貌似做了C的双向翻译
https://github.com/lclang/LittleCat 用法不错,支持闭包
https://github.com/tern-lang/tern 含游戏示例. 文档太细节
livescript.net 含IDE插件示例
https://github.com/tonysparks/leola 支持协程, namespace: 是啥鬼
https://github.com/cqfn/eo 奇奇怪怪的XML语言.. jolie-lang.org 奇奇怪怪的 Swagger??
https://www.zhihu.com/question/27831730 RednaxelaFX大在这里手撕 #java 编译与反编译器,🐮
你R大永远是你R大🤪
https://www.zhihu.com/question/39400401 还是R大谈CLR-JVM=真泛型&in-out,delegate,P/Invoke&unsigned&Valtype,unsafe和受检溢出,无classloader 树 ,其他人就知道tailrec和jit,gc这些还说混了
不愧是R大 真不是盖的
一己之力拉高 #zhihu 编译原理水平
zig,red; scala.js RustPython moonscript nelua jsweet java2script
https://zserge.com/posts/jvm/ 这个是 #go #bin 实现读classfile常量池&栈执行
https://github.com/axkr/symja_android_library #math #android #tool 符号代数/绘图工具
https://github.com/JacksonTian/stone-lang/tree/master/src/chap12 适合小白读物配套(确信
https://github.com/enso-org/enso 图形编程,可视化, enso.org
https://vlang.io/ 类Go C目标语言,默认no-mut,支持内部序列化. 作者貌似做了C的双向翻译
https://github.com/lclang/LittleCat 用法不错,支持闭包
https://github.com/tern-lang/tern 含游戏示例. 文档太细节
livescript.net 含IDE插件示例
https://github.com/tonysparks/leola 支持协程, namespace: 是啥鬼
https://github.com/cqfn/eo 奇奇怪怪的XML语言.. jolie-lang.org 奇奇怪怪的 Swagger??
https://www.zhihu.com/question/27831730 RednaxelaFX大在这里手撕 #java 编译与反编译器,🐮
你R大永远是你R大🤪
https://www.zhihu.com/question/39400401 还是R大谈CLR-JVM=真泛型&in-out,delegate,P/Invoke&unsigned&Valtype,unsafe和受检溢出,无classloader 树 ,其他人就知道tailrec和jit,gc这些还说混了
不愧是R大 真不是盖的
一己之力拉高 #zhihu 编译原理水平
GitHub
GitHub - wkgcass/Latte-lang: 100% Java compatibility and Functional Programming.
100% Java compatibility and Functional Programming. - GitHub - wkgcass/Latte-lang: 100% Java compatibility and Functional Programming.
https://zhuanlan.zhihu.com/p/385042207 #ce
看完我算是满意但又比较失望的。 其实他的AST可视化(是用 pyecharts. 一个children;text 的结构)做得好,但就最开始的那篇博文就走偏了
我以为那个计算机是逆波兰栈的(据说现在一些大学这样教, iseki 表示他上过课来问群朋友,当时吓得我以为是几百行代码才能做,赶紧抱紧那个民科优先级算法... 😂)
他的计算器只能算 "1+2", (很可惜递归下降不适合解决优先级) 但把分词/解析的职责和求值流程教了下,感觉鸡肋(因为30行parse()就算个加法..)。我不满意的是这个Python 实现没有简洁性, interpreter 会构造大量 dataclass ,故这个人每期代码都4,5百行
https://zhuanlan.zhihu.com/p/24035780 这是 #JS React 的爱好者写的,他举的 Expr+Factor=>Expr+'('+Expr+')'=>1+(2*3) 展开和 if Expr then BB (else BB)? 很实际,Java 里 if() if()a;else b; 的else是就近原则,但 LL里要写明 if() WithElse else Stmt 这样
然后左递归 A='a'|A'b' 就是 A='a'|'a'A1 ;A1='b'A1|null
可惜这种写法有多少层优先级就要有多少调用栈,在 Kotlin 里都有快10种,规则不重要,最终代码你要全部手写我敬你 😐
而且组织AST的方法也有点怪,是用
最后 visit 的方法也是依赖 + * 的层次性的,不可能推广到同层次 +-或 */ ,命名也不简洁
200赞。。。应该说在流行编程界教这些东西会更好…… 贺师俊 hex老也来了
https://zhuanlan.zhihu.com/p/208906640 #Go .这个的原理一样,但解析时求值了
https://zhuanlan.zhihu.com/p/331794661 他们的那套编译原理的真理论( 🤷♂️
https://zhuanlan.zhihu.com/p/26660940 #JS 这个和我最近设计的一个有点像... 不过也不够简洁(20行深拷贝... 30行都能实现miniKanren了),但非常直白
#learn 那我就讲下 N/D Finite Automaton (状态机,别瞎听他们加绝对前缀,没意义),下简称 N/D
N是一个状态列表,从列表:起始/begin状态号到含完成/final 状态,一次匹配就成功。 每状态有 CharClass 对应,成功则转移到许多?状态,否则原位
abc , a[be]c , \d\w+ 都可写成字符类的状态机,^$ 蛮特殊的,它断言当前在输入首尾
N不如D适合 match ,N的所有状态是平级的,ab?c 时状态会回退a,类似 when 变 if-else 会更实际些f
a[bc]*$ 里, (S0 a (S1 [b b1-S1] [c c1-S1] ) $) b,b1 这些"连接态"是等价的,a和$ 是等价的
把 通过S0通过a 能走到(transit)的态记为 q1, q1通过b 滤出q2 ,而只要q里包含 finalCell 就是结束态 ,继续下去可把N转为D。
“ 在这里是 {n5} 。之后求它的边界, 即每一个元素都通过 ε 走到能走到的所有状态,记为 q1 的闭包。” ... 其实就是BFS/DFS
“不动点算法:算法可以提前运行终止,因为状态数是有限的” ...
在mivik的正则库里,
在流程构造里 begin,end 是常被extend()的, link(cell, final)是状态尾部
repeat(1..2) 是最有趣的,repeatAtLeast 只是把 m.copy() extend N遍然后 m*,rep(a..b) 则是在a后放 b-a 个可跳end 的单元,遇到不在内的自然就跳出了
讲不完... 🤪 没有精力了,图形学应用还鸽着呢
正则能不能直接变DFA?
最魔怔的就是直接替换为规则集的规则 a=b|c|$ ;bc=c;cb=b; 还有cb$ ,'b' 本身没喂对可以不转移,也能等价它link到的字,这是什么构造.. 1字符1转移都没会还要整理这个 🤪
看完我算是满意但又比较失望的。 其实他的AST可视化(是用 pyecharts. 一个children;text 的结构)做得好,但就最开始的那篇博文就走偏了
我以为那个计算机是逆波兰栈的(据说现在一些大学这样教, iseki 表示他上过课来问群朋友,当时吓得我以为是几百行代码才能做,赶紧抱紧那个民科优先级算法... 😂)
他的计算器只能算 "1+2", (很可惜递归下降不适合解决优先级) 但把分词/解析的职责和求值流程教了下,感觉鸡肋(因为30行parse()就算个加法..)。我不满意的是这个Python 实现没有简洁性, interpreter 会构造大量 dataclass ,故这个人每期代码都4,5百行
https://zhuanlan.zhihu.com/p/24035780 这是 #JS React 的爱好者写的,他举的 Expr+Factor=>Expr+'('+Expr+')'=>1+(2*3) 展开和 if Expr then BB (else BB)? 很实际,Java 里 if() if()a;else b; 的else是就近原则,但 LL里要写明 if() WithElse else Stmt 这样
然后左递归 A='a'|A'b' 就是 A='a'|'a'A1 ;A1='b'A1|null
可惜这种写法有多少层优先级就要有多少调用栈,在 Kotlin 里都有快10种,规则不重要,最终代码你要全部手写我敬你 😐
而且组织AST的方法也有点怪,是用
let p1=new Node("Mul"); p.push(p1); readTerm(); p=p1;
,没有用参数 也没提及 p=p1;
得每次readXX 重设最后 visit 的方法也是依赖 + * 的层次性的,不可能推广到同层次 +-或 */ ,命名也不简洁
200赞。。。应该说在流行编程界教这些东西会更好…… 贺师俊 hex老也来了
https://zhuanlan.zhihu.com/p/208906640 #Go .这个的原理一样,但解析时求值了
https://zhuanlan.zhihu.com/p/331794661 他们的那套编译原理的真理论( 🤷♂️
https://zhuanlan.zhihu.com/p/26660940 #JS 这个和我最近设计的一个有点像... 不过也不够简洁(20行深拷贝... 30行都能实现miniKanren了),但非常直白
#learn 那我就讲下 N/D Finite Automaton (状态机,别瞎听他们加绝对前缀,没意义),下简称 N/D
N是一个状态列表,从列表:起始/begin状态号到含完成/final 状态,一次匹配就成功。 每状态有 CharClass 对应,成功则转移到许多?状态,否则原位
abc , a[be]c , \d\w+ 都可写成字符类的状态机,^$ 蛮特殊的,它断言当前在输入首尾
N不如D适合 match ,N的所有状态是平级的,ab?c 时状态会回退a,类似 when 变 if-else 会更实际些f
a[bc]*$ 里, (S0 a (S1 [b b1-S1] [c c1-S1] ) $) b,b1 这些"连接态"是等价的,a和$ 是等价的
把 通过S0通过a 能走到(transit)的态记为 q1, q1通过b 滤出q2 ,而只要q里包含 finalCell 就是结束态 ,继续下去可把N转为D。
“ 在这里是 {n5} 。之后求它的边界, 即每一个元素都通过 ε 走到能走到的所有状态,记为 q1 的闭包。” ... 其实就是BFS/DFS
“不动点算法:算法可以提前运行终止,因为状态数是有限的” ...
while(que.size)得到 (S0 a (S1 [b [S2 bb bc] ] [c [S3 cc cb] ] ) )
q=que.pop()
for(c in q)
G[q,c] =t=dfs(links(q,c))
if(t not in Q)// Q = {q0, q1} , workList = [q1]
Q.add(t);que.add(t)
在mivik的正则库里,
NFA.from(append="a").oneOrMore
是 NFA的Builder ,StaticNFA.toDFA . CellList=StateList ;因为 outs 是 BitSet (IntSet) 还支持序列化所以很乱,但这个算法就难..在流程构造里 begin,end 是常被extend()的, link(cell, final)是状态尾部
repeat(1..2) 是最有趣的,repeatAtLeast 只是把 m.copy() extend N遍然后 m*,rep(a..b) 则是在a后放 b-a 个可跳end 的单元,遇到不在内的自然就跳出了
讲不完... 🤪 没有精力了,图形学应用还鸽着呢
正则能不能直接变DFA?
a(b|c)*$
转NFA还好, a 喂b,c 或$ 会转移,而 cb,bc 是互相转移的最魔怔的就是直接替换为规则集的规则 a=b|c|$ ;bc=c;cb=b; 还有cb$ ,'b' 本身没喂对可以不转移,也能等价它link到的字,这是什么构造.. 1字符1转移都没会还要整理这个 🤪
知乎专栏
一起来写个简单的解释器(七):抽象语法树AST
本章,我们会推翻之前解释器的实现方法,将用“树”这种数据结构来实现解释器。为什么会用树来实现?因为算术表达式最适合用树这种数据结构来描述了。比如6/3*2+4*5,可以通过不断叠加的二叉树来表达: 这种树叫做…
#Rust 的 struct/impl-fn 设计非常好(好像还能作union.. ) ,也支持闭包
std 有一些 box,ref,Vec,Map 的对C++ 习惯也很直接,而且有unsafe 能取代C
值类型&mut和(i8,i8)、流控匹配, FFI 和 Emscripten 也很好 (尽管不如Kt重视语义性
总之和 #Go 这种民科语言是完全不同的,mivik/kamet,rin 都是以rs 为原型(尽管不支持匹配解构)
但是设置环境是要花时间的,如果你的程序就那样,用什么语言其实没必要。 Rust 的分配期推导越来越好了,语言工具也完善内部。基本可以直接从其他语言翻译,但是什么语言其实都一样的..
std 有一些 box,ref,Vec,Map 的对C++ 习惯也很直接,而且有unsafe 能取代C
值类型&mut和(i8,i8)、流控匹配, FFI 和 Emscripten 也很好 (尽管不如Kt重视语义性
总之和 #Go 这种民科语言是完全不同的,mivik/kamet,rin 都是以rs 为原型(尽管不支持匹配解构)
但是设置环境是要花时间的,如果你的程序就那样,用什么语言其实没必要。 Rust 的分配期推导越来越好了,语言工具也完善内部。基本可以直接从其他语言翻译,但是什么语言其实都一样的..
#Java #android #reveng 其实Rhino 等利用了Java代码生成但在android兼容也是用这种临时去dx翻译
https://t.me/Ralphonograph/4393 #go SVC模板
https://t.me/Ralphonograph/4393 #go SVC模板
Telegram
Phonograph
前前后后用 golang 写了十来个后端项目,大小不一;最近把自己在 golang 后端开发中用到的工具链整理了一下,开源了一个模板仓库,欢迎大家使用。
只要你对相关工具链有一些了解,拉下来这个模板后就能快速上手业务逻辑的编写,免除在初始阶段写重复代码的烦恼。模板包含 ORM、HTTP 框架、配置文件管理、日志管理、API 文档生成的解决方案,满足小型后端开发的需求。
https://github.com/RalXYZ/go-svc-tpl
只要你对相关工具链有一些了解,拉下来这个模板后就能快速上手业务逻辑的编写,免除在初始阶段写重复代码的烦恼。模板包含 ORM、HTTP 框架、配置文件管理、日志管理、API 文档生成的解决方案,满足小型后端开发的需求。
https://github.com/RalXYZ/go-svc-tpl
https://t.me/kotlin_cn/25220 #kotlin #go 面向job/task计算称 #concurrent ,和完全平行(如滤镜图片)不同
线程切换 >> 函数调用(没有线程切换下的协程切换) > batch之后的函数调用
>分别对应于代码实现的Dispatchers.Default + 无buffer (如果你写对了的话), coroutineScope + 无buffer , coroutineScope + buffer
Exectors singleThread asCoroutineDispatcher
>wait是指blocking的wait么?没看到channel的代码,但是可以断言里面不可能线程停住等待
>不, 是指协程底层在无可调度时的wait;能看到一半是无锁链表,一半是LockSupport.park
之前和他的差这么多,估计是被调度到一个线程上去了,不知道Default里边的策略是什么样的
bench=repeat(10_000);o=Any()Channel 和调度器 Dispatcher ,在浏览器有 worker.postMessage 和 onmessage
c=Channel<Any>()
runBlocking {withContext(Default){
launch{bench{ c.send(o) }}
launch{bench{ c.receive() }}
}}
//c.close(); launch.join()
var wg sync.WaitGroup;wg.Add(2)defer WaitGroup 在凑齐2项时传输(循环看错位)?其实是用计数看是否有job存活,都Done掉退出时再继续主线程
var token struct{}
c:=make(chan struct{})
go func(){
defer wg.Done()
bench{c<-token}
}
go func(){
defer wg.Done()
bench{<-c}
}
wg.Wait()
runBlocking{//limitedParallelism,newFixedThreadPool,single..也有把 Channel 异步序列变得友好的做法
val produce=produce(Default){
bench{launch{send(1)}}
}
var n=0
produce.consumeEach{n+=it}
}
线程切换 >> 函数调用(没有线程切换下的协程切换) > batch之后的函数调用
>分别对应于代码实现的Dispatchers.Default + 无buffer (如果你写对了的话), coroutineScope + 无buffer , coroutineScope + buffer
Exectors singleThread asCoroutineDispatcher
>wait是指blocking的wait么?没看到channel的代码,但是可以断言里面不可能线程停住等待
>不, 是指协程底层在无可调度时的wait;能看到一半是无锁链表,一半是LockSupport.park
之前和他的差这么多,估计是被调度到一个线程上去了,不知道Default里边的策略是什么样的
Telegram
Michael Corleon in Kotlin CN
其实我也见到 stackoverflow 上有人发现 kotlin coroutine 是轻量,但是并不快…尽管通常来说轻意味着快
#learn #ts #kt 子类型 vs 组合, in/out参数
https://t.me/dsuses/5194
总之,trait类型的交集 还是需要in/out,这不是子类型带来的麻烦。
a=append(a,x) 与 copy(a,src) 类型上是一样的,前者也并不能“把a修正为更窄接口”。 Go必须把list+=单项 写出来, 因为缺少型变
func main() {
var src []interface{} = []any{1, 2, 3, 4, 5}
var dst []int = make([]int, len(src))
copy(src,dst) //错:没有共同接口
func copy[T any](dst []T, src []T) {
for i := range dst {
dst[i] = src[i]
}
}
更多关于 #rust #go #plt 的原理
https://t.me/kotlin_cn/74484
https://rustmagazine.github.io/rust_magazine_2021/chapter_4/ant_trait.html#向上转型upcast #recommend
https://rustmagazine.github.io/rust_magazine_2021/chapter_10/lisp-in-rust.html
https://t.me/dsuses/5194
总之,trait类型的交集 还是需要in/out,这不是子类型带来的麻烦。
a=append(a,x) 与 copy(a,src) 类型上是一样的,前者也并不能“把a修正为更窄接口”。 Go必须把list+=单项 写出来, 因为缺少型变
func main() {
var src []interface{} = []any{1, 2, 3, 4, 5}
var dst []int = make([]int, len(src))
copy(src,dst) //错:没有共同接口
func copy[T any](dst []T, src []T) {
for i := range dst {
dst[i] = src[i]
}
}
更多关于 #rust #go #plt 的原理
https://t.me/kotlin_cn/74484
https://rustmagazine.github.io/rust_magazine_2021/chapter_4/ant_trait.html#向上转型upcast #recommend
https://rustmagazine.github.io/rust_magazine_2021/chapter_10/lisp-in-rust.html
Telegram
duangsues.is_a? SaltedFish
#kt 直接把 out=get, in=set 🌚https://t.me/kotlin_cn/74360
Go 只有[]T 和 func(T)R 的别名,不能自定义类型参数的inout性 ,AI绕来绕去没答到🌚
Go,Rust 都是struct-trait,Any是空接口 ,type Option(type T) intrf{} T应该是自动的
Go 的slice,channel 都不支持out性 ,都没有子类型,必须写明trait 接口
比如子类型 P=List
P<T>.fill(with:…
Go 只有[]T 和 func(T)R 的别名,不能自定义类型参数的inout性 ,AI绕来绕去没答到🌚
Go,Rust 都是struct-trait,Any是空接口 ,type Option(type T) intrf{} T应该是自动的
Go 的slice,channel 都不支持out性 ,都没有子类型,必须写明trait 接口
比如子类型 P=List
P<T>.fill(with:…