duangsuse::Echo
712 subscribers
4.24K photos
127 videos
583 files
6.46K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#TypeScript #lib #doc https://util.liuli.moe/@liuli-util/async/ 有一大堆 concatMap, debounce, wait 等操作的 async 组合库

https://util.liuli.moe/@liuli-util/array/ 包含 swap, groupBy, segment(即 chunked), diffBy, uniqueBy 等处理函数 ,还有 arrayToMap(即 associate)
https://util.liuli.moe/@liuli-util/string/#StringValidator.isEmail 非常实际的一个值验证
https://util.liuli.moe/@liuli-util/dom/ 包含一些下载 ArrayBuffer 之类的处理,不过没有复制到剪贴板的

https://util.liuli.moe/@liuli-util/other/#EventEmitter EventTarget 一类对象实现
https://util.liuli.moe/@liuli-util/test/#countTime 这个就是 measureTime { } ,要是能写成 Python timeit 的形式就好了
此外还有 tree 库,支持 treeEach 后序遍历树结构,treeToList (即 flatten , 还有 treeFilter 的变体)
#web #js #dalao #friend https://www.yunyoujun.cn/posts/make-an-avg-engine/
我觉得这个大佬比较亲切,或许以后会有机会接触? 🤔
动苏一贯喜欢风格清新、为人友善开放乐于表达的大佬

虽然看起来这个大佬还在发展阶段,相信我也有可以从中学习的地方
https://github.com/YunYouJun/advjs/blob/main/packages/parser/src/index.ts #TypeScript #parsing 这个大佬也有设计“基于 Markdown 的语言”的想法 😂
#typescript #parsing f<1 是 type error ,怎么可能视为 , 部分单独解析🌚
duangsuse: #kotlin #typescript #plt
应该是kt的计划
我倒希望安卓写完web也能用(
go好像是tcp层的应用比较多,jvm都在http乃至data-json层

kotlinnative的gc模块体积应该降低了吧
总感觉不够取代C,尽管能充当FFI

反正 语言就是工具 好用就用 不好用就不用

kt敌手:groovy+jb家ide (不是

Go的协程讲真不如Kotlin设计的好

duangsuse:
和lua比呢
嗯对lua是多虚拟机协程,kt是编译期suspend fun

冰封说kt协程是基于cps(调用尾步骤编程)的,陈光剑的书也说ktcoro有 Continuation 的概念,可是我只懂typescript function* 的状态机化

说不定这俩就是一回事 俩名字,我只认 函数协程=闭包+指令位置保留

iseki
go天天吹协程,结果就拉成这个样子
坐等Kotlin解决下调用栈的问题(但估计解决不了)

duangsuse:
是啊有啥了不起的,lua openresty 不厉害吗

Science Yuan:
Cps是延续体传递,不是调用suspend时自动产生一个回调函数
然后调用栈就没了(渐渐远离调试

duangsuse:
当然不是,可也没更好的方式理解
毕竟不能说 1+2+yield 是函数

可es6里func*是不包含调用栈,只有闭包变量状态的;通过__awaiter 执行每个Generator对象

所以我觉得func*都可写成Iterator对象形式

iseki |
kotlin是通过ContinuationImpl执行的吧我记得
里面也是把层拆了,一层一层迭代来着,所以调用栈完全裂开
duangsuse::Echo
#math #plt 公开课. 是仿造数学语言 https://github.com/DSLsofMath/DSLsofMath Introduction: Haskell, complex numbers, syntax, semantics, evaluation, approximation Basic concepts of analysis: sequences, limits, convergence, ... Types and mathematics: logic, quantifiers…
#typescript #TT 科普 TypeScript Type-Level Programming - lsdsjy的文章 - 知乎
https://zhuanlan.zhihu.com/p/54182787

TS是支持静态类型的JS。有 number,string 等值,也有常量作 literal type: number, .. "div" "body"..
<K extends keyof ElementMap> :R=Map[K] 是入门级子集定义吧!TS里{a:1,b:""} 的类型都是这种表。此外 {[K in keyof T]: } 可作转化
这个表里[num,str] 是 num|str 的意思,因此若有 P={a:num,b:str} 则 P[keyof P] ,就是并集类型。类同{}类型, {[K in KS]: }[KS] 给并集list 作转化

let v: (() => void) extends Function
的类型是true(lit type). 以下 is=extends
type T={a:num,b:str} //v:{a:Num|never} ,never=kotlin.Nothing |的不动(0值)点
let v:{[K in keyof T]: T[K] is number? T[K] : never }[keyof T] //收集并转换

子类型中 Int is Num, Num is Num 。is是 <= (never不大与任何类型)的意思,如何实现(=)呢?
type Equal<T, U> = T is U ? (U is T ? true : false) : false //TS类型上无&& || !
let v: Equal<Func, Function> // v: true //最后一遍:这是编译期可知

TS只支持 recursive mapped types,“递归函数”只能返回 dict。设想 T={xx: T|Promise<U>} ;把T内所有Promise.resolve 的函数类型是啥?
type Unwrapped<T> = { [K in keyof T]: T is Promise<infer U> ? U : Unwrapped<T> }
type Unwrap<T> = (wrapped: T) => Unwrapped<T>


这里也以infer语法来引入新的 typevar <U> ,算是某种意义上的“模式匹配”。在Haskl 对 ADT 的值作模式匹配;在这儿,我们对有着“代数类型 类型”的TS类型作模式匹配。
ADT 有普通的函数状 data constructor;Type 也有 type constructor,比如 Promise就是 T->Promise<T>的“类型函数”。它是 lit,list,dict 外第三种组合方法
type:
Nat<N> = Zero | Succ<N>
Zero = void; type Succ<N> = { pred: N } //0, +1
_1 = Succ<Zero>
_2 = Succ<_1>

IsNat<T> = T is Nat<infer N> ? true : false
q1 = IsNat<_2> // true
q2 = IsNat<number> // false
IsNatIsNat = IsNat<IsNat> //err: IsNat require param


然后是:
一开始的时候,我把 Coq induction 和数学归纳法搞混了。要用数学归纳法证明一个命题 P,你需要先证明一个基础步骤 P(0),然后在 P(n) 成立的情况下证明一个递推步骤 P(n+1)。但是在 induction 里面没有“基础步骤”和“递推步骤”之分,甚至 induction 产生的小目标的数量都不一定等于2。之后,我发现你可以把 induction 理解成数学归纳法的一种扩展。数学归纳法是作用在自然数上面的,而自然数是一种递归定义的归纳类型:
Inductive nat : Set :=
| O : nat
| S : nat -> nat.

Lemma len_repeat: --n(s rep k)=k*n(s)
forall s n,
String.length (repeat s n) = n * String.length s.

intros s n. induction n
(s rep 0)=0*n(s)—无归纳假设, 下递归定义,有.
(s rep N+1)=(N+1)*n(s)

Lemma len_app_plus: --n(s+s1)=n(s)+n(s1)
forall s1 s2,
String.length (s1 ++ s2) = String.length s1 + String.length s2.
要证明 len_repeat,我们就要对 n 进行归纳,因为 repeat 是定义在 n 上的一个递归
证明 len_app_plus,就对 s1 进行归纳,因为 String.length 在每次迭代中会消耗字符串的第一个字符。当你对 s1 进行归纳的时候,第二个情况会是 s1 = String char s,这就对应了 String.length 的定义


作者:陈乐群
链接:https://zhuanlan.zhihu.com/p/54164515 能够看出来写得很好,还带FAQ..可对外道入门逻辑式还不够唉

#rust #PLT 自由程续-阴阳谜题 手动脱call/cc解
Rust 阴阳谜题,及纯基于代码的分析与化简 - 知乎用户FGAvTw的文章 - 知乎
https://zhuanlan.zhihu.com/p/52249705
#Python 5行yield解 https://zhuanlan.zhihu.com/p/43207643

如何制造SCP018 - 圆角骑士魔理沙的文章 - 知乎 — 函数式尾调用优化
https://zhuanlan.zhihu.com/p/43163820
形式验证、依赖类型与动态类型 - 老废物千里冰封的文章 - 知乎 讲了 Nullable,静态长Vec,运行时报错的type兼容
https://zhuanlan.zhihu.com/p/50792280