duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
#kt #FP #PLT duangsuse, [2023/9/27 15:56]
还是H5 <meta name="viewport" 好,就只有基于dpr的 px vw wh, 然后 sp=rem, @media(device-pixel-ratio:1)
不会因为放大到200% 就蹦出一个更新的单位。SVG里都一样

一个毫无意义的区别,让设计师拿来作为特色竞争力,妙呀

duangsuse, [2023/9/27 15:59]
你可以自己常量外提啊,JVM应该会优化

duangsuse, [2023/9/27 16:00]
不要管性能, 能被AI转写的那都是虚的,主要是好写耐看

duangsuse, [2023/9/27 16:00]
我也觉得把两个Int放在堆上很弱智…… 应该直接内联成参数,可是这就是 Java

duangsuse, [2023/9/27 16:02]
Kotlin 的 inline class 已经是种typealias了,你想怎么加? 我看他们不觉得这是问题

duangsuse, [2023/9/27 16:05]
Kt range 对int,long 都有不同的(模板)重载 ,连(Java8 stream 里也有的)去除装箱都没推广到语言层面,你还指望他们考虑这个。 最多就碎片地优化下惯用法

duangsuse, [2023/9/27 16:06]
不过JS里是有 forEach 比for of 快的一个见解。Kt里这也不失为一种统一风格,可惜如果性能有问题……

duangsuse, [2023/9/27 16:08]
你要理解它们,人家可是重造了LLVM的轮子, 是专业的中间优化层 😁

总之不重造轮子,就不算懂计算呗

duangsuse, [2023/9/27 16:10]
性能不会是我选择工具时的考量,但和你们交流时,我也会被带着跑…… 毕竟代码是要跑的,唉

duangsuse, [2023/9/27 16:10]
inline fun 不就是只针对lam的,包括 forEach 可以跳出两层也是因为有优化

duangsuse, [2023/9/27 16:14]
如果不可变,被捕获的外部var 就不必被绑定为Ref()

duangsuse, [2023/9/27 16:15]
真的有人会在用lambda时注意性能吗…… 不都是类似宏的用途,真要 onclick 那种是绝对无法缓存的

duangsuse, [2023/9/27 16:17]
全局的怎么能叫捕获呢…… 外层函数的栈变量,转堆变量,那才叫捕获

Kt 的fn is Any 应该是种误解,这方面反而是Rust.. 每个函数类型独立,要明确

duangsuse, [2023/9/27 16:19]
没想到 crossinline 竟然被Kt做成了特性,而Kt对这个特性什么教程都没有…… 让人摸不着魔法

duangsuse, [2023/9/27 16:21]
就不应该指明,JS 的闭包就是这样。闭包并不是Any,包括也没有toStr

你甚至不能看到调用栈里,受调用click等闭包的捕获变量。只有JS DevTools能看到那些

duangsuse, [2023/9/27 16:27]
我也想啊,比如协程是挂起,那“休眠”就是在退出重进时保留任务栈了,多香啊
一个语言都能实现操作系统了

可惜kt 里Coroutine和回调闭包是不同的

val hibernate = withContext(Dispatchers.IO) {
delay(10_000L); print("")
}

val hB = ByteArrayOutputStream().apply {
ObjectOutputStream(this).use{writeObject(hibernate)}
}.toByteArray()

val data = ByteArrayInputStream(hB).use {
val input = ObjectInputStream(it)
input.readObject() as Continuation<*>
}

// Resume the coroutine
data.resumeWith(Result.success(Unit))

duangsuse, [2023/9/27 16:35]
这个接口其实是 Promise+then时调度器 ,只是不需要yield而直接把自己给delay(),中规中矩。没有写可以序列化
(但其实换调度队列不需要coroCtx, 只有catch要它模拟调用栈+给函数值加名字, 以及让1个fun有两个等待scope..)

如果闭包都不能跨越会话重复调用,Coro就更不可能了

感觉有点可惜,如果可以的话,一门语言就足够支撑起操作系统内核那种复杂的多任务了

duangsuse, [2023/9/27 17:28]
函数序列化还有个好处, 就是若C/S端使用同一份代码(同构),
login(uid,hash) () 可以直接发到另一个全局环境去执行

就是不知道异步seq 是怎么执行的。但至少能用响应式{k:var}来监听

duangsuse, [2023/9/27 22:28]
找到了 ,和Python inspect 一样信息齐全
ObjectOutputStream 是通过这个支持:
(SerializedLambda)  fn.getDeclaredMethod("writeReplace")(fn)  //-readResolve
duangsuse, [2023/9/27 22:27]
对啊,感觉奇奇怪怪的。 我说的是那种两边都有,基于Hash和闭包变量分派的序列化

RPC和RCE真的一字之差啊…… RPC多少还有点接口规范可循吧, 但HTTP,REST,GraphQL 就稍微复杂点了

我说 login(uid,hash) () 可以直接发到另一个全局环境去执行 优点是在语言内部支持RPC,但protobuf这些也是可能的
duangsuse
, [2023/9/28 10:54]
你写了一个 T(x).f(arg): T 的链,并试图标明还未f()的T

你可以把灵感给GPT让它来写

duangsuse, [2023/9/28 10:55]
说到 reduce{A+B} 这类函数,我倒是有个 [0].as(Sum(it, (A,B)=>A+B)) 的封装,用于支持分组过滤

duangsuse, [2023/9/28 10:57]
在没有this的语言里调用链挺好玩的,但java里都有 new ArrayList(){{add(1,2); add(3)}} 这种用法

- add_v1'ab'=a+b
D=add_v1(1,2) “dbg print”

data Adder'ab'(:Int)
- add()=a+b

say(Adder(1,2).add)

data Adder(list:Ln<Int>)
- add()=list(Sum).sum

(1~4):
say(this,Adder(this.Ln).add)

[ALL(1~4)]:
at val=Adder(this){add}
say(val())
add 5; say(val())

type 'T'Gets
- get()T
type 'this T'Adds
- add(:T)this

data 'T'CanAdd(at,a:@our T)@impl?? Gets Adds
^now
- get=a

data I(a:Int)CanAdd()
- add(b)=a+b
data S(a:Str)CanAdd()
- add(b)=a.as<Str>+b

data 'T'Adder(list:Ln<CanAdd>)
‘测试’ Adder([I(1),I(2)]).add.get
- add()=(list isEmpty){ CanAdd.None }:
at now: x list[0]
1~list.iLast:[i] x=x.add(list[i])
x

type 'T'CanAddZ CanAdd
^named .Consts
type Consts
at zero:T
data I(a:Int) I()CanAddZ
^named
at zero=0

‘TODO’ (CanAddZ: Adder<I>()).get
Forwarded from dnaugsuz
>请实现 2intToLong:
long iLong(int a,b){}, iLongA=0x,iLongB
并解释相对于 int[2], aligned class 的优点

使用数组存在一些劣势:

1. 内存空间:数组需要额外的内存空间来存储数组本身的元信息,如数组长度等。而对齐类只包含实际需要的变量,没有额外的开销。
2. 数据访问:对齐类中的变量在内存中的存储位置是连续的,而数组的元素则是离散存储的。这意味着对齐类中变量的访问效率更高,因为可以通过单次内存访问完成对多个变量的访问操作。
3. 代码简洁性:使用对齐类可以提高代码的可读性和可维护性,因为变量的语义更加明确,避免了数组下标的混淆和错误。

总之,相对于 int[2],对齐类更加高效

AI没解对,那我补足下

val iLongAB = 0xFFFFFFFFL to 0xFFFFFFFFL.shl(32)
fun iLong(a:Int,b:Int) =a.shl(32).or(b)

val(a,b)=iLongAB and 0xFF

infix fun Pair<Long>.and(i:Long)=Pair(first and i, second and i) 

typealias Eq<A,B>=Pair<(A)->B, (B)->A>
val bitsLong:Eq<Array<Boolean>,Long> = {
bits.foldIndexed(0L) { i, buf, bit ->
buf or (if (bit) (1L shl i) else 0L)
}
} to { buf->
buildList { (0 until SIZE_BITS).forEach{i-> add(buf and 0x1.shl(i)) }
}


如果你的2层KV(比如Grouping)是转为 Pair<K:Array, V:Array> 的话,在嵌套时也可以用浅先访问实现get(k1,k2)
#java #FP Loney Chou, [2023/10/5 10:50]
只读集合是对 API 作者的极大福音

duangsuse, [2023/10/5 10:47]
如果只读不是在Type期实现的,就会有很大开销。比JS低就是了
只读还会逼你使用map,filter 等写法,对一些程序员可能……太严谨了
可能有人觉得自己用mutable集合,就能做得更快?

duangsuse, [2023/10/5 10:49]
Java 经典的反人类默认值,随地 public final
只能说是Java自身反人类,导致框架难写吧。

duangsuse, [2023/10/5 11:06]
好像是迭代、数组、元组 啥的不好区分

“ 这是整个 API 中最具争议的设计决策。显然,静态(编译时)类型检查是非常可取的,但实现此目标的尝试会导致接口层次结构的大小爆炸
Doug Lea 编写了一个流行的 Java 集合包,该包确实反映了其接口层次结构中的可变性区别,但根据用户对其集合包的体验。用他的话说(来自私人信件)“我很痛苦地说,强静态类型对于 Java 中的集合接口不起作用。”

duangsuse, [2023/10/5 11:07]
Java就是太智障了,你看 Py,Kt 对可变性的实现不就很正常,哪里有那么多特例?

典型的过度工程大佬,已经要被能随意跨界的JS,Py等语言抛在后面了 ,现在又跟不上明确化类型的新语言
Ruby的元类链都没 MutableXX 那么复杂,Java还觉得不行

学了几句算法觉得自己牛了, 但其实那是可以随便替换的,连接口的不标准都有先人犯过

list instanceof Sorted
OOP的正常typetag 组合不会用,反射却挺擅长(
Java当时也就是给数组加个bounds,给指针保存上type ,实在是没必要强到runtime去做Obj.freeze 这么弱的检查

duangsuse, [2023/10/5 11:13]
这就是算法和API的区别啊。运行时凭什么决定设计和编译期的概念呢
编程里就没有一个「有实用价值」的东西是计算机先有,然后设计师才拿出来用的

肯定不能让Java、VB这种垃圾语言,干扰你的思路的

duangsuse, [2023/10/5 11:14]
runtime check 都是外语,FFI 要考虑的事情了……你可以把FFI跨语言的情况,都理解为明确使用了 as cast

你都已经脱离Kotlin编译器了,还想继续使用各种语言和检查特性……(这跟说 private 也不是 private 一样
List和 MList<out T> 都会限制set()的…… (只不过MList不限制reverse)

duangsuse, [2023/10/5 11:38]
你不能说单靠一个类型,去把 list 当作Tuple来用。
单单结构不可变的称为 Array , 但现在大多数人只会用list 。还是Py的正确,tuple正好能对应上dataclass ,有用法的依据

你说的那种,是纯函数的不可变吧…… 不是类型上

意义真的不大, 无非是把堆里的变量放栈上改写,或者栈变量换伪递归, 那有什么用…… 又麻烦又慢 😓

变量关系式编程(LP)里, 函数式的 Memo f()=x+1 可以直接表达为 f(out y,x) 的细粒度重计算,不仅不存在“赋值”,也不需要那些纯函数的过度检查

一些人觉得 React是什么FRP,functional响应式 。但其实把可变数据,理解为含Var的不可变, 比纠结于List纯不纯好玩的多


类型姑且还是对心智模型的硬化, 纯度这些可都是虚无缥缈的风格格调了。有趣的软件未必靠FP来写。某些函数式lib的样板代码不比rs,go的少 ,代码质量只能是看人,是否憎恨冗余
#china duangsuse, [2023/10/5 22:21]
小丑政客=客人
伟大的政治家=主人

列宁所在国家的体制,都可以算「列宁活着时是国家」了……

Neomonk Zen, [2023/10/5 22:39]
我觉得所谓疫情,也许就是为了消解资本主义过剩产能的手段
地产更是产能过剩呀
我倒是不希望跟美帝搞妥协,那样大陆P民的日子肯定会越来越难受

duangsuse, [2023/10/5 22:42]
《你的VPN有点太城市化了》
从理智就可以得出共存是必然的呗, 病毒清零你 🦄

duangsuse, [2023/10/5 22:44]
是啊,这不就暴雷了么? 这下左了。
!!! 有意思,美的妨碍华为Mate60 遥遥领先了是吧

duangsuse, [2023/10/5 23:00]
产能什么时候成负担了?? 多生孩子也都是赔钱货,白吃不干是吧?
怎么又是资本家,又是波士顿清茶的, 不方便资本家赚数字币?

你以为是为了涨价,实际上:
目标 为了抗议英国议会对茶叶征税, "无代表不纳税"。


而且中国农民的水果,运/卖不出去也会喂猪的,这根本无关资本共产

哦,共产主义者只有国家计划,恩赐的白米可以吃,没有季节时蔬啊? 那算了

duangsuse, [2023/10/5 23:07]
国家的农奴,一辈子被拴在地里,想当「盲流」都不行; 更别提走向更高生产力的职业比率了。

改革开放,可惜「反对资本主义自由化」(

戴着枷锁跳舞的中国普通人和「民族资本家

duangsuse, [2023/10/5 23:09]
不倒,运费你出
经典社会主义的税收,都是免费的, 政府来做是不用花钱的。 左派的政府是个万金油、永动机, 一丝不取😅奉献无穷

而且美国是有 food bank 的,日本我不知道

这些基础设施都不是制度的问题, 只要道德不滑坡……
要是中国的法制没有出问题, 文革时期的老人也还敢讹人吗? 所以法律不仅仅是道德的底线,而不能反映民意的法就是恶法。
#kt duangsuse, [2023/10/5 21:59]
xx is Any? 一般是可以常量计算的
子类多态的当然不行,inline reified 可以

不是啊,编译期 instanceof 除了TS那种infer解构的,还有啥用呢?x:Int声明不就是用来x=1, Int.canBe(1/Int) 验证的

而且类型constexpr也是对 swi-prolog.org 的混乱模仿

Java支持泛型extends成员交,但我是说 Sorted集合 本身不暴露任何接口,它就是Serializable那样的tag啊

上文:
>SortedSet NavigatableMap,都是实现,不是 API 应该关心的东西
还是不行的,要支持SortedXxx
>list isinstance Sorted
这是运行时决定的,不行
>但运行时凭什么决定设计和编译期的概念呢
哦,你是说把 instanceOf 做到编译时,等等我想起了 TypeScript···

duangsuse, [2023/10/5 22:06]
弄错了,Sorted集合会暴露 ceil()floor() 等只读方法,不是只is一下,还要as

……那你就理解为 S extends Sorted<PairKV/E>&Set 那种泛型吧(这也实现了外部继承)
总之我是觉得 java.util 现在过于复杂了,怎么可能连只读接口都不支持?C#,Kt都有的吧

duangsuse, [2023/10/5 22:15]
https://discuss.kotlinlang.org/t/extension-types-for-kotlin/1390
唉,CLR和Kt(内部地) 都支持用代码复制来调用 int[], IntStream, Array.copy 这种类型或函数

要扩展既定class,Java的交集泛型会擦除,感觉还是不如用 Interface by delegate 。 就连Kotlin都没有优雅解决泛型问题

所谓组合优于继承还真是……

我觉得直接把stdlib 生成IntArray的方法规范化出来就挺好,算是解决了各种泛型开销的问题

Loney Chou, [2023/10/6 00:09]
接口代理不代理所有方法真的有点不符合预期
我相信绝大多数人用接口代理都是为了把代理有定义(覆写)的行为都交给代理,而不是只有抽象成员
https://youtrack.jetbrains.com/issue/KT-55080

isekiのChannel, [2023/10/6 00:33]
话说 Kotlin 为什么不允许 int -> short 的隐式转换来着?有些时候确实挺麻烦的

cubesugarcheese, [2023/10/6 01:07]
kt很不喜欢隐式转换
之前有个扩展实现接口的提案因为没办法避免隐式转换被毙掉了
我更喜欢长程推断
比如
val a = 1 // 这里确定a为整型 Int还是Long需要后续分析
fun foo(num: Long) {}
foo(a) //确定a为Long类型
duangsuse, [2023/10/6 10:59]
这下常量值有?那样的类型标记了

Loney Chou, [2023/10/6 01:22]
扩展接口...感觉会跟现在的扩展的设计(基于函数或属性而非结构)大相径庭。
如果当成独立的类型来调用实现的扩展函数,那就没任何问题
如果被上转为接口类型,就会被包装

duangsuse, [2023/10/6 11:04]
这下Ruby了
当初设置fun T. 时就应该加在 inline class 和隐转的体系里 ,三个愿望扩展、外部接口、隐式宽化 一次满足 ,还附送ts式的用调用的成员推导类型


Jason5Lee, [2023/10/6 21:29]
Integer.equals(Long) 是 false

duangsuse, [2023/10/6 11:27]
可是本来就应该统一到Long来eq吧
总结:
1.模板<reified T> doAdd(a: T, b: T) = a.add(b)
2.To make those explicit adapters less wordy, we could first implement KT-505 136 (delegating by signature), and second — provide some syntax to be able to write Monoid(stringValue) instead of object : Monoid by stringValue {}

😅真的,设计模式先于语法 builder和set链是优秀的了👍

duangsuse, [2023/10/6 22:36]
不过Kt有一大堆 Int.plus(:Long):Long 的重载,就像 to[Typed:Int]Array,IntRange 一样有一大堆,靠重载来隐转可真是太「不隐晦」了。 让我的领结旋转

乍一看是Java风格,operator fun 的无奈之举,但其实就是「过度限制」。 以为不需要C#那种自定义隐转 ,结果进一步导致 inline class 等等“新”特性
Forwarded from dnaugsuz
不说 单例,迭代器,策略模式,模板方法模式 这些 #FP/定义式/组合式 里不存在的

Factory, Builder, Inject
lib.job( {k:v, ...defaultsOrOld})
prompt("?", 可选参数)

Kt差点就把这种简洁抄到手了,如果没有 let/also, run/apply 那些新术语的话。如果它真心接受了SAM互转等弱类型优势,而不是不断研发出 fun interface; data object 这些小礼包
never is offen better then RIGHT NOW. 如果设计不好语法的话,一开始就用 when(Any)-is 反而比 sealed 强。

Delegate, 元编程
o1={_user:小明}
new Proxy(o, {get:(o,k)=>o1['_'+k] })


你不需要写出编译器能理解的 class{} 等签名性结构,也不需要用异于Map<Str,Any>的模型理解Object,有数据有想法就够了
当然,缺点就是只能使用 import json,yaml 内置的序列化格式,也不能验证或添加funs,因为没有类型

Adapter, Filter拦截器
from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):return n if n < 2 else fib(n-1) + fib(n-2)

当然用反射或模板生成也能做到

Visitor
import ast

class T(ast.NodeTransformer):
def visit_Constant(self, node):
if isinstance(node.value, str) and node.value == "":
return ast.Constant(value="x", kind=None)
return node

ast.unparse(T().visit(ast.parse('""')))

同样,也没有什么接口要codegen , Swagger 也不再那么有用了。 你不觉得静态类型70%的代码,都是替编译器推导 读者都能猜到的信息吗

Observer
这个,在JS里,你看 Vue,React 就知道它们做到什么程度了。 Rx和Flow又是什么程度呢
Object.properties() 虽然很智障,但学Py函数化属性 是利大于弊的
Forwarded from dnaugsuz
Inject其实要涉及按类型查找等步骤,但在HTML/CSS 里都可以解释为属性继承
Builder可以做动态配置,但这点靠 {[is? k:k1]: v}, {...(is&&{k:val }) } 也能规范

JS的代理类,只能是动态的Proxy<T>,不能是T by val
拦截器对应到JSDOM,就是事件冒泡了

DOM有个 MutationObserver 能监听页面编辑,但无人问津, 更有意义的 ResizeObserver 同样用户寥寥,侧面印证了它不好用

Vue等框架用x=ref(),this.x, useWindowSize() 等API提供更原生的写法,在OOP里恐怕没100行办不到吧
#kt
duangsuse, [2023/10/12 00:02]
序列化器也是元类该充当的。

没看到各种T.serializer()组装和typeof满天飞

duangsuse, [2023/10/12 08:12]
问题不是在static变量上,而是 Int is Class 不成立,类没有类型

感觉有点变扭,我的想法是伴生对象的interface 应该公开,而不是搞什么新语法(何况是与C#里的语意冲突

duangsuse, [2023/10/12 08:14]
这种事情我一开始就想到了,kt语言初创时竟然没有预案,只有一个反射API可以强转伴生例
(而且Ruby里的元类就是。虽然rb不需要序列化等反射)

duangsuse, [2023/10/12 08:25]
随版本迭代增加语法,真的太逊了

设计语法框架时,就没有考虑过各种流行的用途和弱类型语言里的技巧
fun interface, context(T,T1) vs ()-> vs vararg
sealed-data object 这些通通都是抄也抄不齐,后来又改正的。 仔细想想就能发现,C#的密封类,不适合搭配kt 数据类。kt并没有努力还原真正的 idiom写法

其实把vararg,private,data 这些都做成注解,然后简化@语法,也没什么问题,而且能减少{}和fun的不一致性,避免一些语法上的不可复用

duangsuse, [2023/10/12 08:31]
像Ruby,Py这样弱类型的语言, 都知道 "Int"和 Int(1)是两个类型。更聪明的语言,应该直接削掉 static 继承这样不合直觉的“小问题”,甚至直接让 this 的隐式域不涉及 Companion.XX ,以及用元类取代反射

rust 却还在用 impl {static}
kt 进步了却不完整。 现在的compaion,才只是namespace吧?

duangsuse, [2023/10/12 08:35]
唉,都是历史问题

最重要的是,在被serializer() 这样的冗余代码解决后, 没人会记起“这是问题”

duangsuse, [2023/10/12 08:48]
这样按元类组装序列化器后,还有个外部扩展问题

Data等类的格式是可以分module的
真是个好东西🌝

Loney Chou, [2023/10/12 08:50]
感觉 kotlin 不应该用 T::class 这种写法来表达一个类的 class,而应该用与 T.namespace 相近的 T.class,T::x 应该只用来表达 T 的成员,而 class 显然不是成员

duangsuse, [2023/10/12 08:55]
kt的 T::x , x::value 也有点混淆
前者是创建为SAM,后者是 "取消链接访问"
背后完全没有核心思想

如果kt的语言特性,真的让companion这个术语“与众不同”的话,(a::b) 倒像是切换a的语意,取b

可惜它只是为了实现“static” 而搞了一个术语,这种程度而已。

duangsuse, [2023/10/12 08:57]
val x by 的用法

duangsuse, [2023/10/12 08:59]
既然本质不同,写法也必须差异很大
而如果是同类,就应该归到一种API或语法里

否则就是语法设计的锅

duangsuse, [2023/10/12 09:02]
很简单,只要把kt可变闭包在使用的 IntRef 公开为 Var<Int>

就可以把 x强转为Var 的子类。 反射Property也可以暴露为(OBJ)->Var<T> 之类

只需要加一点API ,许多语法层面的东西就不会是魔法,而且能帮助开发者思考(比如模式匹配/解构 的本质)

这样的“静态类型”才真正比弱类型有用,而不是有些莫名其妙的设计模式

duangsuse, [2023/10/12 09:06]
我是说,如果要为inline fun 或反射的可变数据创建类型的话,统一的Var 接口更合理

duangsuse, [2023/10/12 09:12]
我说的Var是包含 var get;set, operator fun get 的情况的,所以说它最好为inline宏所用

因此, var by T() 也不应该用 override operator fun 来实现。应该直接把属性视为具名的Var, 而不是拿“属性”这种特例去理解“变数作为值”的意义

它并不是一种反射工具,更类似于codegen,KSP的概念

duangsuse, [2023/10/12 09:19]
但这就是android-er在 MutableStateFlow 里做的技巧,以及Solid比React的“进步”

本来,这是像{}闭包一样理所应当的概念

duangsuse, [2023/10/12 09:30]
def f(x, *) 真的有意义吗
只是分隔符的话,js的字典也能做到

duangsuse, [2023/10/12 09:32]
kt里 fun f()=fun()= 应该比这个好玩

它也支持位置+kw参数,而且理论上,这样的kw更方便从ini动态加载,因为 f(a=1,) 是对象

duangsuse, [2023/10/12 09:36]
是fun()={}
我觉得把 def 写成bash CLI 式传参,只是种限制

这种限制还没有JS里的配置字典/参数默认解构 聪明
JS的这种函数,是可以用类型来描述的,但(*,y) 只是个严苛的语法糖

duangsuse, [2023/10/12 09:39]
单纯验证* 后面不能直传意义不大

它的本质是,你有一大堆kwarg无法排序吧? 那就该用对象。

duangsuse, [2023/10/12 09:44]
当然更正常的做法,是就用 f(a=1)(2) 两个括号,函数式inline优化。

这样方便kwarg完全相同的调用,你用bash想想就知道很常见

还有一个好处,就是免费支持 Map<Str,Any> 的反序列化,就像**python


Silence Acappella, [2023/10/12 12:12]
如果序列化全部都是靠serialize和deserialize这两个方法,那么descriptor是干啥的
还有那一堆element

duangsuse, [2023/10/12 12:21]
这不是自动生成的吗? 有什么需要你自己实现的功能?
你是想压缩,还是读取 Any,Number 等分支类型?

sealed class 序列化是支持的
是你的数据类型有问题吧, UUID.serizer() 不会很难,如果全都需要手写,应该是你的类型树本身「不好用」

总之,你的数据应该可以理解为嵌套的 Pair<AB>, Either<Int,Str> 这种形式

这样它不仅支持读写保存,而且,勉强是能用的; 不然就会很坑

既然你都觉得descriptor 很不好写,就不要碰它们。 你应该在反序列化后,做init,check()等预处理

duangsuse, [2023/10/12 12:33]
JsonElement 本该映射到 readAny is Map<*,*> 这样的形式的,我也不赞成他们的「强类型」搞法

序列化不就是给 Num/Any,Str/Enum, User, List<T> 这些类型外附上 s.readObj(T) { obj,k读写器,v->v.set } 这种读写器吗

好像也没什么中介的必要,class,List 本身就可理解为JSON

而Any,Num 可以理解为 typed={User: {name}} 这样的JSON

最好不要在Object树里,再套一层union 。 其实添加 fun Object.深遍历 并不难
duangsuse, [2023/10/12 12:48]
描述符是对「类型标注」的冗余吧?

这不是自动生成的吗,为什么要手动从JSON AST 转换?
你的手写,应该是做 Str- UUID 验证 这种逻辑吧?

..好吧,除了 val field=Str get()= , 貌似没有不做的方法,这也只能手写

isekiのChannel, [2023/10/12 12:50]
不是,比如说我的entity和我的序列化目标结构不同的,我不想把DTO暴露到程序里,所以就嵌入到序列化器里

duangsuse, [2023/10/12 12:51]
SerialName 那种? 结构不同.. 如果是我,会先用JS做一遍 tree walk ,因为Kt的序列化器太不规范了
这么多T.serializer(), descriptor 和 element ,结果实际上还要手写 read,write ,而且好像是和 Encoder 耦合的(就是不能同时支持 json,csv, BSON/CORBA 这样),这不叫不规范?

JSON 是理解数据格式的很好方法,如果只是要吧数据加载为class{},来做脚本,我会选择预处理的间接层

duangsuse, [2023/10/12 12:58]
最好的做法就是手写 JSON parser ,然后你就会发现,它只是吧 [] , {},int/str/keyword 这些语法规则,分给 Any, Int, User 这些类型去创建或匹配分支而已

当然,这涉及如何为 User::class, List<?> 外部扩展 Serializer 接口,以及赋值"key"=Any?、检查键值是否完整的问题。 最终要组织的是一个「元类单例」,它实现了流读写 ,同时也可以被其他类型引用

总的来说,就像解析器创建Any类型的 {},[] ,序列化器要据类型读取{}, 123,1.5 等值,同时也要支持判定并读取 Any,{type:User,}

序列化器,就是通过查询 data class 来剪支的解析器,它读Any时,就像个 json parser , 要先判断Int,Str,Bool,, 再读按类型dict


duangsuse, [2023/10/13 21:27]
py很适合这些 ,当然按键精灵是AutoJS也可以
感觉用str template更好吧

duangsuse, [2023/10/13 21:26]
unsigned 不是用long/BigInt + 读写器就可以吗
>u8可以用byte u64就没有替代品了
给BigInt 做个 load dump 勉强能用吧

duangsuse, [2023/10/13 21:37]
面条点:
header() 不支持null content ,没有 run{}域
method 判断有点奇怪
body为空,提供 ZERO_SHA256
Buider...sign 是通用逻辑,但没有外提为 useRequest{}

但这就是Java..

duangsuse, [2023/10/13 21:38]
我是说,应该用 header(, ?:)

这样也更好看,所以说那个if是面条
Kotlin 虽然一般写法被Java社区带偏了

但和ES6一样有定义式编程的底子(怎么感觉Lisp式调用加点赋值块,就都OK了
算式级不会有样板代码, 顶多class没法被框架化

Java 就是无药可救了,历史包袱
duangsuse, [2023/10/13 11:22]#PLT
继承自值呗, JS 里一个 Object.assign 完的事,一般用于修改函数Mock
《这就是 Kotlin 》
constructor 是OOP的经典操作,Kt都支持 val 构造器你还想怎么样!(

最多 typealias Str=String
或者直接 val action by map

open class(val action) 反而会增多代码量,因为「继承优于组合」。

duangsuse, [2023/10/13 11:26]
OOP 复写真的把光吃不干演绎到了极致,这一点上我支持Rust,Go。 var f: This.(T)->R +推导都比 override 直观, class{inner class Add(Vals)} 都比透传构造val合适

这类型标注明确的好像程序员或者框架是傻逼一样

到底低能到什么程度才会写出 xx:Str="abc" 这样的代码,好像Kt支持了自定义隐转一样。程序员每天都调哪种函数 编程语言找不见吗,为什么总是把骚操作符号化,把常规写法弄得又臭又长呢? 这大概就是编程吧

open class Base(val x:Int) {
data class Add(x:Int, val y:Int): Base(x)
} 
Base.Add(0,1)

当然,你也可以隐式参数
open class Base(val x:Int) {
inner class Add(val y:Int): Base(x)
}
Base(0).Add(1)


如果重复val>3 ,建议直接 by map

duangsuse, [2023/10/13 12:10]
虽然《组合优于继承》 只是Rust粉喜欢强调的独特点,而且 Rust 的 traits 接口都非常散漫,但OOP实在是太冗了,在组合时甚至不如 struct{}

class 本来应该被视为 interface+constructor ,也就是能暴露局部变量/函数的 fun ,和JS的参数字典差不了多少,但Kt的对象模型,并没有比Java清晰多少,
继承本该理解为2项组合+隐转,但Kotlin及一众OOP语言并没有为这个本质提供语法(比如把 inner class 推广到外部继承), 反而是执着于 constructor, new, Inject 这些的糖味的障眼法
再比如 fun=object 和 inner class 间并没有统一,许多人不以为SAM接口会保存调用栈的变量; sealed 和 enum 间不一致(反观Rust就都是enum),const 和 inline, val field 等概念也未成体系

by delegate 也没有被做成 extend class:接口 的更合理的形式(与 fun withThis.fn() 时判若两语
实际上, val by 只是掩盖了class级反射和codegen的难用,但Kt在版本迭代中APT,KSP,KCP 等等最佳实践层出不穷,就连 companion 也在 object 和 namespace(interface) 间切来换去,好像元编程问题就没有一个数据模型。

许多功能都是自顾自地加语法,从未反思过是否既存、是否完整,就比如 val() 解构 vs. forEach解构, 再vs for(in), unboxed IntArray 和JVM的Stream.OfInt 间谁更贴近模板泛型,用重载当隐转是否够用,等等。
整门语言发展得快, 但正是因为发展空间太大, 暴露出作者没有为各种语言构件的应用化,做些基础的铺垫
sN1DPmwfQug, [2023/10/14 11:08]
数学书就没几个词,都是在思考
读数学书无所谓什么语言,学术上来说英语相对有更好的资源可以探索,使用英语术语可以帮助你更好的与其他人交流,检索资料,其他更多的用处我也不列举了,这种讨论毫无意义,爱看不爱,给你中文数学书你不喜欢看也不会看,翻译在数学阅读中影响占比几乎微乎其微,不是说不影响,是和你的努力程度相比,中英文转化是最不起眼的一环。

duangsuse, [2023/10/14 11:28]
你是不能脱离图形或语言符号而思考的。 语言并不是约定俗成,它被设计为紧凑而直观地反映心智模型

你可以用编程/图形/物理的记法体系读数学,会有不同的理解效果
就像你说的, 不同语言的资料集的面向有差异, 也不能说只有“标准写法”是对的

sN1DPmwfQug, [2023/10/14 11:29]
题目都是那个题目,翻译成中文你也不会做

duangsuse, [2023/10/14 11:32]
编程的本质,包含了整理和代换。 虽然大的算法(比如排序、记忆化递归)你搞不清,
但每个步骤的原理是可以说清的。 名字就是对这些步骤的摘要

即便都是中文,如“变数 函数 参数” 也比 “变量 函数 传值” 更体系化,更富有语意(放一块就不存在「函数值」的“特性”了)。不能忽视这些设计

duangsuse, [2023/10/14 11:34]
一些译者纯粹是做“人性化的机翻”,但不代表这个问题是伪需求。

如果你真的喜欢数学,就应该去改进它,而不是重复前人的成就和错误,学习如何成为人肉GPT。

duangsuse, [2023/10/14 11:37]
你的意思是, 把英文文字 译为 中文文字, 不会改变问题的复杂度

而我说的不是问题,或者公式使用的符号。 我说的是「语言」,那是问题建立时依据的心智模型。

翻译时,这个模型是可以被重新设计的(就像编程语言的静态类型),所以不能说只翻译对思考无益

其实我的努力就是“翻译”, 这是易混的一点(
对于你们,可能是努力思考了; 但我不爱思考具体的问题,我思考问题和术语间的关系,也就是所谓转化

sN1DPmwfQug, [2023/10/14 11:40]
哥德巴赫猜想 用英文给你写一遍你不会写你说这是翻译导致的

duangsuse, [2023/10/14 11:41]
我还记得有个人证明了费马大定理,但是一页纸写不下(
我刚才说 我的字典里「翻译」 不是对文字或符号的翻译, 而是对语言或「心智模型」的归纳和重新建立

你说的努力思考应该是解题, 我说的咀嚼知识则是「归类和转化」。 二者应该是不冲突的

duangsuse, [2023/10/14 11:54]
😓感觉这个「翻译」问题上纠结也太杠精了…… 不过这是我写博客的方法,见谅。

我说的翻译,应该是指把东西移植到 desmos.com, sym/numpy,Matlab 上,而不是做中文音译,看不懂英文才无聊呢。

duangsuse, [2023/10/14 12:18]
要是这些B LA书解释下 ndarray(shape A>shape B) 的计算是怎么推广的该多好啊

之前想做一下JS-WebGL的bind,最后发现Nd矩阵比较难做

duangsuse, [2023/10/14 12:21]
我又不想学数学, 我只是物理世界的用户呗
可以移植到计算机上的数学我也是支持的,

比如Var<T>作为值+编译期eval,取代模式解构或匹配,我就很支持

把类型系统做成关系式的函数数据库,只要既能支持「高级特性」又易懂,我也很支持

我谈的不是数学啊, 是你眼中属于数学范畴的东西,在现实世界的影子; 很遗憾,两者就是隔离的

duangsuse, [2023/10/14 12:25]
那请你讲讲你熟悉的Kotlin 和 Haskell 如何为 fmap 这样的算式推导类型的

讲不明白但能用,叫懂吗?

duangsuse, [2023/10/14 12:26]
那不就是查询「支持Var」的关系式数据库吗

也就是,能够求解 [Pair A B]=[Pair Int Str], B=... 这样的逻辑式
只知道 unify 那几个词,却不会把Var推广到更多用途(比如 Reactive,Events) 才是表达力差。

函数、变数、闭包(对象) 这些都是编程语言的基本成分, 不需要那些术语来解释背书
duangsuse, [2023/10/14 17:16]
🤔 知乎上有两种观点, 有人说前端就是写个分页路由器,哪有竞争力
有人说 Flutter 连Web的吊车尾都够不到

CSS被人诟病不模块化,但它起码有1px这种数据模型和style复用,有成熟的快速原型工具。
拿Qt,各种View Object 比DOM树就像拿canvas去比SVG。虽然用canvas的大佬云集,但它背后的思想毫无设计体系与组合力。 一旦没了API隔离的护城河,很容易被新需求冲烂(就像各种H5 WebView 一样)

不过对于Compose来说,还算是对HTML的进步了,毕竟Linus说过,XML是极少数对机对人都烂的数据语言,JSX模板也是Web的一大憾点

duangsuse, [2023/10/14 16:44]
感觉 NoPosts() 是「搜索结果页」的通用模型吧,应该做成 open class, HomeUI 是它的特例。


总之,不用滥用多态,如果null能实现用 ?.run 也挺好
原来如此,说起来 java.io 版 DataView 的bitconcat读取就是硬编码的


所以我对Java界「工业级」数据模型或算法的直观度观感不高

btw. 前几年我也被带偏了。哪有什么 int long 啊,都是 byte 4,8 ,这些private fun也不好看

Omico l Dev, [2023/10/14 17:16]
[ Album ]
kotlinx datetime 想获得下面的格式难道只能这么写?

duangsuse, [2023/10/14 17:21]
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").run{
LocalDateTime.now().format(this)
}

duangsuse, [2023/10/14 17:25]
你这个需求太奇怪了

KMP没有的接口,如果不想变通
最好是分JVM,JS,libc 去实现,这样还可以封装出去赚star,而不是自己做一个

duangsuse, [2023/10/14 17:39]
说的也是,不就记个小log呗,replace能有多大开销

只要不涉及IO通通视为0开销

duangsuse, [2023/10/14 18:00]
固定位数的 ints load/dump 可以手动divmod:

>请实现固定位数的 fun IntArray.dump(StringBuilder out, vararg n:Int)
例如, [8, 12].dump(sb, 2,2) 显示为 "0812"
请对每项 i0+=n[nth] 用itoa算法实现 out[i0+i]=数位

fun IntArray.dump(out: StringBuilder, vararg n: Int) {
var i0 = 0
for (nth in n.indices) {
val i1 = i0 + n[nth]
for (i in i1 - 1 downTo i0) {
out[i] = '0' + this[nth] % 10
this[nth] /= 10
}
i0 = i1
}
}


def dump(self, out: str, *n: int):
i0 = 0
for nth in range(len(n)):
i1 = i0 + n[nth]
for i in range(i1 - 1, i0 - 1, -1):
out[i] = chr(ord('0') + self[nth] % 10)
self[nth] //= 10
i0 = i1

dump([8,12], a:=[0]*4, 2,2)


最近免费AI的智商变低很多

duangsuse, [2023/10/14 18:01]
还好吧,人总是有事干的, AI取代动手我们就做设计 做自老板嘛
不过看起来它越来越笨 了,变成搜索引擎了,我最近一个月都没太用过

在我的想象里,
>请实现固定位数的 fun IntArray.dump(StringBuilder out, vararg n:Int)
例如, [8, 12].dump(sb, 2,2) 显示为 "0812"

就足够清晰了,但AIGC后还需要除错……

duangsuse, [2023/10/14 18:16]
记起来了,这个 for(nth 应该是一个宏,只提供赋值

typealias Add<T>=(T)->Unit
fun IntArray.tuples(to: Str
ingBuilder, vararg n: Int, f:(Int, Add<Int>)->Unit) = {
var i0=0; var i=0
n.withIndex().forEach { (n,nth)-> i=i0; f(this[nth]){ to[i--]=it }; i=0;i0+=n }
}

fun Int.Str(to: Add<T>)


(好像又更复杂了…… 我是想暴露subarray
总之这种buffer 复用是一类优化,有模板
Silence Acappella, [2023/10/14 19:08]
主流的前端框架里

Silence Acappella, [2023/10/14 19:09]
有什么是擅长交互和3d渲染的

duangsuse, [2023/10/14 19:10]
https://spline.design/
https://aframe.io/

duangsuse, [2023/10/14 19:12]
https://github.com/jagenjo/webglstudio.js
https://github.com/tentone/nunuStudio #game
https://github.com/aframevr/aframe-boilerplate

duangsuse, [2023/10/14 19:16]
看起来开源软件还是不行啊, WebGL,three,d3js 不能直接用,流行实现都是闭源的

p5是2D的,DSP比较强的Web也还是比较拉垮

https://animejs.com/
https://photo-sphere-viewer.js.org/
https://splidejs.com/ 那种GL过度特效都能收钱

duangsuse, [2023/10/14 19:23]
印象里Web的3D交互也还比Qt,DX 好一点,可惜框架太少了

除了gamedev, 3D仿佛是上个世纪的技术了

duangsuse, [2023/10/14 19:25]
我觉得最逆天的是, 3b1b manim 这样的开源弹性动画+Py式PPT
都能拔得头筹

前端和脚本界真的是天上地下,牛的牛死
M$的工程师果然牛逼, 凭着C++那种烂语法都能写出各种带3D的WinForm

不过之前看GPT好像会写弹球和植物大战僵尸的,可能就是爱看高级工程师的代码
duangsuse, [2023/10/14 19:33]
感觉还是牛逼的人都去M$, Google 了,做开源的太少
M$的开源率好像比GOOG,FB的低

KODI,OpenWRT,ffmpeg, Blender,Godot 这些都算开源界顶级,勉强能和业界接轨(?
Matlab,CAD,AfterFX,Office 那种就难了(开源界连个 Web Office 都整不出
毕竟愿意无偿写代码的大佬少

duangsuse, [2023/10/14 19:58]
写动态域可以先看我的(不含数据结构
JS 里可以直接用原型链做「嵌套KV」
[{a:1}, {b:2},kv={b:3}].reduce((A,B)=>(B.__proto__=A,B))
实现了 with(kv){
push({b:3})
b==3
pop()
b==2
}

看来你还是不愿意用JDK Nashron 或 Luajava,Rhino

手写这种/命令的话 ,最好不要做局部表
另外
Scope<*> 是无法add的
type 是干什么?隐式this吗? 那应该保存 Any

duangsuse, [2023/10/14 20:04]
你这个卡牌游戏也有点逆天…… 我拿CLI举例下

首先需要抽象的,是用于执行回合的牌桌

比如,创建每个有手牌、有pt和flag的Player ,消耗手牌也做在上面
手牌的效果,由牌桌来提供选择器、分发

发牌可能要用的概率分布等算法,定义为util fun

你把太多精力花在不必要的序列化和动态加载、「弱类型化」上面,还不如先想想特效和回合流程怎么平衡

如果你不止想做个toy ,这种游戏应该需要大量事件/await,和WebSocket那样的文本流、跨端调用

duangsuse, [2023/10/14 20:15]
所以之前就说了,可以做成组合函数,搞成嵌套数组,不就能序列化了?
a<b? log(1) : c

when(get(op('<'), 'a','b'), call('console.log',1), get('c') )

call=(k,a)=>(局部作用域)=>eval(k)(...a)
get=(...keys,fn)=>fn(keys.map(eval))

op=k=>(a,b)=>eval(a+k+b)
when=(is,a,b)=>is()? a():b()

duangsuse, [2023/10/14 20:17]
(原来ES6 在前端里真的这么不受待见

原来 React 的 tbody.map(tr=>) 真是种装酷的写法,我还以为他们迫不得已呢……

duangsuse, [2023/10/14 20:22]
既然你想做这个游戏,你能把基础玩法和灵感,先写个文档吗?
你的卡牌要有数据库, 那典型的几种选择器和效果,是什么?

这些和代码无关的,反而最值得你优化。 一些复杂性很可能只是你的需求自相矛盾

duangsuse, [2023/10/14 20:24]
感觉get不到嵌套次序
[[ary]] 应该是很少几项吧

这种写法确实很bash式参数

duangsuse, [2023/10/14 20:25]
看错了, [[ary]] 是一个语法糖
TOML 嵌套和JSON差不多

duangsuse, [2023/10/14 20:29]
看了一下, TomlNode.toStr 有700行
是你朋友写的吗? ps. 头像很福睿

duangsuse, [2023/10/14 20:31]
那你很厉害,Decoder,Encoder 的实现还挺直接
#blog #tr 《PL 表示法有碍于入门》

#PLT 俱乐部的人 Y 组合器身上纹,却被会员评价:字体不好看

符号可以使思维清晰。使用正确的符号,一开始就能轻松地完成工作,让不重要的部分消失
Mike Hicks 认为,像 8÷2(2+2) 这样简单的算术表达式也难倒各种人,妨害 PL 研究的影响力
最好的符号是简洁的;它们在视觉上具有暗示或继承性,

有人抱怨使用函数化命名而不是数学符号看起来不那么 PL
但——这就是简化记法的一个理由!我们作品的美学很重要,但PL已经以深奥的符号而闻名。
大部分论文能将一两个符号改为文字而进步

作者建议:
-增加清晰度/减少混乱将扩大我们工作的范围并减少协作障碍
-标准化设计清晰的单字符体系
-无论类型理论、语言还是 API——都要做复杂性预算, 作为警示
-总是用简单、易发音和众所周知的符号代替,顺序更要自然

比如说,小步语义的 ⟶(暗示“从左到右”),
子类型的 <: ( : 让人清楚构造器的类型,但对于 Java 程序员来说读不懂)

SKI,Y 函数里,I至少表明了恒等(Identity),但Y()做不到
建议换为rec/递归, fix/不变点

Guy Steele 整理了 POPL 中使用的 28 种不同的等效写法,e[v/x] 的e=v是最常见的

渐有类型和契约的文献,类型转换有3种难看写法,都被内嵌于BNF:
<S=>T>e; <T<=S> e; e : S=>T

C 表示法,(T)e 在泛型里不好用,但这些都是技术细节,问题是没有人认真提出将这些强制转换作为编程语言的一部分
cast(e,S,T) 就更加明确

--评论区后续

><t=>U> <s=>T> e ~= <s=>U> e 比嵌套
cast(cast(e,S,T),T,U) ~= cast(e,S,U) 好看
而且AST上的信息比调用树多不少,难写明

A.中缀运算符很难0基础解析
B.嵌套不易写
目标.写法相同的算式,更能读懂语意联系

e :: S => T 相对简明,但箭头不支持组合
但其实,这种转换根本不存在。作者在POPL2010使用过<>符号,但他想换了

btw. 是在说推导出 e:Int=>Long 应生成 Long(e)
符号形式应是 (e:T):T0 = e:T0, T0=U , (s:T) 应自动理解为t=>U 里的变量t。另外这里(A~=B)不是指“A可赋B” 所以删了

合约是指 {x:Int|x>0} 这样“给字面量类型”
duangsues.is_a? SaltedFish
#blog #tr 《PL 表示法有碍于入门》 #PLT 俱乐部的人 Y 组合器身上纹,却被会员评价:字体不好看 符号可以使思维清晰。使用正确的符号,一开始就能轻松地完成工作,让不重要的部分消失 Mike Hicks 认为,像 8÷2(2+2) 这样简单的算术表达式也难倒各种人,妨害 PL 研究的影响力 最好的符号是简洁的;它们在视觉上具有暗示或继承性, 有人抱怨使用函数化命名而不是数学符号看起来不那么 PL 但——这就是简化记法的一个理由!我们作品的美学很重要,但PL已经以深奥的符号而闻名。 大部…
It’s Time for a New Old Language/2017
Guy L. Steele (Scheme,Emacs 作者)
对比下引文中「通用语言」与绝句术语

• Built-in datatypes: boolean, integer, real, complex, sets, lists, arrays
Str Int4,N YN N2 [Ln,Set,Ary T]
String Int,Long,Float/Double Boolean Vec2 List,Set,Array<T>

• User-declared datatypes: record / abstract data type / symbolic expression
data T(); type 样板为T0; S=[May Str [Ln S]]
绝句实现如 [Ln [Pair Enum Any]] 序列化的“元类扩展”也是一种S-表达式 执行

• Code: Inference rules (Gentzen notation)
相继式演算,和 unify(|,=流过滤) 都能证明逻辑算式
其推导步骤都是一个序列,有一个前提集合和一个结论,就像泛型 'T'(T Sorts) List sort 里的变数T的上界

• Conditionals: rule dispatch via nondeterministic pattern-matching
when, (A==0):return, '(文字匹配)?'/"输入"

• Repetition: overlines and/or ellipsis notations, and sometimes iterators
argv:[[1 rest,.]], Nd([x y z]), Seq.goesR和协程

• Primitive expressions: logic and mathematics
名/记平权: x==100 or (3<x, x!>100, not x==2), x in 4~100
x==100 || 3<x && x<=100 && x!=2

• Capture-free substitution within a symbolic expression (Church)
(λx. x y) z 可以免费把y换成w,w的值不会受到xy的影响,即f.bind(arg)

根据「类函变参皆数」原则,y=[Var Str], (Fn1:[y]Fn1:[x] x+y)(w) 能实现值上的代换

Expr BNF:
id \x:T. x
(id 1)
add \x:N.\y:N. +1(+ x y)


E=P(['',//分支. P7 都看不懂,符号复用率过低 歧义也太大
[x, 'Var k'],
[入,x,sig(T),P, 'Fn ,k,T,e'],
[':', T,sig(Tk),P, 'TYPE ,T,T0,e']
[P,P, 'Fx f e'],
])
T=P(['',
[x, 'TVar k'],
[入,P,P, 'FnT ,A B'],
['变',x,sig(Tk),P, 'TFn ,k,T0,T']
[P,P, 'TFx P T'],
//type作为值就省了,因为类型变数间有=,|关系,不应该求值
])
sig=x=>[':',x,'.', (a,x,b)=>x]
//*->* 比如 List<_>
Tk=P(['', '*',[入,P,P, 'Kind ,A B'] ])
入='\\'
说到BNF,以上PRR还支持
x? [1,x] x* [0,x]
x, [0,x,',',{a.push(x)}]
(x) [2,"()",x]
相比COBOL这些老语言的元编程文档, 算是去英文化了,就像 json.org 的图

我看不懂 Γ-> 和两段式,M: τ ×sigma 这些语法从没定义过
而且这符号冗余率也太高了

说句心里话:
这都是什么烂代码啊?行走的同义词典? 不愧是Emacs那难用编程语言的作者
duangsues.is_a? SaltedFish
duangsuse, [2023/10/14 17:16] 🤔 知乎上有两种观点, 有人说前端就是写个分页路由器,哪有竞争力 有人说 Flutter 连Web的吊车尾都够不到 CSS被人诟病不模块化,但它起码有1px这种数据模型和style复用,有成熟的快速原型工具。 拿Qt,各种View Object 比DOM树就像拿canvas去比SVG。虽然用canvas的大佬云集,但它背后的思想毫无设计体系与组合力。 一旦没了API隔离的护城河,很容易被新需求冲烂(就像各种H5 WebView 一样) 不过对…
duangsuse, [2023/10/14 20:22]
既然你想做这个游戏,你能把基础玩法和灵感,先写个文档吗?
你的卡牌要有数据库, 那典型的几种选择器和效果,是什么?

这些和代码无关的,反而最值得你优化。 一些复杂性很可能只是你的需求自相矛盾

duangsuse, [2023/10/14 20:24]
感觉get不到嵌套次序
[[ary]] 应该是很少几项吧

这种写法确实很bash式参数

duangsuse, [2023/10/14 20:25]
看错了, [[ary]] 是一个语法糖
TOML 嵌套和JSON差不多

duangsuse, [2023/10/14 20:29]
看了一下, TomlNode.toStr 有700行
是你朋友写的吗? ps. 头像很福睿

duangsuse, [2023/10/15 10:54]
https://kotlin.libhunt.com/koda-time-alternatives
val start = now + 5.minutes()
val end = now + 15.minutes()


看了一下。 我觉得Date的设计就不合理啊…… 它就是一个int2tuple 转换
直接把 plus,minus 推广到Date上,写这些 timespan 库干什么,很像 range/slice 这些同义词 😅

fun lift(op:(N,N)->N): Date.(Date)->Date = { Date.from(op(this,it)) }
plus=lift(Int::plus)

(虽说,工业界都拿 math.sumprod 当np.dot用,不知道向量怎么用 😐

duangsuse, [2023/10/15 10:55]
你直接去py群问
kt能干什么ML? 连API桥接都没人做

甚至JS都有标准的 AudioBuffer, SpeechRecog,TTS 接口
kt都没重封装JVM的工具库
stdlib https://kotlinlang.org/api/latest/jvm/stdlib/org.w3c.dom.mediacapture/ 的文档还是空页面

kt,C++这些在数理应用上都是废物,一直在阻碍AI的发展
用它们无论写理论还是app都废话多功能少

duangsuse, [2023/10/15 11:07]
看到一个有趣的:tau=2pi 被认为才是真的PI 🤔

哈哈,又是古老的重构…… 如果用 Vec.xy 取代sin,cos 应该就没这个弧度问题了

duangsuse, [2023/10/15 11:09]
以前我 let DEG=2pi=360deg ,方便给vec2设置旋转
没想到这也能叫改进…… 只有PI受伤的世界呢

duangsuse, [2023/10/15 11:12]
主要是又区分 date/time 又新建 timespan 也太离谱了

明明就是,你给long一个单位,进制换算, 结果无数个新数据类型和lib……

isekiのChannel, [2023/10/15 11:12]
你看看Go的 time.Time 和 time.Duration

isekiのChannel, [2023/10/15 11:12]
但使用起来无比丑陋,而且容易出bug

isekiのChannel, [2023/10/15 11:13]
time就是time,不是int

duangsuse, [2023/10/15 11:13]
Time= 自0时(Epoch) 开始的Duration

我就是说time是long的 inline class 嘛
明明一个重用率<5% 的type,却设计得如此膨胀

duangsuse, [2023/10/15 11:14]
是啊,所以只需要用 1.min, 1.hour 来 check就能加减了
Julia Unitful.jl就是这样

duangsuse, [2023/10/15 11:16]
这些所谓的细节(time.h , libc,.),都是需要支持+-*/ 的

如果是精度就应该用bigint 。这些开销是无法回避的
可惜比较算式化的 python 也没认真设计这些

duangsuse, [2023/10/15 11:17]
我说的不是long vs int ,我是说Date=有单位的 integer

duangsuse, [2023/10/15 11:18]
时区和显示也就是个加减问题了,但Date的本质是整数

所以,其实就是工程界普遍,无法把一个问题解偶, 导致随着App的增加,类型越来越复杂

duangsuse, [2023/10/15 11:19]
你要区分「显示形式」和实质……
物理时间,无论世界的哪个地方都是一样的,只是书写形式不同

就像编程语言,只能用范式,而不是语法糖和API来区分
那些都是跨语言的

duangsuse, [2023/10/15 11:20]
所以说,timespan 这些工具类,应该被理解为 Instant 这样的“数值类型”呗
而Date ,其实只是 from/to 构造器

duangsuse, [2023/10/15 11:22]
IO、UI的问题要分着谈啊,
为什么后端总是搞不懂,用户只会在操作系统里调时区这些设置……

就好像一些 data table 的程序,它们不会把数据给Table组件排序
而都是硬编码

如果这些处理,是分应用、框架、OS层次的, 许多技术和API就会消失

duangsuse, [2023/10/15 11:24]
我只是依照「<5% 复用率的types,都需要更多权衡」这些设计原则

duangsuse, [2023/10/15 11:26]
在JS里,Date基本只是toStr的职责,但Java可能对它做加减和距离比较

但这个类型,其实就是专门方便UI做的, 它本该更广泛, 比如读取 “10万8千” 这样的单位,加权求和

duangsuse, [2023/10/15 11:32]
这其实还是UI的问题,只能提供元祖上的加减法,由被调侧决定有多长
因为>=1month 的加减在数学上是没意义的,自然不可能涉及timespan

duangsuse, [2023/10/15 11:36]
不需要第二个类型,一个支持按tuple加减和读写的 IntVar+DateFmt+Locale 应该就是各种Date了

在用法上都是支持的

duangsuse, [2023/10/15 11:37]
比方说,你显示+1day 的日期, Date().add(days=1).Str 肯定比创建两个span,或setDays 要好看啊

duangsuse, [2023/10/15 11:39]
timespan, 按libc 的概念应该要加法有两个“Date”

duangsuse, [2023/10/15 11:40]
算了,不说这个了,反正Linux的时间API不会改,也没有千年虫问题了

Semver Cmp? Ver Semver? (|| Semver)? --N项树,不是+-*/
Cmp /\^~=|([<>]=?)/
Ver v di(. di)?(. di)?(- Str)?
di /\d+|\*/

semver 判断区间的方法,应该是把 1.20.3 转为 1203 吧,这样大版本不同也不能兼容
最好是每个点固定1_0000等位数,这样也避免判断麻烦

pkg manager问题有那么严重吗,都要上二分bisect了…… lock文件可以缓存吧
>=12 <14 || >10 應挑選 10 这一条我觉得有点奇怪,虽然语法是对的,但这就是个区间过滤器,其实不能当成算式联立去编写。
^12 应该也是>12 的意思吧

其实现在有种观点是,apt那样各种版本限定符太严苛了,npm重得太可怕
pip; pacman; npx 那种全局单版本依赖更流行
duangsuse, [2023/10/16 13:21]
感觉取消不应该抛异常啊…… 比如fetch() 下载文件,主动取消,有什么该处理的呢

duangsuse, [2023/10/16 13:23]
比如上面那个delay的例子,取消就是 Dispatcher 去run() 时啥都不干了,就叫取消了

就像进程的exit() 一样

duangsuse, [2023/10/16 17:53]
翻译:
骰子是一个 OldVal<AddAttr<Int>>(v, used=false) { fun invoke() }

结果是 N个骰子.groupBy点数.eachCount

duangsuse, [2023/10/16 17:55]
建议你搜索 Trie
其标准实现是正则匹配
或者 dir.list()

duangsuse, [2023/10/16 17:58]
你看,只支持 trie[a][b] 的嵌套情况,反而比递归的复杂些

duangsuse, [2023/10/16 18:11]
其实就是 Map<X, Map<Y, Z>>.get(X)= get().values
这个重载…… 第二个Y当然可重复啊

不知道是怎么说得那么复杂的, 好像比trie简单。

duangsuse, [2023/10/16 18:12]
Mongo不是 java.util的外置化吗
为啥比SQL厉害

在我看来,直接绑定为 List,Map 就好了,除了 connect("") 就没有差异

duangsuse, [2023/10/16 18:16]
其实呢,你做个 A:User follow B 就知道SQL对1:N的支持更好
用dict-list 的反查需要写 user.filter{ b in it.follows }

TEXT[] '{,}'pg也是支持的

duangsuse, [2023/10/16 18:23]
其实你应该用 operator fun get, 是支持多参的

另外,如果你支持 getVar():MMap.Entry 就不需要支持set+remove了

duangsuse, [2023/10/16 18:25]
kv2.flat{it.entries}.findKey

duangsuse, [2023/10/16 18:25]
可是过度Java化也是没意义的,你都已经kt化了

duangsuse, [2023/10/16 18:26]
python 里list[:] 和numpy的切片甚至是多维的
而你写的复杂度,还没达到算法(实现性差异)隔离的要求

duangsuse, [2023/10/16 18:28]
能自创这样 dict[(a,b)] 的数据结构,我看提需求的人也没重视性能……
duangsuse, [2023/10/16 18:58]
现在有这种 get()= field 子类型的写法了

虽然我觉得很茴字四种写法,但似乎比两个val好

duangsuse, [2023/10/16 19:18]
太逗了,应该 val get 的做成 fun
大概要退化到Qt那样,用 v(), set_v() 好了

duangsuse, [2023/10/16 19:43]
实在是太混乱了,和某些JS“函数式框架”的 freeze()一样,kt集合可变性纯属过度工程

duangsuse, [2023/10/16 19:46]
当一个纯属语义检查的玩意,被附加“缓存池” “纯度高” 等抽象的政确后,就变成似乎是另一门编程语言一样麻烦。

duangsuse, [2023/10/16 21:51]
我是说 List无论是否Mut,都应该映射为 util.List ,因此 toList 不能有复制语义
runtime 时不可变是无意义的

duangsuse, [2023/10/16 21:55]
其实分那么细,没意思了

我有个想法,把 let/run代换成 1.as:[x]
also/apply代换成 user.to: name=""

或者说 1:+1 ; user|: age=:+1

map,forEach同理

duangsuse, [2023/10/16 21:56]
没错,我没打算给这些老语言提建议

它们根本看不见每行开头的冗余

duangsuse, [2023/10/16 21:57]
这就说明你作为程序员,不重视软件的本质
所以你的思考就会被篇幅所占满,

别忘了你用的libs 也一样。 这就像生态系统的毒素一样,是传递性的

duangsuse, [2023/10/16 22:04]
这样滥用as 还有个好处,可以让流控消失掉
for(x in users)
if(x.isAdmin) print(x)

users:[x]
x.isAdmin: say(x)

1{>2}==NO //takeIf,f
irst,filterMap
users{name=='Jack',age<10}!
users.if{it.isAdmin}: say(it)

甚至函数式都会消失
"abc".firsts("a")==$Y // takeWhile
[(0~9),. (0~9 by -1),.].firsts{it==0}.N==1

包含跳转:
for(x in users)
if(x.isAdmin) print(x) else break

users:[x^]
x.isAdmin { say(x) }: return

duangsuse, [2023/10/16 22:23]
这种语法很变态,但依然有意义,是因为它能够被整理为2个情况

1. if,to,as 多单项函数: filter,forEach,map ,正好是SQL小礼包
2. 1,[1]. as{it==1}, isXX {$Y}:$N, Either{A}{B} 多单项选择

这种可不是语法上的可读性,而是整个编程范式都易学了
比较类似把YAML,SQL,numpy 的功能刻印到kt上,但不干扰之前的OOP体系

为了这样的体系,和旧语法割席还是做得到的
在设计ita函数时,我还在考虑响应式(StateFlow)、树同步( [1,x]=[2,y] 这种) 等情况,

无论是对事件变量,还是树形结构;无论是列表处理,还是单项与流控, as, to (invoke,赋值) 都有正确、一致的语意,其地位也直击要点。
let, also 做不到这些。难怪Kt把这个改进弄销声匿迹了

只拿它区分茴字两种写法实在是暴殄天物(就像它没发现 x as Int 不如 .as<Int> 易写)。with,by 这些助词就是天选之子,偏偏kt把它加在奇怪的位置,用一种老式OOP的方法(当然也比jspy好了

Koshin, [2023/10/17 08:03]
歪个楼,每每关于现有kt语言的观点,(作为日常写业务的菜鸡)有点看不懂,感觉每次吐槽完,也没什么然后。请问,下一步是打算做点什么来弥补所看到的缺陷(比如贡献一些库)?还是说只是在学习这方面的内容真的只是在讨论

duangsuse, [2023/10/17 08:34]
真的只是说一句,反正不会有人听的,而且现在kt支持的 operator fun 也不够用

你觉得GPT味,是因为我说的比较细。 单用YAML的逻辑去理解上面的代码,是容易的

Kotlin 现在不好的,在改良的特性也很多,就比如那个 typed companion(namespace) 和 private Mutable(私用 field:)
我现在在设计一种CLI序列化器
fun main(a:Argv)=a.Dict<Hello>()
class Hello /*:CliktCommand */ (
var name:Str,
var source: Ln<FStr>,
var out: File,
var r:Fire,
var count:Int=1,
var v:Boolean=false,
):CLI("""
c Number of greetings
id The person to greet?Your name?
v enable verbose mode(or .env)??
""", "name id") {
fun main() {
(1..count).forEach{ r+"Hello $name" }
out.Eq("") {it+source.joinToString()} //append
}
}

duangsuse, [2023/10/17 08:36]
如果 filter,map 你看不懂,说明你没写过html模板,或者没尝试“理解”SQL

firsts(takeWhile) 和 users:[x^]return 没懂是可理解的,毕竟和 startsWith 混一起了,而且你们也不会用 forEach{+return}

duangsuse, [2023/10/17 10:25]
>webp对BW纯黑白图片有特殊压缩吗?
WebP 使用了一些特殊的压缩技术,如预测编码和分段压缩等,这些技术可以在一定程度上提高压缩效率。但是,对于纯黑白图片,由于其像素值只有两种可能,因此 WebP 的压缩效果可能不如彩色图片明显。

duangsuse, [2023/10/17 10:26]
>Java 有没有标准 2D Mesh 实现
Java 提供了 java.awt.geom 包来支持 2D 图形操作,其中包括了一些基本的形状类,如 Rectangle2DEllipse2DLine2D 等,以及一些变换类,如 AffineTransform。但是,Java 并没有提供标准的 2D Mesh 实现。

不过,你可以使用第三方库来实现 2D Mesh,比如 tridentjzy3djogl 等。这些库提供了丰富的 2D 和 3D 图形渲染功能,包括 Mesh 渲染。你可以根据自己的需求选择合适的库来使用。

duangsuse, [2023/10/17 10:28]
你这个图形在SVG里叫path=""

二维bool数组有点奇怪,bitmap更奇怪,因为你遍历时是要解压的

拿编程的API去理解物理世界的计算,是我没想到的。 GL,SVG都有对应的技术,可以文GPT

duangsuse, [2023/10/17 10:34]
你先编号,不就没这个问题了??
y*w+x

duangsuse, [2023/10/17 10:35]
既然你想「不可预估的」扩展性,Set+dataclass 好了

duangsuse, [2023/10/17 10:35]
感觉你在做比 Terraria 更复杂的游戏

duangsuse, [2023/10/17 10:36]
如果没有Unity之类物理引擎的使用经验,最好不要

斜着可不止麻烦一点点

duangsuse, [2023/10/17 10:39]
实在不行可以
>用KD-Tree 做坐标集合,但是要连续

import numpy as np
from scipy.spatial import KDTree

# 坐标集合1
coords1 = np.array([[1, 2], [3, 4], [5, 6]])

# 坐标集合2
coords2 = np.array([[7, 8], [9, 10]])

# 连接坐标集合
coords = np.concatenate((coords1, coords2), axis=0)

# 构建 KD 树
tree = KDTree(coords)

duangsuse, [2023/10/17 10:43]
那你这不是典型的 bitmap(canvas) composite 问题吗?

>有两个黑白 A,B: PIL.Image ,C=二者And逻辑门的结果
请使用 composite Mode ,不用循环

from PIL import Image, ImageChops, ImageOps

# 对图像A进行反转操作
img_e = ImageOps.invert(img_a)

# 对图像A和B进行逻辑与操作
img_d = ImageChops.logical_and(img_a, img_b)

# 将图像E和D进行合成
img_c = Image.alpha_composite(img_e, img_d)

duangsuse, [2023/10/17 10:43]
没用过像素图的人把bitset误读成bitmap
偏偏他们是大多数

duangsuse, [2023/10/17 10:45]
往大了说,bitset,map 都是vector,都是 ndarray,但前者是1D的

bits压缩不是没代价的。不要只是 CPU换内存开销