duangsuse::Echo
711 subscribers
4.24K photos
127 videos
583 files
6.44K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#film 看过《 大护法 》 和 《 妙先生 》
#ce #Kotlin https://github.com/Mivik/kamet/ 的代码昨天下午重构了下,导览下大致结构:
依赖: com.bytedeco.llvm-platform, com.github.KiotLand:kiot-lexer
Value, Type, TypeDescriptor, TypeCastManager, GenericValue, ValueRef, Attributes, Context, JITEngine, Parser, Lexer
辅助: exceptions, internals
包ast 下的全都是 codegen 方法实现, ASTNode 都可以codegen(Context)和判是否returned ,代码最多的是 BinOpNode (数值转换提升的unifyOperandTypes,lift算法) 和 FunctionInvocationNode(findFunction,mangle等) 以及 IfNode (value if-else), WhileNode 。

Value在LLVM的 SSA(static single assignment) ValueRef 外面包了一层(value.llvm) , Type/TypeDescriptor(包装类型描述符) 则是指导对值/引用/指针处理翻译(translate)方法的类型,当然也有一个C式的类型系统(目前还在设计多态特性,大佬把它称为concept,就是trait啦)
GenericValue是对LLVM的包装,语言目前还没有闭包(词法作用域)所以在用Context.subContext嵌套查找符号引用
Attributes有Struct的packed和Fun的native,函数的声明称prototype、定义称function
Context包含LLVM的 IR Builder 引用 (context.builder)、 module和 function / insert point (.block) 以及通用辅助函数(如新函数或局部变量/父作用域链查找/verify)、嵌套符号表等

整个项目还在初始阶段,估计未来会有cli接口和输入程序错误列表的打算,不知道Mivik大佬打算做到什么程度…… 太厉害了吧我都不知道应该这么设计呢😟
这种项目怎么能拿星星数来判断它的价值呢?
最近 #zhihu ,我标榜的是「凡邀尽答」(当然不是穷尽里的尽,而是尽力里的尽…),那是因为害怕别人不敢找我答问题,可现在邀请的人简直是随便邀请啊……
计算机科学—程序设计语言也不一定得是 Matlab, R, 甚至 Verilog 都会啊…… 很多东西我只是听了个名字而已,倒像是在班门弄斧了。 真的是累死了
还有不少人邀请我答数学问题的,草死了
This media is not supported in your browser
VIEW IN TELEGRAM
🤔原来就知道解释器可以元循环(metacircular)、自动机非常精妙,也见过基于位图的编程语言Piet和基于四向箭头字符的2D控制流语言Befunge、最简语言brainfuck。见过牛人让30多种语言环形编译而能从1得到30出,也见过MC里用逻辑电路实现计算机,但还真是不知道就凭 game of life 也能弄出它自身,甚至可以当真弄出个有完备寄存器、数逻单元、二元十进制化表示的计算机来…… 不止是算法有趣,计算机和电子电路本身更有趣啊……
🤔学到了原来除了malloc/free和alloc,我们还应该用 mmap/munmap,因为那样可以创建 JIT 用的 code buffer


void* buf = mmap(NULL, n, PROT_RW | MMAP_PRIVATE | MMAP_ANONYMOUS, -1, 0)
memcpy(dst,src,nsrc)
mprotect(buf,n,MMAP_READ|MMAP_EXEC)
Forwarded from 荔枝木
确实如此
#CPP 用到了 DeviceInformation, AudioPlaybackConnection 和 watcher API , static 的局部变量设计还蛮精巧,最后的目的是 connection.Start(), open() check(status())
所以说 audio connection 是有三种状态: closed, ready, opened
Forwarded from YSC 的频道
用 C++/WinRT 写了个最简单的 POC,证实是可以在 Win32 下使用的。
Forwarded from dnaugsuz
说句题外话,写 tailrec 替换 while 也是可以的


fun findFunction(name: String) {
var current: Scope; = this.scope
while (current != null) {
current[name]?.let { return it }
current = parent.scope
}
}

tailrec fun findFunction(name: String, scope: Scope) = scope[name] ?: findFunction(name, parent.scope)

fun findFunction(name: String) = sequence(this, Context::parent).map { it.scope[name] }.firstNotNull()
``
Forwarded from dnaugsuz
或许 receiver 不能算参数,没法给优化 🤔
啊说起来我都不知道 tco 一般是怎么做静态分析的……菜
Forwarded from dnaugsuz
不过一般尾递归都是在复杂的时候作为 private 辅助函数被调用的
Forwarded from dnaugsuz
的确不大好看(而且还加了个多余的参数改动检测)
大致就是返回一个闭包,第一次调用isActived=false,以后递归则直接返回,但把arguments写到闭包的cont_args变量里,让第一层的while循环再去 op.apply ,只保留一个cargs就做到了调用栈不使用。

等于一旦进行递归调用(函数已经在执行),直接改参数、跳转到原函数开头再执行一遍。
Forwarded from dnaugsuz
哇,那个 generateSequence(Tree(null,null)) { left -> Tree(left,null) }depth = DeepRecursiveFunction<Tree?,Int> { t,n -> maxOf(callRecursive(t.left), callRecursive(t.right))+1 } 真的好优雅,以至于命名长一点也无所谓…… 新的特性应该说是灵活应用吧。

不是异步所以能直接从标准库调用吗🤔,之前没有见过的新东西呢。 有 coroutine 能做到把执行状态放堆上 对递归算法应该会很有趣。

这个递归函数的状态就是 tree ,返回时结果 +1 ,如果在栈没满前把tree参数和求值状态存到堆上,算完末尾节点后再 resume 就可以避免栈溢出了,不知道 Scala 有没有。
Forwarded from dnaugsuz
想起来之前我写过一个利用 sealed class 和 ADT Stack 改写递归程序的例子…… 很难看 https://github.com/duangsuse-valid-projects/three-kt-files/blob/41e8b20e64c810c252f34cce60b522967aeed154/src/commonMain/kotlin/Calc.kt#L103

如果实现动态把栈顶下n层给替换成1层 resume handler 也不容易啊, resumeCoroutineOrReturn 的参数都不知道给到哪,所以果然 callRecursive() 还是很对应的设计呢
duangsuse::Echo
#ce #Kotlin https://github.com/Mivik/kamet/ 的代码昨天下午重构了下,导览下大致结构: 依赖: com.bytedeco.llvm-platform, com.github.KiotLand:kiot-lexer Value, Type, TypeDescriptor, TypeCastManager, GenericValue, ValueRef, Attributes, Context, JITEngine, Parser, Lexer 辅助: exceptions…
嗯……我再想想 ParserKt 的 primitives
SDRies CDP PWOC SJITLL
Seq(tup,*es),Decide(*es),Repeat(fold,e)
item(x), elementIn(rng), satisfy(p)

Convert(p,equiv), Deferred(lazy_p), Piped(p,trans)
Pattern,PatternWrapper,OptionalPattern,ConstantPattern
SurroundBy(pair,e), JoinBy(join, e), InfixPattern(e), TriePattern/TrieBack/MapPattern/GreedyPattern, LayoutPattern(lay,e), LexicalScopedPattern(body)

Feed 现在除了 SourceLocated, FeedError 还要加一个 FeedControl { val isEnd; fun peekMany(n:Int):List } 了。
因为这样, PKT 才可以更好的兼容 /* 注释之类的而无需担心无法在 InfixPattern.read 之类的算法里很好的处理 skip 的问题 (一旦在'/'那consume了,就没法让 InfixPattern 再识别这个运算符了)
所以只需把 var lastItem 再加 val readBuffer ,在 peekMany 的时候加入、 consume 的时候先弹出 即可

template typename<T>
T* maxIndexOf(T* src, size_t n) {
T* max; for (T* i=src[0]; i<n; i++) if (src[i] > *max) max = &i;
return max - src;
}
T* maxIndexOf(T* src, size_t n) {
T* max;
for (int i=0; i<n; i++) if (src[i] > *max) max = &src[i];
return max - src;
}
哇真棒果然默写下来了…… 虽然没意义