duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
duangsuse, [2023/10/17 20:36]
是的。比如 水豚 可以从 Cat,Dog 强转
就像
data Rect'wh'(:N) [impl?]
- Square'l' Rect(l,l)

when- Rect Pos'xy'(:N)

- main
Rect(10,20).Pos(0,0)

duangsuse, [2023/10/17 20:38]
Kotlin 的写法:
fun main() {
Rect(10,20).Pos(0,0)
}
typealias N=Double
open class Rect(val w:N, val h:N)
fun Square(l:N)=Rect(l,l)

inner class Rect.Pos(val x:N,val y:N): Rect(w,h)

Loney Chou, [2023/10/17 20:51]
fun Rect.Pos(
x: Double,
y: Double
): Pos {
return Pos(x, y, this)
}

open class Rect(
val width: Double,
val height: Double
)

fun Square(dimension: Double): Rect {
return Rect(dimension, dimension)
)

class Pos(
val x: Double,
val y: Double,
rect: Rect
) : Rect(rect.width, rect.height)

duangsuse, [2023/10/17 20:55]
''N=_N8
''Int=Int4


这个 ''typealias 也不是乱加的
''Cnt=Int{>0}
when-- 'AB'as
Pair(B:A,B:B)


'A'T 代表“T是A类型的单位”
就像 'AB'KV, [KV Int Str]

duangsuse, [2023/10/17 21:00]
背后是有体系的
单位类型、from/to 转换、单组/多组/多种 类型,正好能适配序列化器的创建

Int就被视为单组var
User是多组
Any是多种


'' 这么省是方便移植公式
- lerp'ABt' t*B+(1-t)*A

fun(:Double)= 就不知道有多长了

duangsuse, [2023/10/17 21:03]
Int4,8 也是为了避免麻烦
大家都是按Byte读写

没人会做bitflags 这样的事了

duangsuse, [2023/10/17 21:03]
$Y,$N 是 YN, Bool
NO 是 NO?, Nothing?

duangsuse, [2023/10/17 21:05]
bit 我也重构了,趋向与BitSet一致

1.Bit+2 or
- and not
1.Bit in 1 and交集
xor就是xor, shl8 是 1.Bit(+8)

这样,拼接8bit 的算法可写为

[1 2 3 4](Sum(0x0): A.Bit(+8)+B)

duangsuse, [2023/10/17 23:39]
#FP 读了一篇文章
data 'T'Box(:T)
//map:: (a -> b) -> Container a -> Container b
- 'TR'Box as(:Fn1) Box(fn(it))

Box(2): it+2
Box('flamethrowers'): it.toUpper
Box('bombs'){it+' away'}{it.n} //10

when-- 'T'Maybe
No; Just(:T)
- isNothing as[No]!=NO
-'TR' as(:Fn1) as[Just]?{fn(it)}:No

(0~3):[i]
Maybe('abc'){it.get(i)}: say(it)

when-- 'AB'Either
Left(x:A); Right(x:B)
//Left<A>(): Either<A,*>
-'ABR' flatMap(A:[Fn1 A]-[Either A B], B:[Fn1 B]-[Either A B]) when this:
Left: A(x); Right: B(x)
-'ABR' as(A:[Fn1 A], B:[Fn1 B]) flatMap(Left,Right)

duangsuse, [2023/10/17 23:40]
🤔 剩下两章不看了。 其实绝句的fn{}{}: 比任何语言(比如,do记法)都适合写Functor, 而 '1'(Eq(toInt,toStr)):+1 ,比 T.[Fn A B]->[Fn [T A] [T B]] 更像lift的语意

如果用CPS(调用都返回给'函续')理解Monad,IO,Either的职责就是一个协程调度器,负责链式if,传递catch
纯函数不支持全局(堆),也难以靠多this这样来组合算式,这么依赖栈来“赋值”和IO,很好理解

从这个角度 我觉得教授Franklin比我狂,他大方表明了PF粉对重赋值的厌恶,即便 ^^从工程的眼光^ 来看,PF函子只是用拙劣的模型实现了注入变数的函数。它们没比逻辑式编程通用到哪去,我观察到F口中的优雅是“>10次出现,未定义”+“定义后未使用”
而且,注入这种烂特技,在Java里都要被模块替代了

范畴论有点奇怪。 既然 f:A->B 是一个1:1的映射,就说明 f: B->A 也该存在,不然强调1:1干嘛呢?直接说调参可memo更严谨。

把反函数补上,就解决了数据绑定乃至IO问题,这正是React的取代者所号称的Signal>State ,然后函数式的身价就会像React诞生时一样飙高。
虽然React,Ramda对定义式编程完全是个白痴,它的写法和术语背后是另起炉灶+东拼西凑。 那些PF粉丝说的优点,他们自己可懒得践行。对代码质量的追求再高点,可不会被纯度挡住定义式的心智模型

不可变的数据树 很“确定”,但你还是要把它绑到参数里memo,重写。直接在参数改变时重算,与调用栈和对象的层次解偶,还用memo什么呢?如果type checker 没副作用,这么做也不算,它只是替调栈做一次模式匹配而已。
duangsuse, [2023/10/17 14:22]
看多了代码,已经不习惯写议论文体了吧

这样的话,你维护的项目,也一定缺少一个大纲或设计思想。

duangsuse, [2023/10/17 14:33]
这种事情GPT比较懂,你问它好了

一般来说,群成员多样化应该是好的。 我见过一些书籍分享群,没几个人说话

duangsuse, [2023/10/17 14:40]
还真是。 我在写的一篇总结文,就打算囊括我这几年整理出的一些术语的定义

基本上,一篇就可以抵过我5年的试错史了;这类文章我每天都在写,不然还真写不出来

Omico l Dev, [2023/10/17 14:42]
其实无外乎就几种情况:
融汇贯通,盖棺定论。
似懂非懂,犹豫不决。
自以为是,似是而非。
不懂装懂,口出狂言。

而上面这种就是第二条,所以看不懂就先放着。

duangsuse, [2023/10/17 14:46]
-科学就是盖棺定论, 不追求代码API的一致性,就会像py2to3, kotlin 那样改来改去
-我刚刚还批评过Silence的犹豫不决, 并且明确说过,我反对不易懂的解法
-比如? 无论据批评==似是而非
-同上,你的论据?

duangsuse, [2023/10/17 14:49]
我的批评,一般对事不对人

我引用的链接,不代表我懂那些东西。上面也说了,只是观点

duangsuse, [2023/10/17 14:50]
无论据批评==似是而非

看似你批评了,但其实不涉及具体编程问题

duangsuse, [2023/10/17 14:51]
对我来说,只需要有观点和写代码的精力, 哪里有甚么懂不懂的

编程是种模棱两可的抽象, 只要能完成需求,你只用AI也是懂的
懂别人的才叫懂? 那些软件缺了哪种“优化技巧”,照样转。

duangsuse, [2023/10/17 14:55]
对于既有的理论, 确实有「懂不懂」的说法

但对于解决某种(根源问题)的方法, 就只要有不同的观点,就这
duangsuse, [2023/10/19 17:47]
你也自己处理一点啊, 你这提的点子都是什么地狱灵感

Ketal _Q_ray 🍥, [2023/10/19 17:49]
线程成本太大了复用不香吗

duangsuse, [2023/10/19 17:49]
他讨论 的是并行加速吧

duangsuse, [2023/10/19 17:50]
就像游戏一般用UDP而非流式TCP

如果读写竞争,造成的是浮点级的误差,还是可以忽视的
你想多CPU,就线程, 只是想做事件,就协程

isekiのChannel, [2023/10/19 17:51]
我估计他不知道什么是CPS

duangsuse, [2023/10/19 17:51]
传函续调用,自动回调呗
delay(1s, callback)

如果你连并行(parallels)和并发都分不清,还是不要处理读写竞争问题了
并发是不会有竞争的

Silence Acappella, [2023/10/19 17:54]
那能不能这样,一个scene就一个线程,然后访问啥的,全部由scene内部的这个线程将信息发给玩家

duangsuse, [2023/10/19 17:54]
说起来,如果你需要传Blob
WebTransport https://developer.chrome.com/zh/articles/webtransport/
已经成熟几年了

Silence Acappella, [2023/10/19 17:54]
一个时间点只有一个指定的人能操作

𝗿𝘂𝗮𝘁𝘁𝖽 { 𝗍𝗁𝗋𝗈𝗐 𝗻𝘂𝗹𝗹𝗽𝘁𝗿(𝒊𝒕); }, [2023/10/19 17:54]
你应该考虑把信息交互做成非阻塞而不是考虑用多个线程

duangsuse, [2023/10/19 17:55]
唉,又是这样的伪需求((

Silence Acappella, [2023/10/19 17:55]
我原本用的是springboot思维,多少个service多少个线程

duangsuse, [2023/10/19 17:57]
>这让我想起了 server-socket() 的 bind() accept(N) 问题

其实这个N很难决定,一般都是框架做调整

—今日玩笑
AI回复我:
🤔👨‍💻💻🔌🔗📡🤝

不愧是Java,自己造了一个WS子协议

我以为吧RPC映射到 /http/?params 已经很离谱了,把已经靠“endpoint”拿到的WS,也转换到http路径, 不就又凑到了大量字数?
真的很Enterprise
C线程就是Linux调度的协程
协程不能并行,没有CPU竞争问题,语义上被确定为调用返回

所以,要read()就需要占线程,阻塞它的调用栈; 靠创建线程sleep太耗时了,而且不能返回值
要并行用SIMD和numpy GPU就行
不然应该是要锁和原子加减法
这也是OS在支持 epoll(select) 的原因

理论上,OS就像VSC那样,可以单线程运行和IO,而其他Workers 只负责加速
Forwarded from dnaugsuz
>请用Kotlin KSP 实现为每个 class A_XXX {} 模式的类的 companion object{} 添加 val XXX="ok"
AI完成的不好,但给了大体思路。请参照
-moshi 修复类同名例的生成
-KSP入门

package com.example

import com.google.devtools.ksp.processing.*
import com.google.devtools.ksp.symbol.*

class AddValProcessor(private val codeGenerator: CodeGenerator) : SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
val symbols = resolver.getSymbolsWithAnnotation("com.example.A_XXX")
symbols.forEach { symbol ->
val packageName = symbol.containingFile!!.packageName.asString()
val className = symbol.simpleName.asString()
val file = codeGenerator.createNewFile(
dependencies = emptyList(),
packageName = packageName,
fileName = "${className}Companion" //
)
file.appendText(
"""
package $packageName

class ${className}Companion {
companion object {
const val ${className.toUpperCase()} = "ok"
}
}
""".trimIndent()
)
//if (symbol !is KSClassDeclaration||symbol.classKind != CLASS||symbol.modifiers.contains(ABSTRACT)) {return@forEach}
}
return emptyList()
}
}

dependencies {
implementation "com.google.devtools.ksp:symbol-processing-api:1.6.0-1.0.0"
ksp "com.google.devtools.ksp:symbol-processing:1.6.0-1.0.0"
}
>我就想拿来拼个变量,整的太费劲了
你要感谢Java支持多行版本的这个,因为MyBatis等SQL Mapper 实际上做的就是这个值模板工作

https://openjdk.org/jeps/430#:~:text=String%20interpolation%20is%20dangerous

预期的STR实现: https://cr.openjdk.org/~jlaskey/templates/docs/api/java.base/java/lang/StringTemplate.Processor.html

>请用 Java STR."txt \{arg}" 模板字符串语法,实现对for列表模板的支持

var a="Jack Rose".split(" ")
TXT."hello:\n \{a}{'.'\n}"
hello:
'jack'
'rose'

AI不会,可能它会JS版的。

>请用 ES6 fn`txt ${arg}` 模板字符串语法,实现对for列表模板的支持
好吧,它不会。但基本上,可以这么写

STR=(s,...a)=>a.reduce((sb,x,i)=> sb+x+s[1+i], s[0])
STR`100${2}4${2}` //'100242'
#PLT #design duangsuse:
好用编程语言的标准,首先是好读

绝句有 Int/Inc1,2,4,8 代表有无符int, _N4,8 代表浮点,N2向量实现了复数,没有无理数

Inc.Ln 实现mutableList, Nd实现矩阵 ;所以这些命名都是既准确又广泛,因此译为 i:_数4 size:增 arr:增.行 也没毛病

这种堆砌偏旁八卦表示整数的语言…… 不得不佩服作者打字的功底

https://docs.racket-lang.org/ming/preface.html

我觉得最离谱的是…… 作者好像是基于认真的学术目的,来做这个设计的……

哪怕把 if else 换成 if or,统一下 Nullish 和 a||print 都比面向字母编程好啊

复数真的是纯负担。计算机人不该研究复数。虚数就叫imag,本来就没语意的玩意,翻译个 🐤

shadertoy.com vec2多好啊,xy的语意性比实虚好太多

Python还有呢,写FFT时还不是被3b1b解释为向量旋转(而且根据欧拉公式,就是物理上的矩阵运算)。

再说线代的东西,也可以理解为“超平面”,但那些B连 sympy.plot(x=y隐函数) 都不会用,还在讨论空间

这么离谱的设计,还说Scheme有复数

有没有是一会事,能不能用另说。
lisp系的模块化太差了,这些 (num? 不就是搞原型链查找吧

number? 就是123常量的类型,但它的加法是用不可扩展的方法def的,就是说Lisp系的类型系统没有比VB进步太多

Haskell class Num 算是一种多态做法,但它的类型判断要靠模式匹配

弱类型不适合区分整数/正数这些概念,像JS那样 BigInt(11n ) 就挺好。 你与其区分数值是否exact,不如像 Ruby 那样直接加obj.taint,“避免注入攻击”,或者学 sympy.evalf(自由精度)

凭什么builtin 就比用户def高一个档次呢,不是一等公民4

就是因为不可扩展,或者说框架级无序,才会复杂。numpy哪里复杂了

假设hs是基于 data May2=A a|B b 的弱类型,那就能直接判断

这就是我最讨厌的一点,因为类型和值域是要区分开的

exact不就是个bit标记吗

weak是指检查弱
dynamic是指不在符号期(重载查找)检查

我一般说弱=动态类型,然后C是弱检查,py是强检查

你都已经不区分类型了,区分值域就很搞笑。 那是在混淆数据的check和type

总之,类型是一种先验的特质, 晚检查实际上就是不对def进行归类。 而把 positive? 当类型,就势必要在序列化或传参时实现validate,不然没意义

就是说,Haskell的 tagged union 才算弱类型

举例评价下此「中文编程」设计思想,格式为
名:文档
^绝句的写法
批语

双(阳阴) : 把两个数据配成对,即成一个双
^ [数 文 俩项] 1|"2" [数 仨]
^ "12"==p:A+B
考虑过三元组?

字?/象形 : 【MORE】 = char-graphic?
^ Str.AZ.graphic/'c', 'c'(Upper), (Symbol:'#:1')
泛用数据类型,不要硬编码

丫,并,戈(或),􏸣、􏸟:流控if
当、肖,夬:流控when
^ (1==1)(2、3)==2, arg/IS_GOOD: say:'wtf'
^ 问,x>0,。 x<0,。 或,。
泛用数据类型,而非泛化符号字面


􏿴,阳之阴阳 : 将一个双的阴位放置另一个双
^[1 2], 1|2|NO
不要滥用链表和访问链,多用集合类或解构

甲,末 : 第一个的意思
^ a[0], a[_]?, a[_-1], a add 2
不要结构化列表

􏾺 ,𨚞: 从􏿴中左起依次取出来N个元素并组成新􏿴返回 【MORE】 = take
^ a.if{!=0}, a.takes{!=1}, a.posR.takes{==2}

􏹈分 : 将􏹈和余下的分离开(输出结果是一个复值) 【MORE】 = partition
^a.sep([a.n*0.5])

^[1 2 3](Sum) 支持了min,max,avg , a(Sum.n%: /10) 实现了分组py.Counter
#cs #design #haskell https://blog.vero.site/post/noulith

max(map(sum, map(ints, puzzle_input.split("\n\n"))))
puzzle_input split "\n\n" map ints map sum then max

ask().Str.Sep("\n\n") (Ints){you(Sum).sum}.argmax
at Ints [Str Fun1]:Sep{Int()}

0 <= x < n; 0 <= x && x < n
a < b < c
(0~n-1)/x: "good"
(0!>x, x<n): "good"
[a b c].ToNext:A<B

a (zip +)= [4, 9, 2];
at a [4 9 2](Sum(Fun:+))

x = [[0] * 10] * 10
at x Nd([10 10]).zeros

at op when Rand(0~3) in {
0 N.!<|N.<
1 N.+|N.*
2 N.*|N.+
}
say:'{op.A(1,op.B(2,3))}'

真APL狠人
[1, 2, 3] zip [4, 5, 6] zip [7, 8, 9]  =>[[1, 4], 7]

at A [
(1~9),.
]%[3 3]
A.T 矩阵转置就是[1, 4, 7]

x := [3, 4]; x := "奇怪的作用域“优化”";

*Crafting Interpreters* 认为这可以简化REPL,但看IPython就知道这不是乱搞语法的理由

def f(x, y, z):
print(x + y + z)
for x in xs:
for y in ys:...

一些人可能知道 for x,y in itertools.product(xs,ys),不过绝句从语法层面解决了这个
xs:[x] ys:[y] zs:[z]
say:'{x}{y}{z}' //f的内联定义

adders = [lambda x: x + i for i in range(10)]
at addFns (0~~10):[i] [Int Fn1]:you+i

for (a <- as; b <- bs; c <- cs; d <- ds; if cond(a, b, c, d)) yield k:v
adders := for (_ <- 1 to 10) yield (
i += 1; \x -> x + i
)

Seq: (0~9): add you //这不比推导式强多了
(0~9).KV: you|you+1

漂亮吗? 还停留在for if的语言可做不到这种直白度



if (a) for (b <- c) if (d) e;
if a { for b in c { if d { e }}};
print(if (a < b) "a is less" else "b is less or equal")
say:'{(a<b)("a is less", "b is less or equal")}'

a: c:[b]
d: e //无语意的命名会让语法显得难看
a.n<5: a:[x]
x!=NO: x //结构相同,但换掉ijk变量名

xs := [2, 7]; switch (xs)
case 1 < 2*a < 2*b + 1 < literally 3*3 ->

这个必须靠穷举法……查找两次还不行

- a/b的类型 是基于a:Int or N 分派所以不用//
- %不是取余((/).rem),而表达分组
- ^不是XOR或(**),上标在编程领域应该避免
- a<=>b通过type 'S'Sorts 的元类提供 at sortFn: [S S YNo Fn2],另外 >= <= 是!< !>
- 通过 a.Bit +,in,() 实现 |,&,<< 来减少~,^的负担
- 如果说列表a+b 没有交换律,用 [a,. b,.], [*a,*b] 优于 a add b
- Java里-0x80000000 可以, -(0x80000000)不行
duangsues.is_a? SaltedFish
#blog 看到易语言还在VB++ 的范式旁徘徊,并且觉得编程语言是种必须特色和备案的「核心技术」… 我想复刻下这2007年文章的口吻: “绝句.ju”十分钟入门教程 作者:转载必须注明出处 亲爱的朋友,您愿意花十分钟的时间,来了解一门全新的编程语言“绝句.未公开”吗? #1 只有十分钟,时间紧迫,让我们立刻开始,不多说一句废话(这一句话本身算不算废话?哈哈)。 请去拜读易语言官方提供的《“易语言.飞扬”白皮书》——这本书写的很好,文笔比我强多了!本文大量参考该白皮书。 #2 绝句的大概: - 物…
名 启动类
^名
- main
说,'祖国您好!'

将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}!


''名龄=[文 计 俩项]
''合法名=文{平台(有关领导)去请示 }
- 华夏 ("中国"~~5_000)

华夏(),[名~~龄]
名去[合法名 也]“require”
"🐭"{=="🦆"}!

^name
os sys random:rand
cmd Cmd
猜数字().cmdloop

data Cmd 猜数字(x=rand(1_000)/10)
now:
数 0; 最接近 100
历史 [数 ]!
- `$default ` 'ln'
ln.Int?{数=me} \: say()
历史 add 数; on(数)
- on'num'
num==x { say(); sys.exit() } :
say:'太${(num>x)("大","小")}了'
接近了(): say:'不过接近咯'

- 接近了 历史.argmin{(x-A).abs}: Var.ifPut(最接近,me)

名 猜数字 内(内定数字 = 66) 游戏
- 猜数字() 做,
在n=获取数()
说(n、 NL="")
内定数字 .:
==n,说,'猜对了,恭喜';$Y
\<n,说,'太大了';$N
\>n,说,'太小了';$N
^典
- 获取数 听("请猜1-100中的一个数:")去数
^典 函定
- 猜 做,
这时 猜数字() 不“停”,。

物 猜数字 全自动猜数字 内(这时、n=1)
- 获取数 n去右移

典 游戏
- 猜数(听用户:函.[数 a0])


name BaseModel
- main /??/TODO "explain why 'Base' is a good class name"
- badFloats(:[Str [N Pairs] KV])
- main'abc' as:
a+b.[N too]

- someJob(x=NO)
x? {say:'1'} \: return
- guessNum(ask: Fn.[Int a0]) Try:
return Error("{aNum} 后置")
^name
- aNum 0
^name
- goodBoy(vecs:[N2 Ln])
觉得你的两篇文章很好,就附注一下了
#learn #PLT #OOP #design

https://jason5lee.me/2022/08/24/my-views-on-programming-languages/
1.编程就是表达想法
鼓励简化和复用,而非面向CPU去if for
API和SQL结构适合定义式,处理逻辑适合函数式;说到底这就是Excel表格矩阵+过滤器
算法适合过程式,1次性任务适合CLI脚本或js

2. data class UserInfo(
val userName: String,
val nickName: String,
val birthday: Date? = null,
)
val userInfo UserInfo(
userName = "Jason5Lee",
nickName = "Jason Lee",
)
userInfo.copy(birthday = Date(1997, 12, 17))

我倒觉得伪代码是:
- UserInfo(name,nickname,birth)
user UserInfo("Jason5Lee","Jason Lee",NO)
{{user}, birthday:Date(1997, 12, 17)}

强类型:
?? Info Column
User'name nickname birth'(_:Str, birth \: Date) //歪嘴表情

copied user.as() :.
-birthday Date(1997, 12, 17) //bash格式的apply{}

3.编程语言的静态类型,对沟通很重要,因为类型算是最廉价但全面的“示例代码”

4.Vue等框架就是为表现力诞生的,所以我觉得语言层面,最主要还是有扩展性
这方面Lisp系绝对是反例,而Go的泛型和err,nil都很糟糕。 仅仅是语法简单或简短,不能掩盖框架性的缺失

5.可以预先学习jspy等实用语言,再把Excel,脚本精灵等通俗软件的需求场景,泛化到不同语言(SQL,FP,.)的差异
专业软件一定是对的,它们比黑框框白页页们多经过几十万人的筛选,而且有钱可赚

6. Visitor 在 import ast 里作为 NodeTransformer 存在,只是因为static语言不能 for T def'visit_{type(T)}' 要手写样板而已
同样, window.TreeWalker 是一种用途还不如RegExp grep或glob多的工具

多态(multi-typed) 是js极少的一个缺口,哪怕py对模板abc class的生态都好很多
考虑到Android小白会把 Listener override+super 而非 div.onclick=()=>事件冒泡 用来写UX,且不习惯 setTimeout,localStorage
我觉得JS的弱化class简化View 是极端正确的选择

7. 领域化设计很重要,但以上技巧,其实都是编程领域特有的。 现在人学编程太缺失这些设计思想了


https://jason5lee.me/2022/08/30/my-understanding-of-oop-and-fp/
1. 封装性上,`private,abstract protected` 最终还是会被全局util fun 代替(另外 open val (getset) 真是太罕见了
Rust很少用private,因此在class级控制太多算是过度设计

多态上,考虑到无默认override的fun数目应在1~3项,1~2层继承, FP的filtermap等函数 技高一筹

考虑CPP(Cat,Person,Point 3例) 的同类项,你会发现class的本质只能是接口

?? Animal //行=多态  列=字典
Cat(name:Str)
Dog(name:Str, owner:Str)
Animal() //可是,你不能这么做

于是,你用正确的类型重构:

?? HasName
name Str
- funnyID askGPT(name..)
Cat()
Dog(owner:Str)
Animal()

过度泛化的Animal,会导致funnyID无法被重用,这就是Adapter爆炸的元凶,是OOP的原罪

2.FP是OOP的子集。 对象是共用构造期局部的「多方法」函数,而 class{open fun} 就是另一种默认参数

只要把对象视为1~3个主要方法,就能推理出其构造参数;只要说闭包=对象,就能明白JS为何把函数当构造器(原型链只是一种不变量外提)

这再次证明了,Object 是个包含无限大,意义无限少的 abstract nonsense ,暴露构造期细节、不易扩展fun 是语言设计者低能的表现

比如Builder吧,它无非是把局部的全面赋值,绑到堆对象,从而弥补了默认参数(复用)

3. Optional,Result 是FP的潮流败笔,Rust的?和kt!! 甚至语义相反。 除了Kotlin “悲伤路径语法”都可以说是编程界的耻辱

在我看来呢,除了 u.name\:"Jack", u(":("):name+1 ,最好把 (may: throw()) !:"fail" 也加入nullish,语法else,||,assert 也该为之改变

4. filtermap 就是 select where ,根本不必提名字或it,只要运算符和函数平权, film{score>60}:id , (0~9){<5} 才是合理写法

就像Object,FP的纯函数也是性质无限大,功能无限少的 not even wrong ,因为语言研究者不懂类比查重,却陶醉于专业主义

5. 纯函数和不可变对象,只能存在一个。 函数是纯的,返回值就是0丢弃的,赋值就根本不可能有副作用 或者能够useMemo

因为这就是 Reactive。函数是值,参数和模匹变量也应该是。 比起用伪递归风格的while去伪造Excel的功能,不如向定义式编程正统的Prolog好好学习

Ruby的"str" “装箱” 给一致性带来了灾难。尽管Rust和Go的 listVar append x 才完全一致,kt的Mutable至少是合理的,但各种mapTo就是自作多情了

如果有OS=JVM 这类概念,过度的验证是合理的,但纯函数和freeze依然是扫把星

6.value class 是对OOP的误解。 对象是共用构造期局部的「多方法」函数,子类型是C式struct间的「隐转函数」

并不存在那么多 asXXX XXAdapter ,更不用说 Int.plus(:莫名其妙的宽化重载) 和 IntArray, Stream$Int 这些模板类了

7.ADT data Way2=A a|B b 并没有那么好用,它不能是open class,而联合类型虽然能强转Any,却缺乏结构性(不能说 catch(A|B ) 是应该写的

enum和模式匹配暗示了多态data不能有名字,这是幼稚的断言,会导致理论与实用时的割裂,而且难以被接口化

OOP在这方面的语法烂但经验极为先进。 ADT,record和trait的自由扩展写法一致,可以隐this而非复制粘贴元组, enum可以用static实现

在类型基础上,FP玩的更花,但那却只是因为它们处理的最简状况太简单。 实际上,一些简短的语法,会随着程序的扩大而轻松被割裂,让你熬一整晚去重构简化
#recommend #learn 可以说OS级的工具,App级都重新造了一遍, 这不仅暴露了应用对生态环境的无视,也说明OS级的设计无法满足实际软件

SOCKS代理-socket() 函数替换
序列化-注册表,睡眠休眠
ORM和Web后端-ACL, 文件树属性

协程-进程池,LWP池, 甚至因为能等resume(),代码应该可以在RPC或FFI上执行
函数-busybox,进程
环境变量,单例,多例如用户组-YAML
BSON和二进制-mmap, sized vec

我比较喜欢Web平台的API,其实大一点的编程框架,内部都和OS内核一样繁忙

涉及的历史包袱那么大,怎么可能一两年就完全领悟呢?

比方说吧,赚钱的Web编程,后端,HTTP API?

popen://git/submodule/init/?depth=1 User-Agent=ansi 也是一种
Cookie或者说Handle,是一个限时RPC对象,ORM就是为了方便外套一层RPC数据验证。
不过是为了换个方式用Excel,做一些人类语言能描述的列表处理,学习了多少可笑的语法…… 甚至函数式在zip,chunk这些模式上也并非统一的

bash也不免是像 py fire 或pwsh里说的,是 git.submodule.init('.', {depth:1}) 的单行简写
它们在数据和算法上,都一样,但不少人还为了 import cffi 去学一种低等范式的语言,学Qt学Android,进入那些欺骗Devs “行数越多越幸运”的框架

YAML,HTTP,SQL Schema 和编程语言的struct,又有什么差异呢? 带来这些割裂,是因为编程生态圈缺时间没精力吗?
而那些用途不明的虚拟机和-O3,就是“形式语言”程序员,比业余创作者牛逼的?

Python不过是做了JSON的超集,带点简洁的布局,就让科学界用电脑做了很多有意义的事,一些只有“渐进式设计” “交互式编程”能做到的。 这并不是理论或设计模式,打败程序员的,往往不是同行,反而是跨界


既然整个Web,都可以导入为class: def ,那么前端呢?

React高等的useMemo和useEffect(x=>, [x]),Vue的html for模板 ,其实都导向一个结果:[a,1]=[2,b] 是检查期就不能表达的,匹配模式并不是值,b=a.map(x=>x+1) 间也并没有“纯粹”的等价关系,可变量不是值

你觉得let[]=[], ()=> 和HTML组件、视图绑定有何关系? 其实React团队们拼命追求的水合、性能优化,大概就是 img({src})=e, e.childNodes=a.map{div(x)} 这样的逻辑吧。
JS曾经的回调地狱,也是靠 yield, await 实现单Thread多任务来解决。最终还是自己造了一个OS内核啊

同样,try{}catch{} 和 0||"default" 无法统一地被默认、被链式调用,也暴露出了Error并不是一种null值。 十万美元错误,就是因为null不被视为错误造成的


稍微给知识查个重,就会发现其实不需要学习什么,因为现代编程语言和lib的设计是一摊拖泥带水的遮羞布,连错误都是抄来的,当然会落在地上呗

只要肯花时间探索,道路会不断延伸

#sql JS里这种查询的合理写法是 {a:1,b:2, c:[1,2]} ,可以支持 x=>区间
https://gitee.com/Tencent/APIJSON#apiauto-展示-apijson
是这种的

比较搭配BATE都有的0代码 CRUD

虽然用途上就像 sklearn vs pytorch 十分尴尬, graphql 式语法还是应学习的
感觉编程和设计小白用低代码也写不好的


我的编程范式,还轮不到一个在当跨平台复读机和CtrlCV家,却自以为懂一切的人评论

你真的不在乎那些纸上的「好看」吗? 我看你,只是执着于把好看供奉起来,避免与实际用途有交集

在我眼里编程语言不过是写法框架的外沿, 写出的任何代码都要有应用层定义力。因为语言本来就是用于交流记录的

学着把最简示例+心智模型明着说拆着说,许多难度都是浮云。 所有的思考和语言技巧,都不是通过语法和filtermap 这些术语传达到的,而是跨越软件的惯用法

如果只是为了做脚本而写程序,GPT反而更合适吧,那样无论做什么都不需要搜文档
#sql #ts 你试试把 Boolean 表达式作为主力,能不能写出typescript checker

真假和逻辑是不一样的, x=1|x=2 能得到x=1|2 而真假值算不出这些
保留bool变量毫无意义,只有作为函数有意义

User(x), x.name=Jack, sort(x.id), [x]
如果Prolog更人性化一点,就是更好的SQL
关系式和函数式,如果语法都好的话差别不大,只是前者是原生支持模式匹配

(0~9):[a] nums:[b] "a={a} b={b}"
vs
in(a, 0,9) in(b, nums) ret="a={a} b={b}"
包括SQL JOIN

当然,关系式SAT还支持||回溯,相当于DFS
函数式想模拟DFS就不好写了,比如说 0+1 关系
[Add 1 0]=ret
Add
|[a 0] a
|[a b+1] [Add a+1 b]


那么
[Add x 0]=1 {x:1}
[Add x y]=1 {x1y0} {x0y1}
总之,函数式的(=) 不满足交换律,只是一种命名,而关系式里(=)和加减法是平等的

解释下
x0y1
是通过 [Add a1 b0]=1 推理的,非常绕但是可以用流过滤实现 https://minikanren.org/#:~:text=veneer

如果静态检查只是找 numOp(int,int, ret=int) 的重载,那其实就是 SQL Select。但一般的FP语言,是可以完全只写参数名(buildList{add} ,.) 也没有泛型之类的限制

看起来很高端,也就那样。
#java #backend #design
>用 jvm bcel 生成 class T{ static int intFn1(char _0) { return 0; }}

int 要扩充到对int,char
Fn1要扩充到 Fn3

kotlin 2空格 减少变量名

ClassGen cg = new ClassGen("T", "java.lang.Object", "T.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, null);
MethodGen mg = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, new Type[] { Type.CHAR }, new String[] { "_0" }, "intFn3", "T", il=new InstructionList(), cg.getConstantPool());


il.append(InstructionFactory.createReturn(Type.INT));
mg.setMaxStack();
// 创建一个对应于方法的MethodGen对象
cg.addMethod(mg.getMethod());

cg.getJavaClass().dump("T.class");


🤔 我看生成构造器和方法签名还挺简单的
不过此例也不涉及 this.x=arg0
你试试让AI写becl 它应该能基于getClass()反射生成Builder

主要是感觉jvm 一定要dump bytecode,有点太做作了,因为jvm是有Compiler() API的
明明把源码放 thymeleaf for if 一下,def()参数列表随便换行也能生成吧,这样就0依赖了

这种元编程如果AI也能好好完成, 也是只要能用就行,闲下来的时间可以多设计些语法, BECL这些技术 好像也不如cglib.Enhancer 的头尾hook流行了

老实说如果Kt有Zig那样的 comptime foreach 和TS的 type dict ,Builder就不是问题 。当然这就是 lisp 系的 (unquote '(+ "x" 1)) 宏了

按道理来说JS里不是魔法的Proxy重载 o.xx 运算符,Java也是没什么的,但是Javaer们反射序列化的搞得太复杂了,或者说编译期API的贫瘠导致了「两门语言问题」

Zig的设计当时让我眼前一亮。 虽然它不像D支持enum作为dict type ,但Zig的 println! 比 Rust 说的宏还好用

Kt实现默认重载的方法像Ruby一样,没有反射接口,不过把 fun 提升为class 就能知道默认值了(虽然这需要改变框架……

这点.NET的 dnSpy 也能做到,因为bc本质上就是 List<元组enum> 的bytes形式 ,编辑它最本质的做法就是 mmap() 文件到内存,然后绑定数组增长,0拷贝

不过无论语言,目前都没有能把read-write 统一起来的fmt IO lib ,JDK的R/Wer 流模式都是一式两份的
直接用msgpack管理加载保存二进制,倒是能避免冗余

但,它们都不是二进制格式的绑定框架。 其实绑定bytes列表和DOM树所用的模式还是一样的, 这点 010 Editor 这个闭源十六进制编辑器,反而清醒得多

Radare2 也是支持编辑javabc格式 ,所以lib的质量不是看语言,还是要看人、看思想
这么评价也是有点道理的。 函数式data构造API ,都是helloworld 很美观很易懂,但对接实际就拉垮了

比如 import struct 的 pack("I", 0xff) 读取导出(u32,) 吧,你parse一个wav 数组的shape很易懂,但仅仅是拼接下 乃至改个序列号 就要从0写入整个文件流

不就是因为 序列化struct的模型 本质上和C的 unsized 数组一样,都忽略了重要的文件结构信息吗?
不就是不想独立出 malloc() 对象,想只复制参数到新bytes() ,结果只要修改个变量,代码可读性就炸了,工程难度飙到需要Protobuf 这些DSL玩意
其实只要让read/write 都作用到同一颗对象树,绑定一下,就不需要拿局部变量写什么RW流了

React就是这样被后来者取代的
duangsuse, [2023/12/31 10:29]
Kt有规范的async{}异步啊

Blocking 是占用1Thread完成耗时操作,这样是不用suspend的, 因为没有线程上文切换
另外,inline fun 自动支持异步

duangsuse, [2023/12/31 10:30]
可能是语法上的限制,因为suspend需要一个返回状态机参数

duangsuse, [2023/12/31 10:33]
Kt的无栈coro不会返回东西,是通过传回调,async ES6会返回

用inline fun 可以异步
如果都要用Task取代Thread了,性能其实不用太执着,因为真正的瓶颈是并行

duangsuse, [2023/12/31 10:48]
所以你的问题就是await 的传染性呗,在kt目前无解,因为需要把Thread当单核CPU来调度

https://stackoverflow.com/a/69462100
https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/

但是Loom虚拟线程 好像可以用了,这样f是否异步都可以suspend

duangsuse, [2023/12/31 10:49]
ES6 是弱类型,很难隐藏await(如果引擎不支持虚拟线程的话),不过Kt这么做其实就有点迂腐了, 因为 async 与否都不影响程序语意的
只能说被业界带偏了

duangsuse, [2023/12/31 10:51]
与之相比,Linux 的 sleep() 和 fork() 就是很好的协程实现,跨CPU调度,但完全没有干涉到C语言标准库。 DOM的全异步就更天才了,直接封装掉了并发问题,还提供监控所有fetch() 的F12

反观最近支持async的语言,因为java stdlib 会卡栈就要手动new一大堆有的没的,理论还没Lua,Ruby强 ,可以说只有设计错误是原创……
duangsuse, [2024/1/24 16:44]
Zig里是需要显式控制流,但Kt实际上把Result用的很好, firstOrNull 完全能写成 first{}.orNull 什么的允许符号化
调用栈其实C /usr/bin/stacktrace:error 都支持的,不需要异常

duangsuse, [2024/1/24 16:45]
js里根本不允许判断异常种类,知道你不能Retry,所以啥都一个样

duangsuse, [2024/1/24 16:47]
因为滥用异常分类,还有一些人搞出了 algebraic-effects
就是把throw当依赖注入+await 用, 顺带支持了免标async
但实际上这很难调试

https://overreacted.io/algebraic-effects-for-the-rest-of-us/

另外 checked exception 真不是啥好东西
如果说分门别类更严谨,那FP却干脆没还原这个

duangsuse, [2024/1/24 16:52]
如果函数啥错误都能抛出,只能说明拆分复用有问题
或者文档垃圾到AI才看得懂

只能说try catch 就是面向语句的东西,对标SQL事务
但大家需要的是调用链,就像 ?: run{}

duangsuse, [2024/1/24 16:56]
还有一点,就是?: throw的隐式控制流
比 {yield()} 的类型推导更为隐式

如果像Go那样支持匿名union ,就能还原CE了
sealed 太冗长

duangsuse, [2024/1/24 17:01]
我倒是觉得,既然扩展必然final
不如直接把所有方法都视为 arg0='.'this 的普通调用

区分那么多OOP FP PP的反而很奇怪

py 没有做到这个,但Rust是,但Rust又拿tuple trait取代了overloads,让人无言以对

duangsuse, [2024/1/24 17:04]
也不能这么说,Kt 的 data class, let run{} 和 coroutine 还是很前瞻性的
虽然对应地, match 和async应用连py都不如

duangsuse, [2024/1/24 17:11]
context() fun 替代 override class 吗?噢这个是Adapter

猜到是? interface Statics<T>{ context(T) fun }
感觉不如Rust的trait, 而且static 一词就是莫名其妙,jspy里根本没有这类概念

ml 系强制尾递归,更像是定义式编程的问题,forEach根本不需要递归

duangsuse, [2024/1/24 17:13]
MD,现在pakage namespace 也要允许二次打开了是吗
就像之前的 inner class

早知如此,就把所有语言成员都扁平化, 就没有扩展性问题了

duangsuse, [2024/1/24 20:28]
同意,直接写 val Int.ZERO=0 就当static了,还可以外部扩展和interface化

duangsuse, [2024/1/24 20:35]
Kt还是支持 Bitflags (and/or)的,shlr 也能用*2^n 来模拟

位运算纯粹是protobuf那样的地方需要用,就连DatInpStream 都不应该直接做bitwise

Kt和下层术语决裂的还不完全,比如abstract,annotation,inner 这些kw都可以优化掉的

top level 不够,上面说了这玩意和companion不一致会造成接口/扩展性问题
KMP 确实烂到不如直接写ifdef ,不知道能不能拿interface 抽象分平台函数(Abstract Factory

duangsuse, [2024/1/24 20:38]
照抄Scala ,结果悲剧了
companion 又不需要参与重写查找, 到底谁会优先拿statics 去实现接口啊(除了序列化器
#dev
rust 需要熟悉&mut 和奇特的泛型/函数模型,以及没有构造器的DSL
zig很像C,没有Rc和异常透传,需要习惯 Option, defer 等一系列冗余符号
haskell 要把链表转来转去,或者搞懂四五个定义不清的 typeclass(trait) 。作为FP它还有小白大佬面向的资料混一起的风格
erlang Elixir 据说是Actor并发的真理,但用起来还不如Promise直观、定义式
ruby 继Rails后被py打的落花流水, 尽管它有真OOP和函数式
C#有this参数CLR的OOP是比较灵活的,还有隐转呢

总的来说,我觉得比jspy复杂的语言都没有学习的必要
大家是学API、做绑定的, 又没有聪明到能玩算法的程度

FP 最做作的就是链表了, 连ADT都不擅长还好意思说declarative
Lisp风格可以把 (+ 解释为函数,却不能像OOP把它的重载列出来,解释1+和""+的不同,反而是和VB一样 让人把数组当struct用的级别,这种心智模型的惰性,让单调的语法无法发挥特长

SQL aggerate 都比fold reduce 要FP 。Ruby 就是极其FP的语言,列表操作名都花里胡哨的,那FP显然不是靠特立独行搞的
takeWhile 这个也挺奇怪的。 为什么不做成 ary.partition2(test, fA,fB) 呢?这种declarative也就刚刚从 for(;;) 的娘胎跑出来的程度

Haskell 还有种不需要手写回调地狱(fmap) ,但概念比回调更地狱的独创FP风格
#java duangsuse, [2024/2/23 01:21]
请使用 kotlin-reflect 和 new Compiler() 来为
data class MPair(var A: Int, var B: Int)
实现
loads<UPair> (mapOf("A" to 1, "B" to 1))


代码的部分可用StringBuilder生成
class Pickle {
UPair load(UPair o, Map<Str,Any> m) { for(kv : field) o.$k=m.get($k); }
}

... https://gist.github.com/duangsuse/d022c7ad037bb7fed446f72ec9b38ef7

duangsuse, [2024/2/23 01:23]
我用jshell API 实现了一个ini序列化
大概比直接靠javac 简单点吧,理论上eval的玩意也可以缓存到编译期

duangsuse, [2024/2/23 01:28]
我觉得我的目的已经很清楚了,写在最顶上

如果看不懂就说明不用看,反之测试过
如果不是gpt不会,我很乐意只写开头那1行

duangsuse, [2024/2/23 01:30]
JShell API 虽然比从Compiler() 加载短的多,但 js.eval() 那个默认返回String我不喜欢……
或许是为了兼容RPC吧, 但LocalExecutor 应该就不需要序列化啊

感觉用jsh模拟eval 比ByteBuddy规范得多

duangsuse, [2024/2/23 01:34]
所以说py真的太解压了.. setattr() 就算动静态隔离,typehint还能做格式验证
js稍微乱点

java 连个规范的元编程方法都没有,一群魔法师
我是觉得一个老古董语言就不要和jspy 比面向event和类型反射

duangsuse, [2024/2/23 01:42]
不会啊,或许Lombok有

Factory类似Provider的简化版,在需要用subtypes 实现接口时可以用来简化创建

duangsuse, [2024/2/23 01:47]
写java,C++ 这些的时候有种错觉
public 是🔘列表符号
分号和各种不执行的标注也完全喧宾夺主了

duangsuse, [2024/2/23 01:49]
Compiler 和 JShell API 就是tools.jar里的,做不到比 CLI更强的功能,就是调用快点

JS("") 和runtime其实是完全隔离的,它的classpath 相当于是编译期的,你可以把生成的代码按行号缓存下来,不需要defineClass

duangsuse, [2024/2/23 01:51]
没错,第一次在runtime 做static foreach 留缓存,第二次可以直接走预处理器
这样也可以使用不常规的常量传播的结果,但主要是实现setattr()

duangsuse, [2024/2/23 01:53]
准确的说是在运行时,把eval()的东西缓存下来,那就叫编译嘛
JIT
Forwarded from Deleted Account
To retrieve the N most recent images from the Chrome cache in Linux that are greater than 100KB in size using Python, you can use the following script. This script uses the sqlite3 library to access Chrome's cache database. Please note that accessing the cache database directly may vary based on the Chrome version and system setup.

import os
import shutil
import sqlite3
from datetime import datetime

def retrieve_recent_images(n, min_size):
chrome_user_dir = os.path.expanduser('~/.config/google-chrome/')
cache_dir = chrome_user_dir + '/Default/Cache/'
cache_db = cache_dir + 'Cache'

conn = sqlite3.connect(cache_db)
c = conn.cursor()

c.execute("SELECT key, length, creation_time, url FROM 'entries' WHERE length > ? ORDER BY creation_time DESC LIMIT ?", (min_size, n))

rows = c.fetchall()

if not os.path.exists('recent_images'):
os.makedirs('recent_images')

for row in rows:
cache_key = row[0]
size = row[1]
creation_time = datetime.utcfromtimestamp(row[2])
url = row[3]

image_path_original = cache_dir + cache_key
image_path_dest = 'recent_images/' + cache_key

if os.path.exists(image_path_original):
shutil.copy(image_path_original, image_path_dest)
print(f"Image saved - Size: {size} bytes, Creation Time: {creation_time}, URL: {url}")

conn.close()

if __name__ == '__main__':
retrieve_recent_images(5, 100 * 1024) # Retrieves 5 most recent images (>100KB)


Please make sure to adjust the chrome_user_dir variable if Chrome is installed in a different location on your system. Also, keep in mind that the cache database structure may vary in different Chrome versions.
#py Here are one-line examples for each of the available transformations provided by 2to3:

1. apply: Converts apply(func, args) to func(*args).
2. asserts: Converts assert statements to assert function calls.
3. basestring: Replaces basestring with str (since basestring is not available in Python 3).
4. buffer: Converts buffer to memoryview.
5. dict: Converts dict.iteritems() to dict.items().
6. except: Converts except Exception, e to except Exception as e.
7. exec: Converts exec statements to exec() function calls.
8. execfile: Converts execfile to exec(open(filename).read()).
9. exitfunc: Converts atexit.register(func) to atexit.register(func, *args, **kwargs).
10. filter: Converts filter(func, iterable) to list(filter(func, iterable)).
11. funcattrs: Converts func.func_... attributes to func.__...__.
12. future: Adds from __future__ import ... statements for Python 3 compatibility.
13. getcwdu: Converts os.getcwdu() to os.getcwd().
14. has_key: Converts dict.has_key(key) to key in dict.
15. idioms: Various idiomatic changes for Python 3.
16. import: Converts import x to from x import y.
17. imports: Converts import x to import y.
18. imports2: Converts import x to import y.
19. input: Converts input() to raw_input() (since input() in Python 3 evaluates the input).
20. intern: Converts intern(s) to sys.intern(s).
21. isinstance: Converts isinstance(x, T) to isinstance(x, (T1, T2)).
22. itertools: Converts itertools.izip() to zip(), etc.
23. itertools_imports: Adds from itertools import ... statements.
24. long: Converts long(x) to int(x) (since long is not available in Python 3).
25. map: Converts map(func, iterable) to list(map(func, iterable)).
26. metaclass: Converts metaclass syntax to Python 3 style.
27. methodattrs: Converts method.im_... attributes to method.__...__.
28. ne: Converts <> to !=.
29. next: Converts next(it) to next(it, default).
30. nonzero: Converts x.__nonzero__() to bool(x) (since __nonzero__() is not available in Python 3).
31. numliterals: Converts octal literals (e.g., 0755) to hexadecimal literals (e.g., 0o755).
32. operator: Converts x.__cmp__(y) to operator.__cmp__(x, y).
33. paren: Adds parentheses for print statements (e.g., print x becomes print(x)).
34. print: Converts print x to print(x).
35. raise: Converts raise E, V to raise E(V).
36. raw_input: Converts raw_input() to input() (since input() in Python 3 reads a string).
37. reduce: Converts reduce(func, iterable) to functools.reduce(func, iterable).
38. reload: Converts reload(module) to importlib.reload(module).
39. renames: Various renaming changes for Python 3.
40. repr: Converts repr(x) to repr(x).
41. set_literal: Converts {x, y} to set([x, y]).
42. standarderror: Converts StandardError to Exception.
43. sys_exc: Converts sys.exc_type to sys.exc_info()[0].
44. throw: Converts x.throw(E, V, T) to x.throw(E(V)).with_traceback(T).
45. tuple_params: Converts def f((a, b)): ... to def f(a_b): a, b = a_b.
46. types: Converts types.ClassType to type.
47. unicode: Converts unicode(x) to str(x) (since unicode is not available in Python 3).
48. urllib: Converts urllib.quote() to urllib.parse.quote(), etc.
duangsuse, [2024/3/9 16:44]
语言绝不能多加特性,加库API就好了

你看py 40年来语法变过没有?

duangsuse, [2024/3/9 16:46]
如果Modifiers() 可以visitor复制的话还是好改的

我觉得API做不好你就像DOM那样支持innerText算了,或者外提literals走宏替换好了, 不就自动refactor吗 既要又要的 复杂度比得上gpt么
听说IDEA版本库有4G啊
或许比WebKit还大呢

duangsuse, [2024/3/9 16:51]
如果改起来这么复杂,说明框架连 Object.assign 的完善度都没达到,或者说连js界的状态管理 水平都没有

因为assign是可以被hook为深拷贝的,只不过默认是0拷贝

duangsuse, [2024/3/9 16:55]
https://github.com/python/cpython/blob/3.12/Lib/lib2to3/fixes/fix_map.py

这个够不够全?

duangsuse, [2024/3/9 16:56]
python -m lib2to3 -l |xargs
Available transformations for the -f/--fix option: apply asserts basestring buffer dict except exec execfile exitfunc filter funcattrs future getcwdu has_key idioms import imports imports2 input intern isinstance itertools itertools_imports long map metaclass methodattrs ne next nonzero numliterals operator paren print raise raw_input reduce reload renames repr set_literal standarderror sys_exc throw tuple_params types unicode urllib ws_comma xrange xreadlines zip
#plt duangsuse:
我就觉得赢王民科,有时候对自己不学的领域指手画脚

但民科不意味着他在plt是无价值的,实际上我很希望有更多更易懂的中文资料,但他们还超不过赢王10年前的博客

其实我很奇怪啊,那些教「编译原理」「操作系统」的大学生和教授去哪了

为什么能打的只有 https://moonbit.org/ 张老师一个人呢
这学术性价比也太低了,近年创立或火起来的 Go,Rust,Mojo,Dart 都没啥境内博客,难道全是论文?

同感,他是把 Any/Var(Any) 对象分开谈了,没涉及heap引用等问题
我是赞同这种分法的, 因为咋分配本来就是算法噪音,应该像py,cffi那样随便转换才好呢

Java确实只有引用类型啊,无非是在局部还是在List<>

谈到这个我觉得 kt IntArray, Array<Int> 让人有点不清,而且导致了有 intArrayOf() 这样的重复宏

2. kt是做了一个自动装拆箱,这样局部/数组和List<>里就无差异
3. CLR里泛型能是值类型,但JVM泛型擦除为Obj(int tag+void*)
jvm的代码体积会小,因为C#是用动态生成template<> 的方法new泛型class
但也造成了 Stream.OfInt 这种脑残编译期宏

其实你可以放心,如果你想学他的内容还是可以看看

只不过学他知识一定不能直接挣到钱而已

我个人觉得还是比马士兵啥的强,比如你能搞懂Serializer的编译期手段和DSL设计(虽然他没直接教过),这是长期投资

任何copy都能lazy分配的

他是觉得用传参([]) 来复制数组很过时。 很少有函数会修改参数吧?除非多返回
可以参考他对Haskell pure GADT的反对, hs的每个参数都是lazy的,就像CoW 的数组值

😂 记得某位CSer说过,计算机科学只有2种问题: 1缓存失效 2变量命名

IDisposable 这些确实烦人的很
用用函数式不就解决了吗? Go 还加了个defer
然后kt有 coroutineScope{} 这就不需要手动close()

所以说这些trick或者说设计模式, 终究还是会被正确的DSL打败
不应该耗时学习它们
选对框架是关键

我就觉得资源用完不free()很合理
反正一般程序也不是long-running
这个检查和 checked Except 一样,被严重过誉了

感觉Rust也是到处Rc<T>啊
inline fn 和接口本来就是少数,怎么可能lifetime用到爆

py只靠Rc就实现了许多GC语言的功能,只是比C多个bytes而已
Py对API和对象树的理解,可以说登峰造极,独孤求败,堪比DOM对UI的定义

py也可以用GC啊,只是正常人用weakptr(parent)就好了

对写树结构的人这些应该是常识
为什么编程语言作者,会觉得该用算法给他们擦屁股?

另外看到 https://www.jetbrains.com/decompiler
我想说<40M 的 https://github.com/dnSpy/dnSpy 比它强10倍
已经是最终成品了,除了反编还能编辑

MemoryStream {

protected override void Dispose(bool disposing)
这个有点逆天啊,是嫌嵌套还不够多,搞这么一个bool给实现者?

当我有其他算法和点子可以写,会使用其他伪代码之后,才发现java世界的语言多么装腔作势

是 Dispose(bool disposing) 频率高,还是 Dispose(Disposables.. used) 更合理呢?
duangsuse, [2024/3/9 22:04]
😅 完了,感觉我都要变 yinwang.org

他10年前的抱怨我全都有,而且我比他还少点实践

大部分的 AI 系统里面连语法分析器(parser)都没有,所以主谓宾,句子结构都分析不清楚,更不要说理解其中的含义了。

不过幸好我没他民科,不会对自己不学的领域指手画脚

他们天真地以为,有了谓词逻辑,一阶逻辑这些东西,可以表达“因为所以不但而且存在所有”,机器就可以拥有智能。于是他们设计了各种基于逻辑的算法,专家系统(expert system),甚至设计了基于逻辑的程序语言 Prolog,把它叫做“第五代程序语言”。最后,他们遇到了无法逾越的障碍,众多的 AI 公司无法实现他们夸口的目标,各种基于“神经元”的机器无法解决实际的问题,巨额的政府和民间投资化为泡影,人工智能进入了冬天。


是啊,这些人为什么会觉得人脑就是布尔算术数据库呢?

duangsuse, [2024/3/9 22:23]
以太坊的 Solidity 语言一开头就有低级错误,导致价值五千万美元的以太币被盗。以太坊的智能合约系统消耗大量的计算资源,还导致了严重的性能问题。
我们真的需要那些脚本的功能吗?比特币虽然有脚本语言,可是常用的脚本其实只有不超过 5 个,直接 hard code 进去就可以了
实现转账交换的简单功能就可以了。合约应该是另外独立的系统,不应该跟货币捆绑在一起。交给律师和会计去办
比特币的脚本语言只能写出功能简单,不伤害系统性能,容易验证的脚本


不过淫王的一些话还是犀利的,听说有人手动调用Trasfer()参数不对导致丢钱的,而且Dapps在2017占用了 https://en.wikipedia.org/wiki/CryptoKitties#:~:text=25% 的算力
分布式系统确实需要一种WASM式的分布式ATM