Forwarded from dnaugsuz
我觉得 Kotlin 的
而且可以辅助你进行更远的设计
enum class 真是太好用了,如果你不想写专门的辅助类,它可以做到很奇特的效果而且可以辅助你进行更远的设计
Forwarded from dnaugsuz
/tmp/a 我忘记 Telegram 发文件带名字了……
UNIX-like 平台上是不看文件后缀名的…… 普通文本编辑器都可以打开
Forwarded from dnaugsuz
我觉得还是蛮不错的啦…… 如果你写的缩进正确的话
比如 Kotlin 的
还有
—
假设这里的 point-free 是
只有目的不是很纯(比如为了进一步缩减代码文本的体积)才会让代码更难阅读
这里我们 point-free 约掉了包括高阶函数 foldl 的第一个函数参数的参数在内的两个参数…… 啊好饶舌的说
比如 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
还是 Haskell 好,
notContains 就是 not . elem…… 否命题直接函数合成(跑Forwarded from dnaugsuz
Kotlin 那个 self (function type with receiver)搞得一些泛化的函数类型上的操作符有点麻烦,有些的东西必须弄两个版本……
不过我想一般很少有人会用
第一种我想 Java 侧怕不是不方便……
不过我想一般很少有人会用
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 吧
是不是在 Kotlin 的 coroutine 看到的,coroutine 肯定要 yield (suspend) 和 resume 吧
Forwarded from dnaugsuz
Dalvik 不清楚,反正 HotSpot 什么的所有 GC 都是纯正的 tracing 算法,循环引用不会泄漏内存
JDK 的 WeakReference 是为了应付应用的特殊情况的,比如说
JDK 的 WeakReference 是为了应付应用的特殊情况的,比如说
static 的(perm)拿来存 instance 级别的东西,就可以用 WeakReferenceForwarded 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 都搞不懂
这时候我想想,我不就是个应用编程的吗?我想这么多干什么……
Ruby MRI 之前是用空闲链表,然后扫描算法比 Lua 简单一点(Lua 是三色实际上四色,Black/Gray/两种 White,White 是垃圾),还不是最开始 Lisp 的那一套,就是 BFS 啦。
后来我听说有什么半空间算法什么伊甸堆…… (弱代假说)
复制主要还是类似磁盘碎片整理一样整齐化内存使用(也可以很好的提升性能和缩减总体内存使用),缺点是比较慢(所以不能用来做终生代和永久代的收集,当然我不知道永久代是怎么回事,成熟代也可以用),实现要更新引用也复杂,据说一些 GC 实现用的是对象 Handle,二重查找,所以不必麻烦地更新每个引用?
如果不能理解内存里放的内容,就无法正常复制移动其中的对象了,就是说以前的 ExactVM,知道哪里是针对要移动对象的引用,可以更新句柄
GC 是很复杂的东西,至少说可调节的参数很多吧…… 何况现在还有什么 C4 什么 G1 的…… 我连 Serial, Parallel, CMS 都搞不懂
这时候我想想,我不就是个应用编程的吗?我想这么多干什么……