duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from Haruue | 春上ひつき
另外 C++ 的模板(泛型)实际上是像宏那样将模板参数直接代入, 在代入时是不检查类型参数是否合法的(就像鸭子类型), 是在展开之后才检查代码能不能编译通过, 这使得与模板相关的错误可以变得非常难以阅读 ( C++20 加入了 concept , 支持对模板参数施加约束, 缓解了这个问题)
而 Java 的泛型是在编译时辅助类型检查, 在运行时擦除+类型转换。
两者差异还是蛮大的。
Forwarded from Haruue | 春上ひつき
也只有 C++ 能做模板元编程, Java 没这种 feature 。。。
使用泛型的 Java 代码还是非常易懂并且容易维护的。。。
みつき そはら | 椒鹽九肚魚🐟 | 牛年大吉 | 🇨🌿 ☕️ 🤖 🐍:
void * 啥都做不了

duangsuse:
但是它的确是一个 size_t 长的数字

みつき そはら | 椒鹽九肚魚🐟 | 牛年大吉 | 🇨🌿 ☕️ 🤖 🐍:
void *ptr = ...
ptr+1 // error

因為指計類型只是 size 嘛
+1 相當於移動了 size 的長度
void * 沒有類型資訊

這是指計本身的大小 解引用/做加減就看背後的指向的位址啊
Forwarded from Luke
下面这段代码有问题么?有什么问题?为何会有这个问题?

List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);
Forwarded from dnaugsuz
List<?extends Object> 感觉比较没意思吧.. 其实就是 List get,set:Object 的裸类型
轻松一点: list.add((Object)123); int x=(Object)list.get(0); ,这样不方便。
严苛一点: ?extends 相当于 Kotlin 的 out ,是有子类型兼容性的(即 P<T1> extends P<T> )。如果 List<?extends Object> xs = new ArrayList<Integer>(); xs.add((Float)0.1f); 就完蛋了,假设 xs 是作为函参定义的话。
这里正确的做法是用 boxed 的 List<Integer> ,也不能是 List<?extends Number> ,除非你保证不会 .add 或 .set。

这种情况(破坏 type constraint) Javac 抖机灵不让你 add() null 外的值,从某种意义上它也是有 in/out 检查的,只是语法太烂。
之所以 List<T> T=Any 或 Int 仍能用是因为 ArrayList<T1>() 的 T1是自动推导的,不存在子类型兼容问题。

嘛,我觉得这个作为面试题有点过分了。作为普通程序员,用 Kotlin 就能解决所有问题(逃
Forwarded from dnaugsuz
其实类型参数擦除是仅对虚拟机和方法体而言的…… 对编译器类型检查它是透明的。
Forwarded from Luke
不知道那个pom下载的依赖
Forwarded from Luke
Forwarded from Luke
#android https://t.iss.one/AndroidDevCn/184247
contentUrl Hinnka Zhou, [23.02.21 15:37]
选取图片拿到的content uri不能保存起来下次继续用吗?

Rikka, [23.02.21 15:39]
不知道 有没有取得 永久授权

Hinnka Zhou, [23.02.21 15:41]
通过ACTION_GET_CONTENT拿的图片

Rikka, [23.02.21 15:42]
takePersistableUriPermission

Hinnka Zhou, [23.02.21 15:47]
真坑, 通过ACTION_GET_CONTENT拿到的uri不支持takePersistableUriPermission

Hinnka Zhou, [23.02.21 15:47]
只有ACTION_OPEN_DOCUMENT才行

Rikka, [23.02.21 15:48]
本来就不是可以存起来的

Hinnka Zhou, [23.02.21 15:50]
所以说, 我要用这图片必须在自己App内存一份?

Yuze Wu | 女子高中生 | 喵!, [23.02.21 15:50]
[In reply to Rikka]
那saf获取的文件夹访问权限可以?

Rikka, [23.02.21 15:50]
双方进程都没死 就应该有权限

Hinnka Zhou, [23.02.21 15:51]
选图片设壁纸, 进程杀掉图片没了😅

Rikka, [23.02.21 15:52]
这种场景拿到就存一份是很正常的 吧

Hinnka Zhou, [23.02.21 15:53]
也行吧, 就是我这场景支持多选, 可能会选一大堆
Forwarded from dnaugsuz
感觉这样写好看些:
val img = getBitmap(vmod.playlistState[index]) ?: return
if (oldImg==null) { drawBitmap(surface, img); return }
launch(mainScope) {
ValueAnimator.ofFloat(0f, 1f).with(1000L, DecelerateInterpolator()).start { drawBitmap(surface, oldImg, img, it) }
}
fun Animator.with(duration: Long, interp: Interpolator) = apply { this.duration = duration; interpolator = interp }
fun <A: Animator> A.start(op: (Double) -> Unit) { addUpdateListener { op(it.animatedFraction) }; start() }
Forwarded from dnaugsuz
🤔
的确 basic block 加 br 是好选择
就记得 while 和 if else 的翻译方式

builder 除了 sizeof 和指令选择 到底掩盖了什么细节呢
BB 是中端优化上的概念,对跳转回填什么的大概也没有帮助吧,和 std::list 差不多
Forwarded from dnaugsuz
记得 mips 和 arm 在子程序基础上都差不多,是有个 lr 和 sp... 看了一下是 jal/jr $ax 这样
https://github.com/Ray-Eldath/whatever/blob/master/mips/fib.a#L40

寄存器分配不会写(这个还包括溢出到栈,就是局部带限制和优先级的指令操作数存储空间的分配吧) 完全用栈的话就方便多了,等于 [a,b,c] = sp 一样的「数组解构」
Forwarded from dnaugsuz
这个本质就是如何把代码写简单,做到高复用并且突出程序与数据的照应性。 以这种心态就没有任何教条了,也不记得任何具体技术的名称;只有子程序的输入和数据之结构的变化才是唯一所见的事。
因为只在乎输入和输出之间所经历必须的过程和代码复用,只用最基础的算法和函数式,自然就没有稀奇古怪的实现方式和设计特性了。
Forwarded from dnaugsuz
嘛 我说的 codegen 大概是指同级语言,以减少冗余为目的的 cg,MDHD 说的是高级到低级的铺平、序列化 codegen …… 这就完全不一样了
减冗余的本质上是宏,不管理或没有上下文,只是一句话代表几句话,顶多查个全局表这样。
真的编译器 asm ,必须实现 if switch while break 基础控制流甚至 && 等惰性短路计算表达式 解析器还要支持错误列表化,挺麻烦的。

现在还是一想到就头疼,流解析组合子并不能直白便利地解决 keyword 和跳空格、计行号的问题,要在 Java/JS 里写字典树和 sourceLoc 真是最痛苦的(当然对类 C 语言读 map entries 都可以 但是比较不智能)

不过抛开控制流的翻译和层叠作用域的问题,本质上就和同级语言的翻译差不多了,四则计算指令、字面量、值引用、值输出一对应一铺平生成,并没有多少种情况,其实最小化的编程语言就个 func 个 apply ,实际编译器就是多带些 intrinsic 操作而已。