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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): a19a0b
Download Telegram
Forwarded from Solidot
Blender 4.0 释出

2023-11-15 00:01 by 镜中世界

开源 3D 建模软件 Blender 释出了 4.0 版本。主要新特性包括:Cycles 支持光和影的耦合,支持光滑表面的路径引导,支持苹果 Metal API 的 MetalRT 硬件光线追踪,HIP 后端支持 AMD RDNA2 和 RDNA3 APU,默认 UI 字体 Inter,Linux 和 macOS 版最低要求 OpenGL 4.3,等等。更多可浏览发布公告。

https://wiki.blender.org/wiki/Reference/Release_Notes/4.0

#开源
👍2
duangsuse::Echo
cg($dyn) 生成了 ()=>(a=3,f=(a)=>(a+1),r0=[f(1),a]) ,运行正常 - just(a) - f()=a f just(0)() 那再来一个 with(DSL)$lex=[[], [just, [[a], [f,[[],[a] ]], [f] ]], [f,[0, 0,[just]]], [0, f] //“类型推导”差到不能直接调用 ] ()=>(just=(a)=>(f=()=>(a),f),f=just(0),f()) 是0而不是3 实际上,()=>…
这位 Pixel #PLT #dalao 真是太清醒了,十分 #recommend
https://rigaux.org/language-study/language-study-slides/img13.htm

https://note.sbwcwso.com/

大佬对编程范式的了解很广。我是在 https://blog.vero.site/post/noulith 的codegolf语言看到的 🤔这语言的 a append= x 统一了列表和"str"的不可变,但我不喜欢
ppt显示
class Eq a where
(==): a a -> bool
(!=): a a -> bool

不过绝句早就是关系式编程了,纯函数算什么(这几天新增的更改,SQL JOIN)
- Str find(:Str) Idx
[me.iEach]*2 .:
i0\<i, me[i0+i]==s[i], i==n: return i0

- Any`+`(u:Int) me.[Int too]+u
- Int desc me.{0 "zero" 1~10"small" or "{me}"}

这不比as,when is in 强多了,还有新的Fn表达式 🤔
val add: Int.(Int)->Int = {x,y->x+y}
at add Fn.[Int Int A2]:A+B

type 'u'Num
- `==`(:u) YN
type Any
- == (:Any?) YN
- `\=`(:[Any? me], :Any?) YN
Forwarded from Solidot
16 岁少年用 Blender 创建的动画赢得了英国 YAY UK 动画奖

2023-11-16 22:19 by 破译滑铁卢

面向英国年轻人的 YAY UK(Young Animator of the Year)公布了 2023 年的获奖者:16 岁的 Euan Garbut 赢得了 15-18 年龄组的最佳动画奖:他在一分钟内描述了未来世界机器人给人类制作食物的过程。主办方称,该奖项由英国动画和 VFX 工作室的专业人士评选,开源 3D 建模软件 Blender 让年轻一代制作出令人称奇的动画成为可能。Euan Garbut 称他用 Blender 制作动画,Davinci Resolve 用于颜色分级 (colour grading)。

https://younganimator.uk/winners
https://younganimator.uk/winner/1699875910225x437970782709919500
https://news.ycombinator.com/item?id=38282166

#科幻
duangsuse::Echo
#blog #meme 看到易语言还在VB++ 的范式旁徘徊 😅,并且觉得编程语言 是种必须特色和备案的「核心技术」… 我想复刻下这2007年文章的口吻: “绝句.ju”十分钟入门教程 作者:转载必须注明出处 亲爱的朋友,您愿意花十分钟的时间,来了解一门全新的编程语言“绝句.未公开”吗?(搞笑向 btw. 很难想象标准库与ES7接轨,拥有函续、不/可变数据集、流/叠加、双主语的绝句,还能用“合规”的记法支持VB7时代的“正统中文编程”👀 - 起点 将123写到屏幕 100.123:[x] …
绝句的py化已经走向了YAML和Go的形状,已经不像那个满是def和class的语言了

最开始绝句不满Kotlin的两点,就是 List<T> fun<T> ,. 不对仗,以及一大堆 (private)val 前缀不够简洁

但那时反思主要是在中文语意上,而且当时执意给let mut穿小鞋: 量i=0;变数,j初0;常数 PI=3.14

后来const被规范为常量折叠API,变数和量也就区分为 在,i 0。 在这时,j 0 。这时主要的麻烦是 at: a 1; b 2: +1 的最佳实践有:块 时很难看

随着:块渗透进print、流控、异步…… 开始流行一种 - Dog bark (say: 'what {sound}'); - f'x' as:(x+1) 的全表达式风格
这种有趣的断言,把整个语言分为「式算折词典」5级, as: 就是“一折”能新建变量和ret的算式, 因此尾递归 也能以极其廉价的方式编写
- id'ab'(b=0) as:
now(a+1,b-1) : b==0
a

于是,现在的变量声明,变得符合人类习惯了。而且走向彻底的隐类型--伴随着对OOP的彻底分析,从而知道只有在type接口里,必须能写明类型

- 比赛 std.[Int as]:
红队 2
篮队 10
场 Inc.[Str Ln](1):"List<String>"
max(红队,篮队)

- 赋值 做,
a [{0~9} ]!
a加10

这时 0,i;求和
这时i<a.n,
求和 =,+ a[i]
i去右移
说,'{求和} {a}'


然后,我把易语言用户的猜数字又写了一遍
将123写到屏幕
100.123,[x]
(将x)写到屏幕


名 'T' `将`(:T) “名记平权”
- [文 将]`写到屏幕` 说,'{它}'

(0~10)(x), “如果(0 < x < 10)”。
(0~~10)(x), “如果(0 < x \< 10)”
(0的右~10的左)(x), “如果(0 \< x \< 10) ,因为数学(>18) 不自然,我换了”

这时,a 1;b 2
变数去换(a、b)
""{a==2, b==1}!
👎1
#statement ☺️绝句是帮我「改良编程」的望远镜,我现在设计的JS变量绑定框架、CLI结构体解析器, 都需要它的理论完善,才能在简洁+完备上打败既有框架

我不会因为太慢,或者貌似很「不切实际」,就暂停完善绝句模型。 在产生任何设计问题前,就该把错误扼杀掉--而不是日复一日上StackOverflow 去堆砌GPT都能写的脚本。
这是我编程的骄傲,是我口中「编程」的定义

也是因为它有太多值得我学习的地方。比如 (FS .txt/[a]):[str] str("Jack"~~"Rose") 就可以完成编解码+IO 。缺少了 Eq(两换),停留在 fromStr/toStr 的认知,是做不到这个程度的

就比如4天前的Svelte5 大会吧,

ww.eg=({width=10,height=20, it},

w1=width.as(x=>x*1),
area=Saw((w1,height)=>w1*height )(w1,height),
)=>
div(
(s,e)=>{Saw(console.log, area); 1..s.then(it({width:20})) },
area
)

都能写得这么规范,要React那些函数式框架有什么用呢?

说白了,就是js数据模型的缺失,导致jsx和vue那些模板一套一套的。 稍微允许[a,b,1.] 变量入驻数据,给let[]= 匹配加点料,DOM本身就是MVVM框架

#recommend 重构浣熊
https://refactoring.guru/refactoring/when
#PLT #OOP #design

☺️ 绝句的OOP部分完结了。 包含type,name,named 「典-构造器 interface」「名-class」「曾名-加构器」3种概念

type 类似Rust的 enum Either{A(A),B(B)} ,但可以外部扩展

type Zoo impl??
Zebra(:Name,:Age) //<>列方向是cols
Elephant(:Height) //^v行方向是Conds

type Zoo
power Int
Tiger(); Lion() //和enum WithData()一样,生成构造器

type Inc Int{>0} //类型只是N个字典+几个新词的组合
type 'T'Pairs [T T Col2] //所以,没有啥typealias

named 类似inner class,但可以外部扩展 Point(0,0).Arc(10)

type Any
Point'xy'(_:Int)

named Point.Arc(r:Int) //加构器
- draw 画圆

好吧,写错了,Any的Point构造器,理论上无法继承:type数据间不可以组合

但name呢? 传统的 abstract class有啥用?? 我很想扔掉它们,我在SO上搜了很多,但没人说服我为何「组合优于继承」(甚至这句话居然是OOP专家说的

type Geo
- draw

name Point'xy'(_:Int) Geo
^type
- flip Point
^type impl
- draw 画1px圆

这个语法是为OOP兼容保留(override fun 啥的太扯了),好像比接口多提供个构造器、protected复用(被Utils取代了)、final等「更准的函定性」

但它对语意真的没有啥贡献? 只是像Scala那样,简单把同名的 struct+trait 连起来,而且逼你单继承??

我是更看好Rust的impl式多态,包括py的Protcol,虽然很复杂 {}构造器也很乱,但类型的限界都很清楚,不像今日JVM C# 这些接口子类分不清的

---

其实我清楚,class比接口允许「更准的构造顺序..函定性」,它根本就是--js的传函数字典 ,或者说类=可改传的多项函数 接口=dyn字典

如果你写过愚蠢的 android.view.Listener ,会发现它们乐此不疲地把本该叫lambda()-> 的变量搞成override,所谓的设计模式。。。

^type 就是默认参数的另一种写法而已,而 ^type impl? 可以选择不封闭既有值

绝句主张函数与Fn值的统一,但考虑 - f'xy' 和 F.[Int Int a2] 本不一致,无法在语法上实现静态-动态类型的交融

期望未来能找到更彻底的「解决语法」(想到一个,除了构造器、加构器, 还有 type mv(src, dstFile) 这种「默认参器」
只要我换成 name mv(src, dstFile) ,是否就把函数和class联系起来了? 😋


btw. 绝句的结构写起来真是太爽了,可惜表现力比不上纯数据的JS。 希望在词级 算式级 也有更新的发现

btw. 我打算把语言改叫《海经》了,因为这个时代,已经不适合在单句和算式级别,纠结代码怎么写了。 手写的代码都在词乃至类型级别, 而且绝句一开始是为逗句缩进起名, 但如今它的对象和集合模型比缩进有趣一些
duangsuse::Echo
#PLT #OOP #design ☺️ 绝句的OOP部分完结了。 包含type,name,named 「典-构造器 interface」「名-class」「曾名-加构器」3种概念 type 类似Rust的 enum Either{A(A),B(B)} ,但可以外部扩展 type Zoo impl?? Zebra(:Name,:Age) //<>列方向是cols Elephant(:Height) //^v行方向是Conds type Zoo power Int Tiger();…
啊,真好。问题解决了 🥰

name Point'xy'(_:Int)  Geo
^type
- flip Point
^type impl
- draw 画1px圆

type draw默认参(x=0,y=0) Geo
- flip 不翻转
- draw 同上

draw :.
-y 10
-flip 翻转函数


这样让默认参器基于函数值,OOP和FP,二者就对仗了
duangsuse::Echo
#sql #ts Prolog 牛逼! 正确的关系式搜索+ 同时实现 parse 和 toStr 😱 #zhihu 灵感来源 e(E) -->{E = [I,Ea,Eb]}, %重写规则, 'eX'为优先级 %利用 链|e1(E) 括住内"*/" e1(Ea), op(I,"+-"), e(Eb); e1(E). e1(E) -->{E = [I,Ea,Eb]}, e2(Ea), op(I," */"), e1(Eb); e2(E). e2(X) --> number(X); ("(",…
#PLT #sql https://zhuanlan.zhihu.com/p/646479383

Z3-SMT 是SAT(可行性求解器)的增强版,即一种sympy 。比Prolog更擅长解数值,甚至能解数独(迫真 ,解决cargo的依赖版本(原神

from z3 import *
A, B, C = Bools('A B C')
# 创建一个求解器
s = Solver()

# 添加约束条件
s.add(Or(And(A, B), And(Not(A), C)))
# 检查是否存在解
if s.check() == sat:


Z3的API这么复杂,又要add check 又.model的, 不如和Keras做个联动,支持机器学习+逻辑编程好了。 哦,原来 state.add(x==1) 只能执行1次 不是flowgraph啊?
这API还真挺Pythonic
这种问题貌似Prolog不用限定类型都能解。 定义 Bool(A) 无非是为了重载,那And(bools) 有啥别的语意-即搜索范围呢? 强类型逻辑式编程?好奇怪的搭配


稍微对比几个同类项,都不会这么白象化逻辑式编程


#zhihu 上看到一些逆天观念,C的设计错误:

1:单返回值这个设计可能是受了数学上的f(x,y...)的影响
真的需要多返回值的时候,C就只能用指针搪塞一下了
2:连续不等式
如果 a > b > c, 则……
3: void不是类型

1. Go就支持func (ret, err) 。所以不仅调用难以组合,Err体系也给弄成错的,因为err!=nil时函数不可能有值
2. 写成 (a > b > c) 还是 (a>=x>=c) & (a~b)(x) ? 过了这个村, for(x) 和 x inbounds range 就不可能一致了
3. 数学没有void,所以我赞成省略类型=void

还有一些不逆天的C错误:

"\0" 不是数组,argv无法单作为值
赋值是表达式,而且允许
for(;b-c;) c+ --b; b--;//c+b-1, b-=2
强制转换语法 (T)+xx、类型前置,这个的影响非常深远,带来的麻烦无穷无尽
if, while, for 的小括号和大括号,switch break
for (i = 1; i <= 10; i++) ,这个 (1~10):[i] 也很毒瘤了
duangsuse::Echo
#PLT #sql https://zhuanlan.zhihu.com/p/646479383 Z3-SMT 是SAT(可行性求解器)的增强版,即一种sympy 。比Prolog更擅长解数值,甚至能解数独(迫真 ,解决cargo的依赖版本(原神 from z3 import * A, B, C = Bools('A B C') # 创建一个求解器 s = Solver() # 添加约束条件 s.add(Or(And(A, B), And(Not(A), C))) # 检查是否存在解 if s.check()…
还有一些FP的错误 #design »=:

(我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」

- 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜

Python,Rust,Go 都使用了self参数,我觉得rs有 &mut self 和new()模式还算有理由的(当然这比OOP Factory还丑),但那些过于执着理论优雅,忽视程序员阅读时间的设计,还是不可原谅,还不如JS的f.call(this)

- curry 更是一种堪比Builder的,对传参的过度设计。它没有(还不允许有)名字,所以和那些新语言的 tuple(vs. Pair) 一样,造成了()函数或{}结构间的不一致
- FP好像都有「优秀的模块化和列表处理」,但对比py的同类项就会发现那些只是「因祸得福」。FP的所有工程性技巧都建立在这种“妙手”偶得上。正常做法的SEO被他们挤掉了
- 高复用组合、语意化、响应式 并非函数式的专利,而是它们做的功能少,而以为自己更懂原则 😅。它们的定义式还不如Excel

- 纯函数不够对称。基于(可loop化)递归的算式,本可以兼容 A+1, 1+B, A+B 这些逻辑推导的情况,但FP们空有一堆公式,却连 A=1,1=A 都做不到,还需为 pat match 内定语法!
- FRP Reactive 和各种State,Signal就是因为缺少「模式作为值」诞生的。 既然公式该作用于「变量」,副作用又指什么? 全局=值, printed="" 能改变关系算式(引用透明)吗?
- 数学不优雅。 数学用x<a,用A=[x y] 处理数据时,没考虑定义-引用双侧的简洁性 (区间,访问链,.)。 这导致加法独立于函数: 1.+(2).+(3) vs +(+(1,2),3)
确实数学不只是符号,但像数形结合时,也只能说Desmos,matlab和GL比手绘好得多、有条理的多,相信对几何图论也是如此

- 真正区别了 (+) vs (++) 的是物理性Vector,而Haskell没有哪怕为 List Int 实现加法,却说""+""和1+2 的交换律不一样。所谓「无意义的严谨」 🤓
- (&&print) vs (&) 这特性就像赋值表达式一样,是已被a?:b修正的可读性灾难,而函数式竟把 pass by lazy 当高性能卖点-这还不如Go指针/C宏 的多返回

- 就像0+1,Monad范畴也有自函子id作为(+0) 。而Monad.map就等同于this链,链处理当然好玩—而且无赋值,比如 obj?takeIf{}?.let{}yield (yield needFetch).blob()
所以IO Monad 还可以处理异常(级联返回)。但这值得业界学习吗? 比如 xs.map(x=>),fold 的语意该是 xs.as:[x], xs(Sum) 或Eqs(A,B)双转化
Ramda 和各种 immutable data 已经给JS带来很大麻烦了,还被说不严谨 ,其实那些人就是闲

👀
总而言之,但凡在加某种语法或「特殊处理」前,稍微想下使用频率,去与既有语法对比下, 都不会传承这样的问题
数学的问题是过于形式,缺乏读音和链式表达命名, 但某些编程就是太「实在」了,早该分析词频,删掉某些过度设计和常用词了
duangsuse::Echo
还有一些FP的错误 #design »=: (我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」 - 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜 Python,Rust,Go 都…
https://www.zhihu.com/question/631144121/answer/3299457578

#js #java #web #news React系还有一张刁图,让我感叹 sql`${}` 居然都能成为稀奇事(虽然之前我想用但没找到包。貌似用BaaS有 prisma
目前还只有JS能做str安全注入

当然20年前C#就支持ASP, Razor还支持 <button formAction="@( () => await Db( $"INSERT INTO Bookmarks VALUES ( {slug} )" ) )" >

前后端同构当然更合理(并不是像PHP那样的伪共用),但不要区分use client和use server更好

原来Javaer才意识到自己只是 CRUD boy??
duangsuse::Echo
还有一些FP的错误 #design »=: (我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」 - 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜 Python,Rust,Go 都…
#PLT #FP https://www.zhihu.com/question/28292740/answer/3297148810
看 moonbit 提到 (Node)Visitor 设计模式,觉得有趣就复述下 👀

Lit(1):Add(me,Lit(2)).eval==3

?? Expr
Lit'n'
Add'AB'(_:Expr)

- show me .:
Lit: "{n}"
Add: "{A.show}+{B.show}"

- eval me .:
Lit: n.[Num too]
Add: A.eval+B.eval

因为OOP无法外部扩展fun,但能加子类,所以请Visitor松耦合(py astor 靠字典,无需样板代码)

?? 'R'Expr.Vis
- as(:Add) R
- as(:Lit) R //因此 Lit'n' 有 - as(f:Expr.Vis) f(me)

me Show() [Str Expr.Vis]
- as(:Lit) "{n}"
me Eval() [Num Expr.Vis]

按道理 Show(add_3) 比 add_3(Show()) 优雅。但谁叫OOP是靠this @singledispatch 。不过OO的overload+override比Haskell归类性好多了

Oleg Kiseylov教授等人提出的Tagless Final技术,那就是直接抽象Expr的构造器集,这样函数会随着新子类被覆写,就像 Factory (天哪,FPer在搞事情前都不查重的吗)

-'V'(V [Int ExprV]) code1  V.Lit(1)

funcs Vshow [Show ExprV]
- Lit(NAME, :Show) show.res
funcs Vpostfix //逆波兰化

?? 'u'ExprV
^name
- Lit(:u)u
- Add'AB'(_:u)u

?? Column
Show(res:Str)
Eval(res:Num)

?? 'u'ExprV1 ExprV
- 添加的Node会被新V1show实现,因为现在Lit们 是能被class的函数

其实呢,[Show ExprV] 等于 [Str ExprV],这么写是因为 Haskell 的 class (Exprv t) 是按t重载的,不能手动指定Vshow

static成员实现不是subtype-=元类 时能做到的(这相当于有能+接口的“全局工厂” 比如说.. Gson 的那种)
同样, IntArray() fastutil 这些用复制粘贴特化泛型,也是因为 class 不是能被overload的 fun
但, #Rust 它们就是因为self参数,才这么无结构:

trait ExprGADT {
type Expr<T>;
fn lit(i: i32) -> Self::Expr<i32>;
fn neg<N>(A: Self::Expr<N>) -> Self::Expr<N>;
}

魔法并不是免费的,我们要牢记它的意图场景。
#FP #statement
https://www.zhihu.com/question/596624832/answer/3091106978

Lisp应该不算函数式编程语言吧,它唯一的好处就是在只有C--BCPL的世代支持了GC、选择了非符号的括树风格,用链表取代单步forif。 但是心智模型依然在C99附近徘徊啊,强检查数据之外,其范式并没有比C出众吧?甚至Lua的闭包和yield比圆括号们跨场景对称

范式说到底是「拆分数据上文」的方式啊。 无论FP的单方法函数、高阶组合、tvar窄化推导+GADT,还是OOP的多方法函数、this链、<T>+extends,直到运行时强转的语言……决定软件质量的并非自动测试,并非理论,而是对领域上文的正确列举

所谓PLT,编程语言理论, 就是为了正确理解应用惯用的输入结构、的分层次逻辑。只为尝试茴字的全N种写法 去学咋做翻译器,是种工程吧?

其实在我眼里,Haskell也不能算「定义式编程」的。 反而是numpy,ffmpeg,Matlab,Word这些软件拥有最定义式的、纯度最高的代码接口,而且,它们才是数学和线代的最前沿。把计科理解为数学的人,真的单纯得可爱。


一些连「行前缀重复」都消除不了的语言啊,连细粒度Reactive都改靠lazymemo的纯函数,鼓吹什么point-free (本质是this链) 和类型推导与扩展性,怎么看都不入「定义式+函数式」的大雅之堂吧?
无论类型还是函式、算式的定义语法上,都有2~3种“同样优秀方案”的语言, 能设计成这样的“形式化”语言,被称为优美且自然吗?

何况,基于 trait{} impl{} 与局部(associative type) 式的多态(multi-typed),不能说比子类型和<>类型好, 只能说是毫无使用处,而且在故作高深vs拖泥带水间反复横跳吧

倒不如说,这些语法项的选型,就是因为无用处才能显得混乱。 一旦有了能改变旧套路的灵感,没有什么理论是不能赋予价值的,哪怕只是看个乐子,都比只把跨界复制当作学习融入的人们强


编程语言呢,不是指责顾客挑食或“愚蠢”的 世代都有的聪明人。它是把烂程序、烂写法削好吃的厨师

魔法与应用,是不能对立的。 好的白魔法,终将取代黑箱子里的坏魔法。 像我这样,却会觉得JSPy,rb更懂纯函数DSL, HTML+CSS或JSON就是语法树和宏,Prolog就是更好看的SQL或Excel

编程技能不应该特殊化。打败程序员的,往往不是同行,反而是跨界的新手
有时也觉得 #CS#IT 界挺魔幻的,60~70年前的矩阵和协程,Lisp式的DSL,到今天还有框架 😔

当然,numpy和 Go func, kotlin.coro, Rust derive宏 已经远不是Fortran,OpenResty那些东西可比拟的

但究其根本,我觉得今天CS+IT的佼佼者,不少lib依然在犯70年前它们先辈的错误。
对于协程这个特性,究竟是DOM,node那样不靠package就包揽一切,还是像Go那样作为噱头,Erlang那样基于Actor,Kt这样与时俱进 最为正统呢?

拿js模拟过……
 总之就当自动传f1(回调),f局部变量在回调中, 所以调用f()能选择何时何处执行
Kt的结构化并发确实很有意思,但要谈可用性,JS的手动撤销和自动Dispatch更实在

btw一句,我讲的比较详细,但我对CPS不感兴趣,
主要是为了把回调链表与callstack、OS线程 做类比。确实编译原理和OS是分不开

本群人均素质挺高啊,都知道coroutine是靠CPS
但我更喜欢不纯粹的理论

有时我觉得这些也没必要说的, 我反复思考有好几年了,但它们终究是三句话讲完的程度呢
因为JS最开始是 func*(){} yield Promise,没有async

async是因为JS不能直接把函续交给then,要先yield给执行器(对等协程vs上下级协程)

Ruby的call/cc, C的"setjmp" 就是对等协程,它们符合CPS的刻板印象但不好用…… 总之异步编程反人类
异步编程也可以很美好的,比如 Reactive 就遥遥领先于Java,PHP这一套。 Nextjs应该是新时代的服务端语言

我想,大家都被限制在自己的编程生态圈,不去思考这些差异背后的进步方向,可能才是编程之道吧……

可能直到AI广泛辅助编程,这些问题都不会有答案
但我清楚AI无法完成写法的形式化,只能从根源上,让用户指定开多大线程池完成多少种Task,这些术语的差异才会伴随着“优化选项”消失

C 那种argc+argvec 的list,也只是术语的差异吗? 恐怕除了样板代码的多少,这些语言作为“app设计器”,也有根本不同
——
在我看来,无论是工业界最流行的语言,还是协程的理论讨论, 都是没有取得统一模型的
换句话说,每个语言有它的优点
这不是一件好事。 一个没有取得共识的工具,会阻碍人的泛化思考,会把编程当成一件机械的编码任务

其实明白编程和数学里的泛用性,又如何呢? 有人为此挣到钱,有人选择删了公开博客, 但到最后随着时代向前,知识也没啥可稀奇的吧

即便如此,我选择把编程视为一种乐趣和创作。
我不需要言辞间的“朴素” “平凡不难”,对于创作者来说,灵感,才能成为汗水里掷地有声的内核。 🕊
Forwarded from 层叠 - The Cascading
Mozilla 发布 llamafile,将 LLM 模型打包为「跨系统」的单文件可执行格式。

llamafile 可以利用 llama.cpp 及 Cosmopolitan Libc 将 LLM 模型(它们通常有至少数 GB 大小)的命令行版本或网页版本打包为单个可执行文件,并可在 Windows、macOS、Linux,甚至 BSD 系系统上执行。

- https://github.com/Mozilla-Ocho/llamafile
- https://hacks.mozilla.org/2023/11/introducing-llamafile/

#Mozilla
#design #plt
最近在整理的编程范式有点让我头疼…… 这个或许对学OOP有帮助吧:

//行列状多态,就是说一个类型由 字典C=A+B 定义
?? C A
b1 Str
- b2 Int

//以上声明里没写,故需要另加构造器
?? C
Cat(name:Str, b1="demo")
- b2 b1.(0).Int
Camel(ver=0)
b1 "Hi"
- b2 0

这样的好处是 sealed,data class 都非常简单-甚至多种子类都语法一致,与 #Haskell GADT 不同的是,它支持附带函数与隐式this

?? 'AB'Columns //泛型,单位状类型
Pair(:A,:B)
Triple(:A,:B,:C)

?? 'AB'way2
posL [A mayNO] //val posL: A?
posR [B mayNO]
Left(v:A) ; Right(v:B)

如果是新类型,还可以定义Enum甚至表格

?? RGB
R;G;B
?? 调料
甜 Int ; 咸 Int
- 咸 id==1 or 咸>1
醋 (0 0)
盐 (0 1)

学起来有点让人费解(当然这是我设计的), 虽说类型和值都是「构造器」,这样的大杂烩也太奇怪了(但,比用到再单独地学好吧?)
duangsuse::Echo
#design #plt 最近在整理的编程范式有点让我头疼…… 这个或许对学OOP有帮助吧: //行列状多态,就是说一个类型由 字典C=A+B 定义 ?? C A b1 Str - b2 Int //以上声明里没写,故需要另加构造器 ?? C Cat(name:Str, b1="demo") - b2 b1.(0).Int Camel(ver=0) b1 "Hi" - b2 0 这样的好处是 sealed,data class 都非常简单-甚至多种子类都语法一致,与…
不过和Rust蛮搭的,甚至比 struct,trait,impl 方便(1个 ?? 把这仨+enum 都包齐了)。 这些??本质上都是1+N个 OOP class

而abstract class 更适合用「段造器」,就是需要传入 参数+override fun 的"类函数"字典。标准写法称为三段论,第一段仅限重写函数和注解/变量

my Row() Animal(id:Str)
- Str "野兽罢了"
^??
age 0
- speak Str
my Animal
- 年轻 age<3

很丑吧?这是向Rust看齐(我讨厌 struct+impl)

my [Animal]Dog() //复制器即
my Animal(id) Dog(id:Str)

?? Animal.Dog() //加构器,不支持三段论
?? hello(name="Jack") //加参器,用于多次调用。btw, 三段论的第四段是 ^name 即 static{},不需要fun语句或匿名object{}

怎么说呢…… 我觉得 行列状多态、单位状类型 吊打Kotlin,但段造器也太破坏画风了,可以视为故意做烂的语法盐

由 ??,-, my 新建的词都可以被“多音”,这是此语法的某种底线,所以class才必须拆成open多态和final扩展两部分,减少耦合性

过度重视外部可扩展,不一定是好事。接口化的东西难于设计,但是,VB那种难于扩展的语言都被淘汰了

姑且就把「段造器」视为「行列状多态」的补充

真的好复杂啊…… 整理的时候还又简化过了 🙄
想要保留kt的兼容,就是需要class继承,但这么一想,非要隔离struct和方法又很不OOP
1
duangsuse::Echo
#design #plt 最近在整理的编程范式有点让我头疼…… 这个或许对学OOP有帮助吧: //行列状多态,就是说一个类型由 字典C=A+B 定义 ?? C A b1 Str - b2 Int //以上声明里没写,故需要另加构造器 ?? C Cat(name:Str, b1="demo") - b2 b1.(0).Int Camel(ver=0) b1 "Hi" - b2 0 这样的好处是 sealed,data class 都非常简单-甚至多种子类都语法一致,与…
昨天提到的头疼点,现在修好了,希望以后能实现吧

顺便读篇#zhihu 文吧 https://www.zhihu.com/question/40675600/answer/3310038891


>代数数据类型是所有高级特性的基础, 比如 0 = never, 1 = unit, 2 = bool.. NaN=void
>定义和类型以及积类型(sum prod), 所有类型就都可以组合出来。相同的 ADT 编码意味着这两个类型本质上相同

首先,你想用实例的个数表达「类型」? SQL Table 就是如此啊,但是有啥用
比如你想做DFS吗? 链表又对应哪种数字? 加和乘,只有在穷举里才算有用抽象吧?

你能说说Unit值为何优于void吗? 对kt而言,`nul?: return` 必须是表达式,`listOf<Unit> ` 也叫“有意义”
但这语法仍然是种层级混乱的错误,还不如让异常作为值

对于向量,相同的维度算是「本质上相同」,但对于Int-Str 之类的格式而言,「等价」有比靠信息量更准确的定义

>统一函数和方法调用,写程序就能一 '.' 到底

问题主要是class T 的耦合性和反射,如果用 impl T{} 和宏就没问题了,这么说py也很面向函数

不过,函数=方法是需要查重载表的,可能要扩充全局作用域
另外, match,for i {break} 都可以数据化为dict或takewhile

>HKT 作为高阶抽象, 表达能力极强, 能有效减少冗余代码.

是吗? Maybe<T>, [T Maybe]类型 vs "T?"
Result<T> vs 具有特殊assert方法的 "T?" 哪个实用呢

这个Fine/Fail 很适合TAB,但如果 fetch()!! ; f?.run{} 就能错误处理,谁会用 if let=Some?

说到底,Monad链还是和CPS走得很近,CPS,传函续,拿语法糖封装后 也终究是会产生“回调地狱”吧?比如在fold时要手动透传Monad这个"this"..

>Refinement Type 消除代码中无用的assert,还可以附带SMT

Ada就支持整数区间检查,我发誓你不会想写那种代码的
当然强类型typealias取代各种check是好的,尤其,对Web后端友好

>Dependent Type

翻译这个类型体操,还不如写 SWI-Prolog.org ,同样是“y=x”检查,但人家的bool运算能告诉你,具体有几个类型匹配约束

>First Class Continuation, Call/CC

闭包里break,kt是用inline的方法,我觉得这是唯一合理的实现,其他都是滥用过程式编程

传函续可以实现函数级线程(有栈协程), forEach{break()} 属于是没捕获整个调用栈,是异步遍历-cancelTask
ruby callcc 反而是在模拟longjmp(),是throw的一种底层实现

>Delimited Continuation
语言级别的 fork.. 好像线程池Dispatchers

Linux滥用fork&execve 最初是因为pthreads不稳定, 说实话进程隔离除了防崩外,在有GC的语言里该式微了
至少MapReduce(Promise.all)和node不依赖多进程

传函续比调用栈优越的一点是,除了能实现yield(调用式协程) 它也是不依赖OS内核的线程
可惜是kt和rs的实现还不如Go简洁,kt更是把 launchThread.join() 玩得亲妈不认识了,非常地C++呢

所以,这些和 Algebraic Effects 有什么关系?数学递等式是小学内容吧? 还是说DFS深先遍历是数值算法?
蹭热度也要有限度的吧,我是说CS+Math概念股为啥这么不搭调。 CS人也要攀关系吗?

程序需要证明? 这和IT学生,用自己那几张电子表格去定义现实世界的「用户」一样逗, 还有那个被AI突破的 NLP领域,哦, 原来人类都是先学结构化语法,才有思维逻辑的? 倒果为因。

>effects能实现错误路径

py里用yield Err 也能实现catch,实际上js async最初就是这么来的
Java SEH <此设计< runCatching

这个catch 是在语句级实现了OOP class 注入函数的灵活性,我不觉得能inline有啥大不了的
Kt coro 在suspend前也不会创建状态机,但这个 effect f()->r 呢只是 open fun 的另一种写法,它不涉及闭包

作为函数的类型化,effect明显优于Monad和subtyping,但这里方向错了
把异常和协程混一起,最终也只会发现异常路径除了报错就是默认值,不值得作为流控,而且async任务也不支持0开销

第一点参数注入,OOP是基于class Context,对框架和DSL更自然,算是因祸得福,笨有笨的好处

『THE WORLD』是有进程级支持的,如果没fork不方便调试器重开的话,把『CRIU』移植到gdb上
比让编程语言越俎代庖强,不就是保留个调用栈的事,很新吗? syscall和线程调度都在做,知道原理就够了,老模型新应用嘛

>Partial Evaluation

Rust和Crystal都以0开销为卖点,C++则支持template和 constexpr int f() 两种范式的宏
常量折叠或至少内联,姑且是普遍的「分段求值」了,八成编译器并不包含源语言的运行时,也不支持Lisp qquote式的「符号作为值」

TS, D的enum T=f() 貌似更符合应用,但我反对创建类型体操和值“两门语言”
这样比reflect或codegen强,也曾是弱类型的专利,很好理解,因为那些垃圾静态语言连心智模型(简洁的AST)都没有,也不关心JSON和多态struct的绑定,只想着新语言能编译了

明明能“映射到目标语言”,却无法解释它,是很奇怪的事情啊! 尤其是要映射为“原创的”栈机或IR调用图。单独的编译步骤,算是蠢的JIT缓存吧

另外,py里很容易同时实现执行+翻译 双语义:https://github.com/duangsuse-valid-projects/TkGUI

btw. #js React #dalao
https://overreacted.io/algebraic-effects-for-the-rest-of-us/
^如果catch 能返回给throw会怎么样呢? 这类似依赖注入。 我想了会,觉得还是OOP扩充this.fun 比不透明地传递catch要好

https://overreacted.io/goodbye-clean-code/
^如何给SVG rect, arc. class Shape{} 开发编辑器? 不知道继承或接口的人为4个点加四个fun,然后组合为9宫格 .. 但他们赢了,因为团队比可维护性重要!

中国的精英主义,和普世的个人主义的主要区别, 是「是否需要向别人,解释自己的英明决策」, 这涉及人权vs工具人的不同。
爱因斯坦和费曼,并不是中式意义的精英

再谈到“战争贩子”的伪善,同样是种避重就轻: 不谴责宣战的慈禧,反而说练兵强武的李鸿章是资本家; 不反省自己没把对方当人,反说他们蠢,不可「教化」

降低重复的抽象、对特例的适配性,都是必须的。 因为,代码都是多余的,只有心智模型和设计是意义,而只有完全删掉重复才是专业性的语言

https://github.com/denysdovhan/wtfjs/blob/master/README-zh-cn.md
^#js 的 BaNaNa 等名梗,还要注意: .1+.2!=.3, [1,20,3].sort() 是按字符排序 🤪
duangsuse::Echo
#dev #android 面试题 🤔 - 技术上提升最大的一个项目,展开介绍 对比业界同种算法流行和不流行实现、重写自己的任何项目,都比从事GPT都能完成的原型要好 - 为什么选择 Flutter,在业务方面学到了什么 Compose界原神的名气真的太大了,居然能用Navbar,Tab等自带组件,居然能调style! - Java 里重载和重写的区别 在编译期vs运行期确定函数,改方法签名vs改子类值 - 什么是线程安全 避免共享变量(不相交),或使用Atomic/独占锁 避免读写异步 - Service…
#dev #android #backend 面试题 🤔
- OSI 七层是哪七层
物理,数据链路: WiFi,BLE,eth,rndis驱动
网络传输: IP4,6 , iptables, socket(TCP) UDP
会话表示 Header cookie,json
App 众多Web3.0论坛,.

- HTTP 在哪一层?有些什么内容?
在L5~L6,负责请求响应和MIME类型,暴露为 调用+回调 +Header环境变量
除了会话,HTTP也能做文件传输和填表

- GET 和 POST 核心差异是什么?
body是否为form等私密数据

- HTTP 状态码有哪些?
{2,3,4,5}xx 各指代: 正常 重定向 请求出错 服务出错

- Java 的基本类型有哪些?拆包解包了解过吗?
值类型8种:BSCIJFDZ, byte8 short,char16 默认int32 long64 f32 默认double64 bool
值在放入List,. 前被装箱为Integer,.
Str不能修改,但相等比较也需要用java.lang. 函数 ,称为引用类型

jadx 可用于反编译,但如果是aapt+dx 会默认混淆函数名的

- Java 的访问修饰符有哪些?类级的 final 作用是什么?
可见性 private protected public 默认internal=包私有
确定性 final abstract default

final class或成员不含(函数)变量,等价于struct,因此不应该生成可供覆写的get/setter

- Java 的基本类是什么?有哪些方法?equals 和 == 有什么区别?重载重写是什么?
所有类型的Base class 是Object{eq,hash,toStr ,wait,notify同步锁 }
== 只比较GC对象的引用,而 (1.equals) 需要先valueOf装箱

重载=编译期0开销查找fun invoke()的重写,静态类型的专利

- Java 的常用类型有哪些?immutable 和 mutable 的 list 差异是什么?LinkedList 和 ArrayList 的差异是什么?
java.util.可变性 是从Kotlin抄的,弱类型assert
一般,只在嵌入式设备用易于增长的链表

- HashMap 了解哪些?规避哈希碰撞的方式有哪些?
类似RegExp 地狱回溯,long hashCode() 作为分组key的相同,也会给DDoS可乘之机
因此,对于用户输入的field,可以将其忽略,只用str,int作为Key

C系语言一般用 BTree,AVL 二分法实现KV查找。 如果是要问带锁的/fastutil的 Map实现,或者getOrPut 等惯用法……

- 项目里用到了 Xposed,它的原理是什么?
作为Xp插件的apk们会被 app_process 随 XposedBridge.jar framework.jar加载
在活动前loadPkg时,利用变量或函数名(转为native),修改其JNI代码指针,使调用前先查找覆盖表

- 了解过哪些设计模式?他们分别是什么?
Adapter,Delegate,Proxy,Observer/ 类型转换或AOP覆写
Factory,Visitor,Chain/跨平台的new()方法, 判断"type"的方法, 事件冒泡

被新语言淘汰的:😅👎
Singleton,Builder-Prototype,Command/ 模拟字典、复制数据、枚举操作
Strategy,Bridge,Facade / 函数字典和import式模块

- 单例模式的实现有哪些?可以手撕一个吗?
JVM上的static 已经支持了RAII。也可以用DCL懒加载
@JVM_volatile var cache
get()=run{ //保证单次执行
if(null==cache) sync(this){ if(null==cache) cache=init()}
return cache
}
duangsuse::Echo
#dev #android #backend 面试题 🤔 - OSI 七层是哪七层 物理,数据链路: WiFi,BLE,eth,rndis驱动 网络传输: IP4,6 , iptables, socket(TCP) UDP 会话表示 Header cookie,json App 众多Web3.0论坛,. - HTTP 在哪一层?有些什么内容? 在L5~L6,负责请求响应和MIME类型,暴露为 调用+回调 +Header环境变量 除了会话,HTTP也能做文件传输和填表 - GET 和 POST 核心差异是什么?…
发现了奇特的OSI术语定义:HTTP是L7(应用层)协议

没错,在IP4层模型里,HTTP只能是应用层, 但就我对操作系统和Web传输的了解,负责MIME、托起HTML的http: 居然比FTP/NFS,SQL还高两层?

- 没错,HTTP自己就能作静态站应用,就像IRC。 一个被淘汰很多年的方向了
- HTTP如果是应用层,它的用户就是bot user 或者测试工程师吧?
- 那么,比HTTP高的HTML还是表示层吗? socket() 字节流「三次握手」称为会话?? 所以TCP,TLS不该叫传输层了?
- 那么,Accept-Encoding:gzip 和HTML里的charset="" 也算应用层属性? MIME这些由Blink或Flash处理的玩意,并不比HTML更应用层?

- RFC7230 的说法都是错的,对js和java而言,连接并不是无状态的
- 越来越多人在用 long-poll 轮询和cookie,而Header字典毫无疑问就是为了配置这些缓存缓冲
- 这种stateful 并不比 mysql:login 链接弱--SQL也支持多客户端
- SOCKS5 和HTTP代理, 因为需要登录,是否能算会话层? 但SOCKS明显和TLS一样,是传输层

算了,反正SOCKS也不够用,还不是要有人再外套一层混淆协议

当然这些OSI模型都无所谓, 那些XML,cookie,请求响应,投射到编程的世界,也就只是对象、句柄和回调 文件上传什么的
原来下发个文件就能叫应用层,curl wget netcat 叫客户端,这也太IP了 #linux #net #learn