duangsues.is_a? SaltedFish
61 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from dnaugsuz
同意……
其实我原来也就是想发点不能编译的代码
Forwarded from dnaugsuz
我觉得 Kotlin 的 enum class 真是太好用了,如果你不想写专门的辅助类,它可以做到很奇特的效果

而且可以辅助你进行更远的设计
Forwarded from dnaugsuz
/tmp/a
我忘记 Telegram 发文件带名字了……
UNIX-like 平台上是不看文件后缀名的…… 普通文本编辑器都可以打开
Forwarded from dnaugsuz
还好括号是匹配的
Forwarded from dnaugsuz
我莫名觉得这个关系模型有点复杂啊…… 是因为没有图示的原因么 😭
Forwarded from dnaugsuz
下次会的,你们这次就不要太较真…… 毕竟,代码比用什么写代码重要,是吧?
Forwarded from dnaugsuz
我这里的代码,其实指的就是你说的『程序的灵魂』
Forwarded from dnaugsuz
我觉得还是蛮不错的啦…… 如果你写的缩进正确的话

比如 Kotlin 的 when (with value)

fun name(x: Any) = when (x) {
is Boolean -> "bool"
is Number -> "num"
is String -> "str"
is Array<*> -> "ary"
is List<*> -> "list"
is Map<*, *> -> "dict"
is Exception -> "error"
is KFunction0 -> "callable"
else -> "any"
}
总比没省略 is 左侧表达式的要好看吧

还有 where("user") 后面的一堆 point-free,其实只要缩进明白一点看起来是只会更优雅,不会更难看的


假设这里的 point-free 是
p :: (t -> Bool) -> (t, t, t) -> Bool
p f = \(a, b, c) -> (f a b) & (f a c)

p elem ("ABC", "A", "B") --True, "A" elem "ABC" & "B" elem "ABC"

或者

f a b = a + b -- f = (+)
f' a = \b -> let op=(a +) in op b
f1 = f 1 -- = f' 1 -- (因为有 currying 实际上是一样的…… 不像 Scala 有 partial application)
(f1 0, f1 1)

这类
只有目的不是很纯(比如为了进一步缩减代码文本的体积)才会让代码更难阅读

import Data.Char (digitToInt)
atoi base = foldl (\ac -> (ac*base +) . digitToInt) 0 -- str

这里我们 point-free 约掉了包括高阶函数 foldl 的第一个函数参数的参数在内的两个参数…… 啊好饶舌的说
Forwarded from dnaugsuz
对了原语是什么
那那个原来的意思是啥
Forwarded from dnaugsuz
还是 Haskell 好,notContains 就是 not . elem…… 否命题直接函数合成(跑
Forwarded from dnaugsuz
Kotlin 那个 self (function type with receiver)搞得一些泛化的函数类型上的操作符有点麻烦,有些的东西必须弄两个版本……

不过我想一般很少有人会用 T.() -> R 这种,比如写 subparser 组合库的时候,都是 (Parser.Stream) -> T 这种

第一种我想 Java 侧怕不是不方便……
Forwarded from dnaugsuz
差不多,不过我不是指用来定义为辅助的 also, let 什么的,是定义实际的业务逻辑还使用这种方法
Forwarded from dnaugsuz
以前我很过分地认为 Kotlin 不仅该弄 it,第二个参数也该默认 second……
甚至还觉得类型签名上应该可以填默认的隐式参数名字

后来我才注意到这个一致性的问题…… 在这方面我相信某些滥用元编程的库实在是最好的前车之鉴
因为它很容易被滥用,即便可能初衷只是让代码更好看
Forwarded from dnaugsuz
想起来了这好像是并发同步(『不纯』的并行程序)里面一个概念,就是互斥锁、信号量的什么操作还是对程序进程的操作叫什么阻塞原语啊…… 欸

是不是在 Kotlin 的 coroutine 看到的,coroutine 肯定要 yield (suspend) 和 resume 吧
Forwarded from dnaugsuz
Dalvik 不清楚,反正 HotSpot 什么的所有 GC 都是纯正的 tracing 算法,循环引用不会泄漏内存

JDK 的 WeakReference 是为了应付应用的特殊情况的,比如说 static 的(perm)拿来存 instance 级别的东西,就可以用 WeakReference
Forwarded from dnaugsuz
是第二版吗?我也看过 🤔
Forwarded from dnaugsuz
真阴性…… 我还以为这个裙讨论话题突然变『学术』了呢…… (跑
这里有啥意味呢?是指对象真的可回收?
Forwarded from dnaugsuz
别人说 Python 也是 Rc,然后有个专门的什么内存模块还可以解决循环引用的问题,PHP 上循环引用好像是等满了再扫描的(之前都是 refcount)
Forwarded from dnaugsuz
复制一般要求更大的堆…… 反正我也没写过 GC 就是了。

Ruby MRI 之前是用空闲链表,然后扫描算法比 Lua 简单一点(Lua 是三色实际上四色,Black/Gray/两种 White,White 是垃圾),还不是最开始 Lisp 的那一套,就是 BFS 啦。

后来我听说有什么半空间算法什么伊甸堆…… (弱代假说)

复制主要还是类似磁盘碎片整理一样整齐化内存使用(也可以很好的提升性能和缩减总体内存使用),缺点是比较慢(所以不能用来做终生代和永久代的收集,当然我不知道永久代是怎么回事,成熟代也可以用),实现要更新引用也复杂,据说一些 GC 实现用的是对象 Handle,二重查找,所以不必麻烦地更新每个引用?

如果不能理解内存里放的内容,就无法正常复制移动其中的对象了,就是说以前的 ExactVM,知道哪里是针对要移动对象的引用,可以更新句柄

GC 是很复杂的东西,至少说可调节的参数很多吧…… 何况现在还有什么 C4 什么 G1 的…… 我连 Serial, Parallel, CMS 都搞不懂

这时候我想想,我不就是个应用编程的吗?我想这么多干什么……