Forwarded from Deleted Account
可以使用Java 8的反射API以及Java 8的StreamAPI来完成这个任务。具体的步骤如下:
1. 获取Object的Class对象,即 object.getClass()。
2. 通过Class对象获取该类声明的所有字段,可以使用getDeclaredFields()方法。
3. 针对每个字段,判断该字段的值是否为null,可以使用Field对象的get方法来获取该字段的值,并用Objects.isNull()方法判断该值是否为null。
4. 对于值为null的字段,记录其字段名,将其存储到List或Set中。
下面是一个示例代码:
使用示例:
在这个例子中,Person类中的gender字段值为null,在调用getNullFields方法后,它的字段名"gender"被存储在了Set中并返回。
1. 获取Object的Class对象,即 object.getClass()。
2. 通过Class对象获取该类声明的所有字段,可以使用getDeclaredFields()方法。
3. 针对每个字段,判断该字段的值是否为null,可以使用Field对象的get方法来获取该字段的值,并用Objects.isNull()方法判断该值是否为null。
4. 对于值为null的字段,记录其字段名,将其存储到List或Set中。
下面是一个示例代码:
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
public class ObjectNullFieldFilter {
public static Set<String> getNullFields(Object object) throws IllegalAccessException {
Set<String> nullFields = new HashSet<>();
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true); // 使得private字段也可访问
Object fieldValue = field.get(object);
if (Objects.isNull(fieldValue)) {
nullFields.add(field.getName());
}
}
return nullFields;
}
}
使用示例:
class Person {
private String name;
private Integer age;
private String gender;
// 省略 getter/setter 方法
}
public class Main {
public static void main(String[] args) throws IllegalAccessException {
Person p = new Person();
p.setName("Tom");
p.setAge(18);
Set<String> nullFields = ObjectNullFieldFilter.getNullFields(p);
System.out.println(nullFields); // 输出 [gender]
}
}
在这个例子中,Person类中的gender字段值为null,在调用getNullFields方法后,它的字段名"gender"被存储在了Set中并返回。
Forwarded from Deleted Account
您可以使用Java 8反射API获取具有Null值的非静态和非合成字段名称的列表。以下是一个示例方法:
在这个例子中,我们定义了一个MyClass类,并创建了一个示例对象myObj。然后,我们使用Java反射来获取该类的所有字段,并逐个检查它们是否是非静态和非合成字段。对于每个符合条件的字段,我们检查它是否为null,并将其名称添加到nullFields列表中。最后,我们在控制台上打印出该列表。
请注意,由于反射的性质,这种方法可能会受到Java安全管理器的限制,因此您可能需要相应的权限。
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyClass {
private String name;
private String[] tags;
private Integer age;
private static String profession;
public static void main(String[] args) throws Exception {
MyClass myObj = new MyClass();
myObj.name = "John";
myObj.tags = null;
myObj.age = null;
List<String> nullFields = getNullFields(myObj);
System.out.println("Null fields: " + nullFields);
}
public static List<String> getNullFields(Object object) throws IllegalAccessException {
List<String> nullFields = new ArrayList<>();
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
if (!field.isSynthetic() && !java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
field.setAccessible(true);
if (field.get(object) == null) {
nullFields.add(field.getName());
}
}
}
return nullFields;
}
}
在这个例子中,我们定义了一个MyClass类,并创建了一个示例对象myObj。然后,我们使用Java反射来获取该类的所有字段,并逐个检查它们是否是非静态和非合成字段。对于每个符合条件的字段,我们检查它是否为null,并将其名称添加到nullFields列表中。最后,我们在控制台上打印出该列表。
请注意,由于反射的性质,这种方法可能会受到Java安全管理器的限制,因此您可能需要相应的权限。
Forwarded from dnaugsuz
哈哈😄,其实外国人每个也都像是思想家, 所以他们的著作才那么爆棚。
海面下的冰山有70%的重量 ,但你国却只强调「我要有10%的高级精英」;教出的人没有概率逻辑和普世价值,个个以为只有自己是比下有余的天选之人、只有排名公式计算的才叫人的才能 ,而忽略了持续性所必须的协作环境和人文土壤
中国总强调自己是集体主义,但每个人却是单纯服从一个并不代表自身或群体利益的图标。 对文化课和八股文的内卷式崇拜、创造力的缺失,也正是这种封建社会观的历史结果。
解释朝鲜笑容为何千人一律的不是智商种族优劣论,而是它的思想。春潮退去,才知道裸泳的到底是谁。
海面下的冰山有70%的重量 ,但你国却只强调「我要有10%的高级精英」;教出的人没有概率逻辑和普世价值,个个以为只有自己是比下有余的天选之人、只有排名公式计算的才叫人的才能 ,而忽略了持续性所必须的协作环境和人文土壤
中国总强调自己是集体主义,但每个人却是单纯服从一个并不代表自身或群体利益的图标。 对文化课和八股文的内卷式崇拜、创造力的缺失,也正是这种封建社会观的历史结果。
解释朝鲜笑容为何千人一律的不是智商种族优劣论,而是它的思想。春潮退去,才知道裸泳的到底是谁。
#hard #os
Jack Yang:
意思是现代计算机虽然是按字节编址,但是实际上存储单元大小是字节整数倍。所以多个地址可能指代的是一个存储单元吗
duangsuse:
寻址可以细到byte ,但计算只能是对齐 int32,64 这种的
你所说的内存复用其实就是 union{i32; i64} *num; ,这个在java里不存在的,都是虚表
moushose:
为什么指针会有符号?
duangsuse:
方便指针相减呗,也有usize指针吧
寻址只是算术的方法啦……
比如 iadd int ptr[rsp+8], rsp.., 233
这里有(栈指针)间接寻址 和常量,输出到其中1个输入
mov dst,src 也是这样
我们说的是OS和asm领域的“存储”
对的,理论上需要mov(lea) 这个int* 到int
再继续add 1, 啥的. add靠的是局部寄存器如rax rdi rsi
taisandog xp:
但esp、rsp比较特殊,是栈空间,我们在方法里定义的变量就是放这里,例如64位程序,XX obj=new XX();在堆空间产生一个XX的数据块,然后在栈空间产生一个8字节的指针obj,rsp会实现压栈:rsp=rsp-8,到函数退出时候会恢复现场
寄存器跟内存和硬盘无关,寄存器是做在CPU里的,CPU里除了这些通用寄存器还有指令集寄存器,例如SSE寄存器xmm0那批
刚才你拿rsp举例有点麻烦,要解释清楚😏,rsp之类的不能乱搞,搞乱了会爆炸
duangsuse:
函数传参和局部变量一般都用这些.. 不过x64 abi 一般是寄存器传参😅
jvm也是基于求值栈,但它不支持指针 ,也没有寄存器分配问题
其实有些人会把x86的rsp当做栈机用,实现JIT
x86主要是有 abcd ax eax rax这几个通用
si di sp bp ip(指令指针) 这几个指针寄存器, 被ret,rep等特殊指令使用
还有cs ds 这些段寻址指针
taisandog xp:
ecx其实也不算普通寄存器,只是高级语言也不用它来做循环
一般普通的64位寄存器的x86是rax、rbx、rcx(其实不普通,不过很少用来做循环)、rdx
你说的ax eax rax其实是同一个,rax包含eax、eax包含ax
duangsuse:
以前16bit的程序经常用ah,al ,那个就是int到byte 转化, i &0xFF
Jack Yang:
意思是现代计算机虽然是按字节编址,但是实际上存储单元大小是字节整数倍。所以多个地址可能指代的是一个存储单元吗
duangsuse:
寻址可以细到byte ,但计算只能是对齐 int32,64 这种的
你所说的内存复用其实就是 union{i32; i64} *num; ,这个在java里不存在的,都是虚表
moushose:
为什么指针会有符号?
duangsuse:
方便指针相减呗,也有usize指针吧
寻址只是算术的方法啦……
比如 iadd int ptr[rsp+8], rsp.., 233
这里有(栈指针)间接寻址 和常量,输出到其中1个输入
mov dst,src 也是这样
我们说的是OS和asm领域的“存储”
对的,理论上需要mov(lea) 这个int* 到int
再继续add 1, 啥的. add靠的是局部寄存器如rax rdi rsi
taisandog xp:
但esp、rsp比较特殊,是栈空间,我们在方法里定义的变量就是放这里,例如64位程序,XX obj=new XX();在堆空间产生一个XX的数据块,然后在栈空间产生一个8字节的指针obj,rsp会实现压栈:rsp=rsp-8,到函数退出时候会恢复现场
寄存器跟内存和硬盘无关,寄存器是做在CPU里的,CPU里除了这些通用寄存器还有指令集寄存器,例如SSE寄存器xmm0那批
刚才你拿rsp举例有点麻烦,要解释清楚😏,rsp之类的不能乱搞,搞乱了会爆炸
duangsuse:
函数传参和局部变量一般都用这些.. 不过x64 abi 一般是寄存器传参😅
jvm也是基于求值栈,但它不支持指针 ,也没有寄存器分配问题
其实有些人会把x86的rsp当做栈机用,实现JIT
x86主要是有 abcd ax eax rax这几个通用
si di sp bp ip(指令指针) 这几个指针寄存器, 被ret,rep等特殊指令使用
还有cs ds 这些段寻址指针
taisandog xp:
ecx其实也不算普通寄存器,只是高级语言也不用它来做循环
一般普通的64位寄存器的x86是rax、rbx、rcx(其实不普通,不过很少用来做循环)、rdx
你说的ax eax rax其实是同一个,rax包含eax、eax包含ax
duangsuse:
以前16bit的程序经常用ah,al ,那个就是int到byte 转化, i &0xFF
duangsues.is_a? SaltedFish
rey ren: 就是上层跟下层都混在一起说,把下层出现的现象造出了一个词😂 duangsuse: 同意,自己不清楚IOstream 去限制请求长度 也亏你是台湾人, 中国流行八股文的😅唬住领导就行 /对的,IO密集无需优化list.add啥的。就是这个道理 rey ren: 因为就没理解彻底,实际是怎么在流式数据实现应用层协议 duangsuse: 直接Protobuf或者JSON单行😅 py open().buffer里哪有靠read(size) 写读内存片啊,都是用pickle duangsuse:…
duangsuse, [2023/4/17 17:00]
说到底还是我有错在先,没有表达清楚自己对 Kotlin
而是去说 DCL 不对。但其实我是想说 设计模式对程序员真的有害无利 ..
zz Abel, [2023/4/17 17:01]
AI不就是个工具吗,工具的进步肯定比人快的,没啥奇怪的。也不要有优越性,都会被ai替代的
duangsuse, [2023/4/17 17:02]
许多设计模式在动态语言里不存在
Singleton,Builder 即便在 Kotlin 里也是不存在的,模式往往是解决编译期没有提供的便利性。它是语法的问题
我觉得死记硬背是有问题的,这些模式本该由编程语言解决,会更简单
CheeryMilk, [2023/4/17 17:04]
过于照搬设计的模式而不注重原则是有害的
duangsuse, [2023/4/17 17:06]
倒不如说java的原则,python 里就是错误…… 所以我真是一个设计模式黑 😅
taisandog xp, [2023/4/17 17:06]
设计模式不是语言通用的吗?C#也是这样用的
duangsuse, [2023/4/17 17:08]
Python里有 classmethod ,就是可以继承的 def
但是 java 里没,那相关的设计模式, py 可能就比java少1种
@decorator 也算是一种,java 里
duangsuse, [2023/4/17 17:11]
所以我是很主张「代码复用」,而设计模式,显然就是让人做编译期的“代码复制”类工作
所以我不待见它,以至于被人喷成我不会设计模式 😭 ,我只是说,要注重模式的封装性
iseki |看到我请叫我去学习~, [2023/4/17 17:12]
你这样,无非是自己再发明一套术语而已
iseki |看到我请叫我去学习~, [2023/4/17 17:12]
不过这倒是无所谓,其实这种事开心就好
duangsuse, [2023/4/17 17:12]
差不多是如此
DCL算是代码复用吗? 还有 class StaticHolder ,这就是模板代码啊😒
向上面这种,如果重写为python或rust 能更短一些,那就不算设计模式,而是语言的设计缺陷
我还搞错一点, lazy和DCL, static 初始化根本不是一个东西
DCL和static都可以实现singleton,但只有lock能让lazyInit()只调用1次且晚计算,所以kt的by lazy{} 默认是这样,都是RAII ,但这些区别..真的很无聊
说到底还是我有错在先,没有表达清楚自己对 Kotlin
lazy(mode=NONE){} 默认参数的建议而是去说 DCL 不对。但其实我是想说 设计模式对程序员真的有害无利 ..
zz Abel, [2023/4/17 17:01]
AI不就是个工具吗,工具的进步肯定比人快的,没啥奇怪的。也不要有优越性,都会被ai替代的
duangsuse, [2023/4/17 17:02]
许多设计模式在动态语言里不存在
Singleton,Builder 即便在 Kotlin 里也是不存在的,模式往往是解决编译期没有提供的便利性。它是语法的问题
我觉得死记硬背是有问题的,这些模式本该由编程语言解决,会更简单
CheeryMilk, [2023/4/17 17:04]
过于照搬设计的模式而不注重原则是有害的
duangsuse, [2023/4/17 17:06]
倒不如说java的原则,python 里就是错误…… 所以我真是一个设计模式黑 😅
taisandog xp, [2023/4/17 17:06]
设计模式不是语言通用的吗?C#也是这样用的
duangsuse, [2023/4/17 17:08]
Python里有 classmethod ,就是可以继承的 def
但是 java 里没,那相关的设计模式, py 可能就比java少1种
@decorator 也算是一种,java 里
@Override 是不能实现业务逻辑修饰的,py 里这些技巧有点像 Lombok 的字节码技术duangsuse, [2023/4/17 17:11]
所以我是很主张「代码复用」,而设计模式,显然就是让人做编译期的“代码复制”类工作
所以我不待见它,以至于被人喷成我不会设计模式 😭 ,我只是说,要注重模式的封装性
iseki |看到我请叫我去学习~, [2023/4/17 17:12]
你这样,无非是自己再发明一套术语而已
iseki |看到我请叫我去学习~, [2023/4/17 17:12]
不过这倒是无所谓,其实这种事开心就好
duangsuse, [2023/4/17 17:12]
差不多是如此
DCL算是代码复用吗? 还有 class StaticHolder ,这就是模板代码啊😒
向上面这种,如果重写为python或rust 能更短一些,那就不算设计模式,而是语言的设计缺陷
我还搞错一点, lazy和DCL, static 初始化根本不是一个东西
DCL和static都可以实现singleton,但只有lock能让lazyInit()只调用1次且晚计算,所以kt的by lazy{} 默认是这样,都是RAII ,但这些区别..真的很无聊
duangsuse, [2023/4/19 14:32]
其实最初美国高校担心GPT影响教学质量也是差不多的心态
只是在中国的内卷意识和 #PL 领域的“小众优越”下,这种东西被极端化了
duangsuse, [2023/4/19 14:33]
只是,MD, 我昨天晚上还在改我语言文法的稿 😅
duangsuse, [2023/4/19 14:34]
主要问题是PL领域基本没有什么新势力,都是一群人在解读和圣战
duangsuse, [2023/4/19 14:37]
是跨文化跨编译语言的,有点像 kt 的python化,然后它没有 for 语句、反对流控、同时支持组合与继承,是很表达式化的
应该是基于GCC那样的统一AST ,做高级低级化 Pass ,实现所支持的语言互转化
duangsuse, [2023/4/19 14:42]
并不是,我们还需要维护生态和规范化语言工具呢
因为AI和创作者的协作还是会有问题的,总不可能因为人类插足的少,就用垃圾语言去交互
duangsuse, [2023/4/19 14:45]
我自己觉得编程语言就是API的普适化, 有了这个模型使用和思考起来更加方便, 并且其意图是绝对清晰的,能满足设计者的个性
但是用非程序员的语言, 就会缺少一些思考建模的方式和技巧,所以说形式化和自然语言是可以并驾齐驱的
然后GPT4的写作能力、创造性目前看来也不太好, 不知道以后会不会改良,但在那之前程序员负责的页面应该需要不少对话,所以PL这种东西和os一样,始终是有研究价值的;以后也会和拉丁文一样具有艺术和文化价值
至于觉得PL更优越的人,肯定会越来越少,以后就单纯和“web框架”一样,是种自由选择的文化符号了
duangsuse, [2023/4/19 15:26]
😅操 ,其实这个是要悟性的(bing 不懂) ,不过希望以后绝句的API都能让菜鸟读懂..
总之就是不会比 Kotlin 垃圾吧(大概
kt 里
其实最初美国高校担心GPT影响教学质量也是差不多的心态
只是在中国的内卷意识和 #PL 领域的“小众优越”下,这种东西被极端化了
duangsuse, [2023/4/19 14:33]
只是,MD, 我昨天晚上还在改我语言文法的稿 😅
duangsuse, [2023/4/19 14:34]
主要问题是PL领域基本没有什么新势力,都是一群人在解读和圣战
duangsuse, [2023/4/19 14:37]
是跨文化跨编译语言的,有点像 kt 的python化,然后它没有 for 语句、反对流控、同时支持组合与继承,是很表达式化的
应该是基于GCC那样的统一AST ,做高级低级化 Pass ,实现所支持的语言互转化
duangsuse, [2023/4/19 14:42]
并不是,我们还需要维护生态和规范化语言工具呢
因为AI和创作者的协作还是会有问题的,总不可能因为人类插足的少,就用垃圾语言去交互
duangsuse, [2023/4/19 14:45]
我自己觉得编程语言就是API的普适化, 有了这个模型使用和思考起来更加方便, 并且其意图是绝对清晰的,能满足设计者的个性
但是用非程序员的语言, 就会缺少一些思考建模的方式和技巧,所以说形式化和自然语言是可以并驾齐驱的
然后GPT4的写作能力、创造性目前看来也不太好, 不知道以后会不会改良,但在那之前程序员负责的页面应该需要不少对话,所以PL这种东西和os一样,始终是有研究价值的;以后也会和拉丁文一样具有艺术和文化价值
至于觉得PL更优越的人,肯定会越来越少,以后就单纯和“web框架”一样,是种自由选择的文化符号了
duangsuse, [2023/4/19 15:26]
😅操 ,其实这个是要悟性的(bing 不懂) ,不过希望以后绝句的API都能让菜鸟读懂..
总之就是不会比 Kotlin 垃圾吧(大概
kt 里
itLets itLet lets let 这些是 let also run apply ,我都记不住File() let {path="abc"} 比apply好看很多ByteArray 对应byte[] ,Array<Byte> 则是装箱类型 Byte[]
Anonymous Poll
42%
好,不容易搞混
25%
坏,换来换去很麻烦
33%
坏,装箱没有意义 (即便Spring等不支持int[]式数组)
await f 的作用是休眠当前函数,把回调交给f,编译器或虚拟机 其实能隐藏这个概念
Anonymous Poll
25%
对,await只是自动传回调的一种调用,只需要async 标记函数需要回调(而不是卡在调用栈上)
13%
对,甚至在运行时由yield类函数打包调用栈,以供next()时恢复也没错 /Lua,Ruby的做法
63%
错,await 提现了异步回调与栈调用 的不同
在Kotlin这样的语言里,for(x in pairs) 已经过时了
Anonymous Poll
25%
对,pairs.forEach { (a,b) ->} 更统一,比如和 map{}, fun bar()=
75%
错,语句化更自然,比如 for(x in 0..9)
不能单纯用Java的术语解释值类型,只要复制[在内容上]永远等于自身 ,其地址就是值
Anonymous Poll
71%
对,new String("") 就等于""
29%
错,值类型不造成GC压力,也无法直接添入List
0%
错, 1..getClass() 报错“无法解引用”而str.length不会
duangsues.is_a? SaltedFish
#编程语言 #Kotlin 做个关于语法和stdlib集合类型的小调查 点进来以查看「for(x in items) 是否过时」这种投票
#bing 对几个问题的回答:
接下来我要问关于Kotlin本身的问题,请对比python里的类似概念 提建议
如果List和Array有继承关系,来方便列表处理函数的定义,以谁为父类
List,它是一个抽象的数据类型,它只定义了一些通用的操作,比如添加、删除、遍历、查找等,而不关心具体的存储结构。Array是一种具体的数据类型
for(x in 0..9) 的语句化写法,是否过时于 pairs.forEach{(a,b)-> a} 的函数式写法,因为后者与 fun f()=a.map{} 等更一致
各有优缺点。😊语句化写法的优点是简洁、直观、易读,它可以清晰地表达循环的逻辑,也可以方便地使用break、continue等控制流语句。函数式写法的优点是灵活可组合
await f 是否可以视为自动传递回调的一种调用形式,因此只需要async 声明f以回调而非阻塞调用栈的形式,返回给调用方
await f,f必须是一个挂起函数,也就是用async声明的函数。async声明的函数会返回一个Deferred对象,一个特殊可await的Job。async声明的函数也不会阻塞当前线程,而是在协程作用域内启动一个新的协程来执行异步任务。
sequence{} 是否应和py,js一样返回单次遍历Iterator ,因为1次调用只创建了1个next()状态机
suspend lambda用来生成一个惰性的、无限的、基于协程的序列,而不是一次性生成所有元素。这样可以节省内存和计算资源,也可以实现一些复杂的逻辑。Sequence类型实现了Iterator接口,也就是说它有一个next()方法,可以返回序列中的下一个元素。但只能被遍历一次
ByteArray 和装箱类型 Array<Byte> 的区别是否没意义, 它和反射、泛型擦除有多大关系
通过反射访问或修改ByteArray和Array<Byte>的元素时,会发现它们需要传入或返回不同的值类型,分别是byte和java.lang.Byte。
接下来我要问关于Kotlin本身的问题,请对比python里的类似概念 提建议
如果List和Array有继承关系,来方便列表处理函数的定义,以谁为父类
List,它是一个抽象的数据类型,它只定义了一些通用的操作,比如添加、删除、遍历、查找等,而不关心具体的存储结构。Array是一种具体的数据类型
for(x in 0..9) 的语句化写法,是否过时于 pairs.forEach{(a,b)-> a} 的函数式写法,因为后者与 fun f()=a.map{} 等更一致
各有优缺点。😊语句化写法的优点是简洁、直观、易读,它可以清晰地表达循环的逻辑,也可以方便地使用break、continue等控制流语句。函数式写法的优点是灵活可组合
await f 是否可以视为自动传递回调的一种调用形式,因此只需要async 声明f以回调而非阻塞调用栈的形式,返回给调用方
await f,f必须是一个挂起函数,也就是用async声明的函数。async声明的函数会返回一个Deferred对象,一个特殊可await的Job。async声明的函数也不会阻塞当前线程,而是在协程作用域内启动一个新的协程来执行异步任务。
sequence{} 是否应和py,js一样返回单次遍历Iterator ,因为1次调用只创建了1个next()状态机
suspend lambda用来生成一个惰性的、无限的、基于协程的序列,而不是一次性生成所有元素。这样可以节省内存和计算资源,也可以实现一些复杂的逻辑。Sequence类型实现了Iterator接口,也就是说它有一个next()方法,可以返回序列中的下一个元素。但只能被遍历一次
ByteArray 和装箱类型 Array<Byte> 的区别是否没意义, 它和反射、泛型擦除有多大关系
通过反射访问或修改ByteArray和Array<Byte>的元素时,会发现它们需要传入或返回不同的值类型,分别是byte和java.lang.Byte。
#fp #statement SooXT 🫧:
为什么我看不懂 🤔
https://en.wikipedia.org/wiki/Monad_(functional_programming)
duangsuse:
右声明左定义
感觉像对x和[x] 都能处理然后flat()的.. 和Vec分量同算有点不一样
FP的 #parserc 在js里好写多了([],{}, /regex/ 值) ,但是FP界的人就只会在那 data instance Monad 的实现约束,却不懂得用更直接的语言表达意图 ,导致FP的技术套用到OOP后要么是浮云, 要么失去了FP逼格,唯独没有实用又专业的
其实写那么多多态,也只是把代码搞得七零八落, 还不如一开始就归类好要用到哪些情况
我其实也是喜欢重命名东西的人 , 但是我讨厌一种API 去给它重构,别人觉得没必要
FP领域重命名老技术,却变成了它特有的技巧🤔
其实组合子也是可以基于lexer流的 ,问题是到底需不需要。 PEG 是parserc的文本形式,它有跳空格问题, 但显然加个字符过滤流,就能同时解决高亮和注释😅
我在设计一门多范式语言,重命名了许多 thing(class), fun(method)的API
如果是我的话, 会把这类理论 变成与 value / (T)->R 的差异与共同点,而不是另成术语体系 ,因为这会造成术语和写法的冗余
不过说起来hs的parserc 因为不能“吃掉”或跳过剩余字符 ,只能把它拆成左右两部分 ,所以造成GC压力这点也挺可爱的😒
backtracing(peek右侧), 反而不占多少开销吧
纯函数还真是自己有一套 独有的问题和解决方案
所以说一开始就设计好,真的是很困难。 但作为“理论界” 术语解读那么多,也是CS独有吧..?
rami3l:
你有没有看link,这段话说的就是Haskell在设计之初就不希望做成well done
duangsuse:
但是这并不科学哎,难道绝对真理是不存在的
一开始就应该向完美去设计
编程语言和软件工程是扩展性的艺术
总的来说, 我肯定不适合和FP粉丝讨论,因为实现的目标就不一样🙊
我只是觉得FP粉丝,明明可以把自己的功底用到工业界,却偏偏要留在那一套含糊其辞、糅杂如Java的语言, 很浪费才华。
这就是我们的根本区别:
如果英文阅读速度不如母语 ,我会想办法用pdf2docx+deepl.com , 而不少人会订阅学英语的频道
这两者各有好处,但观念确实不同
同样是fp,kt和scala的理解不一样 ,这种差异才是我的研究, 我不管fp本身。
Pop:
所以我們的區別就是我看到不會的東西會去學你會走近路?
duangsuse:
差不多,因为计算机就是为懒得自己算的人服务的☺️
如果没有这种懒惰,翻译技术也不会进步,还没诞生时的GPT也失去了一个重要的支援领域
Misuno Akihisa, [2023/5/9 21:10]
Rust 完整替換一個字串是不是只能
duangsuse
这个
原来rstd::String 是 mut 的,一直以为没有可变字符串呢
感觉C++开了一个坏头,导致 GLSL 和 Rust 里 Vec 完全是相反的涵义。 vec2本质是int 这种,而 vector 甚至可以 push 😒
为什么我看不懂 🤔
https://en.wikipedia.org/wiki/Monad_(functional_programming)
duangsuse:
右声明左定义
感觉像对x和[x] 都能处理然后flat()的.. 和Vec分量同算有点不一样
FP的 #parserc 在js里好写多了([],{}, /regex/ 值) ,但是FP界的人就只会在那 data instance Monad 的实现约束,却不懂得用更直接的语言表达意图 ,导致FP的技术套用到OOP后要么是浮云, 要么失去了FP逼格,唯独没有实用又专业的
其实写那么多多态,也只是把代码搞得七零八落, 还不如一开始就归类好要用到哪些情况
我其实也是喜欢重命名东西的人 , 但是我讨厌一种API 去给它重构,别人觉得没必要
FP领域重命名老技术,却变成了它特有的技巧🤔
其实组合子也是可以基于lexer流的 ,问题是到底需不需要。 PEG 是parserc的文本形式,它有跳空格问题, 但显然加个字符过滤流,就能同时解决高亮和注释😅
我在设计一门多范式语言,重命名了许多 thing(class), fun(method)的API
如果是我的话, 会把这类理论 变成与 value / (T)->R 的差异与共同点,而不是另成术语体系 ,因为这会造成术语和写法的冗余
不过说起来hs的parserc 因为不能“吃掉”或跳过剩余字符 ,只能把它拆成左右两部分 ,所以造成GC压力这点也挺可爱的😒
backtracing(peek右侧), 反而不占多少开销吧
纯函数还真是自己有一套 独有的问题和解决方案
所以说一开始就设计好,真的是很困难。 但作为“理论界” 术语解读那么多,也是CS独有吧..?
rami3l:
你有没有看link,这段话说的就是Haskell在设计之初就不希望做成well done
duangsuse:
但是这并不科学哎,难道绝对真理是不存在的
一开始就应该向完美去设计
编程语言和软件工程是扩展性的艺术
总的来说, 我肯定不适合和FP粉丝讨论,因为实现的目标就不一样🙊
我只是觉得FP粉丝,明明可以把自己的功底用到工业界,却偏偏要留在那一套含糊其辞、糅杂如Java的语言, 很浪费才华。
这就是我们的根本区别:
如果英文阅读速度不如母语 ,我会想办法用pdf2docx+deepl.com , 而不少人会订阅学英语的频道
这两者各有好处,但观念确实不同
同样是fp,kt和scala的理解不一样 ,这种差异才是我的研究, 我不管fp本身。
Pop:
所以我們的區別就是我看到不會的東西會去學你會走近路?
duangsuse:
差不多,因为计算机就是为懒得自己算的人服务的☺️
如果没有这种懒惰,翻译技术也不会进步,还没诞生时的GPT也失去了一个重要的支援领域
Misuno Akihisa, [2023/5/9 21:10]
Rust 完整替換一個字串是不是只能
s.replace_range(..s.len(), "new string value");
或者s.clear();?
s.push_str("new string value");
duangsuse
这个
(..s.len) 好像 py 的 a[:-1] 的说 (都喜欢省略0的吗 原来rstd::String 是 mut 的,一直以为没有可变字符串呢
感觉C++开了一个坏头,导致 GLSL 和 Rust 里 Vec 完全是相反的涵义。 vec2本质是int 这种,而 vector 甚至可以 push 😒
感觉C++开了一个坏头,导致 GLSL 和 Rust 里 Vec 完全是相反的涵义。 vec2本质是int 这种,而 vector 甚至可以 push 😒
rami3l:
list默认是linked list啊
vector是dynamic array
内存布局完全不一样的
duangsuse:
这种C式理解让我想到了冯诺曼的“不能用汇编器,浪费CPU cycle”
我最开始说的就是C++和现代语言的术语分歧倾向
这点上kt就隐藏了java集合的具体实现
而java 的 Vec 其实是 parallel.MutableList ...还是C#最有水平
Rust 使用i8 i32取代 char int 确实很好,但仍继承了这些设计错误
vec的重名让我摸不着头脑 ,据我所知,编译原理和信号处理 应该是没交集的(taichi是py的SP友主动去学优化编译), 为何cpp java 这些自以为会用vec2呢😒,它们无论标准库还是基元类型 都未有向量计算的API
如同“文化挪用”,cpp设计者还根本无视了vecN 的特质.. list和vec竟意义相同
如果说cpp的template 还算适合高性能的跨类型复用,java泛型就是屎山 ,已经导致int和装箱Object 间的割裂越来越明显 ,java写的物理算式也不可能通用到向量数值上,这讽刺了vec的“xy轴算式相同”特质。东施效颦
rami3l:
list默认是linked list啊
vector是dynamic array
内存布局完全不一样的
duangsuse:
这种C式理解让我想到了冯诺曼的“不能用汇编器,浪费CPU cycle”
我最开始说的就是C++和现代语言的术语分歧倾向
这点上kt就隐藏了java集合的具体实现
而java 的 Vec 其实是 parallel.MutableList ...还是C#最有水平
Rust 使用i8 i32取代 char int 确实很好,但仍继承了这些设计错误
vec的重名让我摸不着头脑 ,据我所知,编译原理和信号处理 应该是没交集的(taichi是py的SP友主动去学优化编译), 为何cpp java 这些自以为会用vec2呢😒,它们无论标准库还是基元类型 都未有向量计算的API
如同“文化挪用”,cpp设计者还根本无视了vecN 的特质.. list和vec竟意义相同
如果说cpp的template 还算适合高性能的跨类型复用,java泛型就是屎山 ,已经导致int和装箱Object 间的割裂越来越明显 ,java写的物理算式也不可能通用到向量数值上,这讽刺了vec的“xy轴算式相同”特质。东施效颦
duangsuse:
如果这些语言,有好好玩过 2D graphics ,就不会让人们对GPT写的弹球游戏崇拜得不得了了😅
汇编时代,在GBA都能编出超级玛丽 ,Vec明明可以让游戏开发更普世,然而更高级的cpp却把这样有用的术语送给无聊的列表处理..
编译器最本职的代码复制都没做好
Pop:
编译器本职啥时候变成复制了
duangsuse:
x86 CFI, C的栈帧传参规范、数值类型的统一、lambda,不含代码复制吗
各种lib的动态链接,不算吗
对人类最有价值的重载、无虚表子类型、0开销抽象, 这些入门者也会用的功能 ,当然是本职啊
那 if,while 这些基础结构 ,排除变量解析,不都是按模板生成代码的吗
你总不能说编译器的本职是codegen吧…… 那还不如js界认为编译=parse 一样
Pop:
你都说了按模板生成代码 那着就不是简单的复制代码
poly000:
https://www.reddit.com/r/rust/comments/awiisl/why_are_dynamic_arrays_called_vec_in_the_standard/
DynamicArray or ResizableArray is an option but it is somewhat long compared to just Vec
duangsuse:
哎,又是 one-liner 惹的祸😅
(一行狂魔)
大不了和java一样,到处public 得了,命名太长无所谓
如果这些语言,有好好玩过 2D graphics ,就不会让人们对GPT写的弹球游戏崇拜得不得了了😅
汇编时代,在GBA都能编出超级玛丽 ,Vec明明可以让游戏开发更普世,然而更高级的cpp却把这样有用的术语送给无聊的列表处理..
编译器最本职的代码复制都没做好
Pop:
编译器本职啥时候变成复制了
duangsuse:
x86 CFI, C的栈帧传参规范、数值类型的统一、lambda,不含代码复制吗
各种lib的动态链接,不算吗
对人类最有价值的重载、无虚表子类型、0开销抽象, 这些入门者也会用的功能 ,当然是本职啊
那 if,while 这些基础结构 ,排除变量解析,不都是按模板生成代码的吗
你总不能说编译器的本职是codegen吧…… 那还不如js界认为编译=parse 一样
Pop:
你都说了按模板生成代码 那着就不是简单的复制代码
poly000:
https://www.reddit.com/r/rust/comments/awiisl/why_are_dynamic_arrays_called_vec_in_the_standard/
DynamicArray or ResizableArray is an option but it is somewhat long compared to just Vec
duangsuse:
哎,又是 one-liner 惹的祸😅
(一行狂魔)
大不了和java一样,到处public 得了,命名太长无所谓
Reddit
r/rust on Reddit: Why are dynamic arrays called Vec in the standard library as opposed to mathematical vectors?
Posted by u/SirTates - 14 votes and 55 comments