duangsuse::Echo
星野(我看了一点简单的日语,所以知道 hoshi ほし是繁星的意思,虽然冰封说是叫什么)大佬写的东西还真不错,很容易理解 虽然 Haskell 嘛,尤其是一些名字上的东西需要注意到,并且逐渐去熟悉,要不然看不懂在写什么的(自然语言也是一样嘛) 不过比起写 Monad,我觉得还是先写点工程能用的东西好一些。 用 Monad Transformers 真的是把 PLT 的问题都算法化了,可是如果要用 Haskell 写,当然 Haskell 比 Kotlin 高级啊,可是代码就难看很多 毕竟写什么东西用什么语言的…
blog.hoshino9.org 啊,是个大佬,刚才看见她还在谈 Rust 宏
Haskell,Kotlin,Rust 兼用的 OI 大佬,而且表达能力也很不错
Haskell,Kotlin,Rust 兼用的 OI 大佬,而且表达能力也很不错
补充一句: #Python #PLT #cs 红姐 其实是 github.com/thautwarm
https://pythonhunter.org/episodes/ep11
https://github.com/anqurvanillapy
另外 ANQUR 也是 Python 大佬
#JavaScript 的 贺老 就是贺师俊、 阮老师 就是 阮一峰
这些是昵称/尊称。
https://pythonhunter.org/episodes/ep11
https://github.com/anqurvanillapy
另外 ANQUR 也是 Python 大佬
#JavaScript 的 贺老 就是贺师俊、 阮老师 就是 阮一峰
这些是昵称/尊称。
GitHub
thautwarm - Overview
Casting a fireball. thautwarm has 237 repositories available. Follow their code on GitHub.
Forwarded from dnaugsuz
对了,现在的类型推导能不能收集值需求处的类型标记呢?
如果要支持
fun <T> &Box::<T>.force() = item as T
val box = Box::<Any>(1)
val i: Int = box.force() 如果要支持
val xs: List<Int> = mutableListOf() 这种代码好像也需要这种推导Forwarded from dnaugsuz
我还有一个内存对象建模的问题(
如果去掉
如果某个 struct 在型参里但既不是 reference 也不是 pointer 会怎么样? 不太写 C++ 呢……
记得 reference 好像是特殊处理的 pointer 吧
假设
如果去掉
&T 、将 struct 的 type 默认作为 reference ,然后给 Int 等值类型加优化、支持内联函数 ,接着就能区分 T* (就不必为和&的一致放前面了) 和 T? 了,这样有没有什么问题 🤔如果某个 struct 在型参里但既不是 reference 也不是 pointer 会怎么样? 不太写 C++ 呢……
记得 reference 好像是特殊处理的 pointer 吧
假设
TypeModifier 的构造法可以自动把 *& 给铺平成 List ,保留 isConst ,这种设计怎么样(只是问问)Forwarded from dnaugsuz
嗯…… 也是,记得你的 ASTNode 只有
如果用
(话说
(之前在 ParserKt 里也遇到了递归 toString 的问题,我是这么解决的,不知道有没有帮助)
fun Context.codegenForThis 一个方法,没有仅用于类型推导并填充的如果用
Context.hasCodegen 又太脏了, 现在是只能在 Function.instantiate 里拿不到赋值处的 ASTNode 吧... (话说这函数的 typeArguments, argumentTypes 命名还有点绕 x)(话说
TypeParameterTable.scope 为了避免无尽递归使得它的 receiver 也必须是 singleton object 啊... 的确是有点不优雅)(之前在 ParserKt 里也遇到了递归 toString 的问题,我是这么解决的,不知道有没有帮助)
GitHub
ParserKt/ParserKt
Naive one-pass recursive descent, scannerless parser framework for Kotlin - ParserKt/ParserKt
duangsuse::Echo
呃... 既然都说到这一步了就顺带讲一下我之前关于 动态作用域/词法作用域的见闻,虽然我知道没人感兴趣的。 动态作用域(dynamic scoping)就是你们能想到的,末端是全局作用域的嵌套表。 理解为栈,当前层的key被赋值、最顶层的表里的key被取值,所以栈帧销毁后解析会有不同的结果。 动态作用域没什么问题,也被用于诸如(嵌套命名空间)类型名解析的地方,除非函数可以作为值——比如 (set! a 1) (def get-kst() (lambda () a) ) (def main(a) (get…
func.instaniate(typeArgs, argTypes) 总感觉太 English 了... 如果用 instance 又不是动词,制造不一致性,或许 ofTypes, getInstance 之类的会好看些 🤔不过仅因为英文单词不常见就重命名合理吗?
不过 Mivik 的
PersistenceGroupingMap 挺有意思的,这是用来解析 trait impl 函数们的,包含 fun collect(key:K): List<List<V>> 方法... 不过我觉得这不像噢其实它的返回是
MutableList<Iterable<V>>, 然后 get(K): List<V> = collect(k).readOnly.let(::ChainIterable)... 不过也是实现了,我就觉得 ChainIterable 应该用在这种地方。不过这不是重点,
GroupingMap 有 collect(K) 方法,而 ChainMap 则可以有 shallowCopy() (flatCopy?)方法来保存命名环境,虽然这里是静态生成的闭包所以无需这么做……
duangsuse::Echo
呃... 既然都说到这一步了就顺带讲一下我之前关于 动态作用域/词法作用域的见闻,虽然我知道没人感兴趣的。 动态作用域(dynamic scoping)就是你们能想到的,末端是全局作用域的嵌套表。 理解为栈,当前层的key被赋值、最顶层的表里的key被取值,所以栈帧销毁后解析会有不同的结果。 动态作用域没什么问题,也被用于诸如(嵌套命名空间)类型名解析的地方,除非函数可以作为值——比如 (set! a 1) (def get-kst() (lambda () a) ) (def main(a) (get…
梗概一下 Mivik/kamet 自我停止更新后增加特性的建模要点 #Kotlin #CS #CE #PLT
== 参数化类型 类型形参
== Traits
目前还不支持 (intersection) upper-bounds
既有 Nothing,Unit, bool/char, (U) byte/short/int/long/float/double, Array/Struct/Function
Pointer,Reference(虽然我觉得都是 TypeModifier, 而且它们的 isConst 是共用的)
Named,TypeParameter(的包装)
== Dynamic Type (trait objects)
== 参数化类型 类型形参
val name: String== 类型推导 已知表:
check, toSting
Simple(name)
data Trait(name, trait) check = type.implemented(trait) || (type is Type.Dynamic && type.trait == trait)
data This(trait) : Trait("This", trait)
TypeParameterTable (ThreadLocal)<R> scope(block: TypeParameterTable.() -> R): R
set(typeParams: List<TypeParameter>, typeArgs: List<Type>)
map(typeParams): List<Type>
mapOrNull(typeParams) List<Type>?
equals(typeParam: TypeParameter, type: Type): Boolean = isEnabled && ...
这些命名我觉得应该叫 putActual( "<T, R>", "<Int, String>" ), fill("<T, R>"), fillOrNull, makeEqual(typeParam, type) == Traits
sealed /*data*/ class Trait(val name: String)然后有子类(抽象和未解析都属 Abstract)
implementedFunctions: Iterable<Function.Generic>
abstractFunctions: List<Function.Dynamic>
prototypes: List<Prototype>
abstract class Abstract(name: String) : Trait(name)class Base internal constructor 大概就是默认实现,加个
Named(name: String) : Abstract(name)
rename(newName)
Generic(base: Trait, typeParams: List<TypeParameter>): Abstract(genericName(base.name, typeParams))加个
resolveGeneric(typeArguments: List<Type>): Trait.Actual(generic: Trait, typeArgs: List<Type>) : Abstract(actualGenericName(generic.name, typeArgs))其 Impl:
data class TraitImpl(trait: Trait, type: Type, functions: List<Function.Generic>) { val table: LValue }
会生成一个虚表 (constArray: Function.Static) ,这依赖 constant method ordering. 然后可以选择是 vtable 存 struct 里还是用 fat pointer (inst,vtable)目前还不支持 (intersection) upper-bounds
<T: Closeable>
== 类型拓展既有 Nothing,Unit, bool/char, (U) byte/short/int/long/float/double, Array/Struct/Function
Pointer,Reference(虽然我觉得都是 TypeModifier, 而且它们的 isConst 是共用的)
Named,TypeParameter(的包装)
Generic(val base: Type, val typeParameters: List<com.mivik.kamet.TypeParameter>): Abstract()嗯…… Abstract 子类而不直接在
Actual(val generic: Type, val typeArguments: List<Type>): Abstract()
This(val trait: Trait) : TypeParameter(com.mivik.kamet.TypeParameter.This(trait))
UnresolvedThis : Abstract()
sealed class 里面抛错误是个不错的设计,但或许应该叫 Abstracted 或 Abstraction?== Dynamic Type (trait objects)
Dynamic(val trait: Trait, val type: Type?) : Abstract()
DynamicReference(val trait: Trait, val type: Type?, isConst: Boolean): Reference(Dynamic(trait, type), isConst)
Impl(val trait: Trait) : Abstract()
GitHub
GitHub - Mivik/kamet: kamet - a simple programming language written in Kotlin.
kamet - a simple programming language written in Kotlin. - Mivik/kamet
duangsuse::Echo
梗概一下 Mivik/kamet 自我停止更新后增加特性的建模要点 #Kotlin #CS #CE #PLT == 参数化类型 类型形参 val name: String check, toSting Simple(name) data Trait(name, trait) check = type.implemented(trait) || (type is Type.Dynamic && type.trait == trait) data This(trait) : Trait("This", trait)…
Mivik 真的很厉害呢…… 不愧是 OI 生,知道那么多我不懂的东西 (汗)
之前写的 Android 文本编辑代码高亮视图也是太大佬了,我不敢想……
类型推导里的 makeEqual 也挺有趣的,这不就是 unification 里 unify 算法的基本做法吗:
这里用 null 与否来判断是否成功,但总体和
ps. Kotlin 的 scope function 真的绝赞
Mivik 其实并不是一个 Rust 狂魔,但他有能力把 Rust 与 Kotlin 结合在一起成为他自己的 Kamet ,这不是死知识或者单纯的抄袭,在前人的基础上他也做到了融合与扩展。
或许在 LLVM 的帮助下设计一个编译器并不困难,仅仅复刻一门语言写个蓝皮书也不困难,但从零开始设计并实现一门类似 C++ 的语言绝对不是个小工程;即便有 Kotlin 的帮助,也足以显现扎实的理论基础和工程水平。 把注意力全部放在功能拓展上,是和仅仅耍弄术语概念、刻意编写晦涩臃肿的代码、努力营造“专业软件”氛围的工程师完全不同的方向。 一点名词也不用却做到了它们代表的真实内涵,这才是「专业」所不能够理解的深刻。
即便作为普通的 OI 生,我相信他也是非常有能力的一个,以后在大学也绝对是能进入顶级计算机科学社的水平
之前写的 Android 文本编辑代码高亮视图也是太大佬了,我不敢想……
类型推导里的 makeEqual 也挺有趣的,这不就是 unification 里 unify 算法的基本做法吗:
sealed class Sym {
data class Var(val name: String): Sym()
data class Val(val value: Any?): Sym()
}
fun State.unify(a:Sym, b:Sym): Any? {
val va=get(a); val vb=get(b)
return when {
(a == b) -> a
(a is Sym.Var) b.also { assign(a, b) }
(b is Sym.Var) a.also { assign(b, a) }
else -> null
}
} 这里用 null 与否来判断是否成功,但总体和
makeEqual(typeParam, type) 是一样的ps. Kotlin 的 scope function 真的绝赞
Mivik 其实并不是一个 Rust 狂魔,但他有能力把 Rust 与 Kotlin 结合在一起成为他自己的 Kamet ,这不是死知识或者单纯的抄袭,在前人的基础上他也做到了融合与扩展。
或许在 LLVM 的帮助下设计一个编译器并不困难,仅仅复刻一门语言写个蓝皮书也不困难,但从零开始设计并实现一门类似 C++ 的语言绝对不是个小工程;即便有 Kotlin 的帮助,也足以显现扎实的理论基础和工程水平。 把注意力全部放在功能拓展上,是和仅仅耍弄术语概念、刻意编写晦涩臃肿的代码、努力营造“专业软件”氛围的工程师完全不同的方向。 一点名词也不用却做到了它们代表的真实内涵,这才是「专业」所不能够理解的深刻。
即便作为普通的 OI 生,我相信他也是非常有能力的一个,以后在大学也绝对是能进入顶级计算机科学社的水平
duangsuse::Echo
编程时,命名使用不常见的英文单词应该被替换吗?例: onEncountered -> onHappend
duangsuse 除了泛向的 CLI/复用库设计 外可能没有什么专业,除了 codegen / bin+text serialize 俩好像也没啥了,不能后端也不能前端 GUI 也不太会... 太泛泛了
Kamet 里又出现了一次 Prototype 这个词, Lua 里这个词不止是
编程语言和自然语言是有区别的,我们是真的对严谨性有要求,而且不广为认知地,比数学更严谨。
所以我个人观点绝对是讨厌利用不常见的英文单词的,比如 lift, comprehension 等(往往这些词还有一大堆变形会被人混用)。
绝对不要以为你是在用英文编程就可以自由用英文的 trick 了,编程的世界只有结构关系逻辑,没有自然语言的理解,所以命名应该直白地反应其构件与其他构件间的关系,直白的东西自然是无歧义的。指望代码读者了解你心理的小九九很不明智。
说起来
Kamet 里又出现了一次 Prototype 这个词, Lua 里这个词不止是
FunctionDecl 还是包含其实现 code 的,真不知道该不该有 prototype, 它的语义太混乱了编程语言和自然语言是有区别的,我们是真的对严谨性有要求,而且不广为认知地,比数学更严谨。
所以我个人观点绝对是讨厌利用不常见的英文单词的,比如 lift, comprehension 等(往往这些词还有一大堆变形会被人混用)。
绝对不要以为你是在用英文编程就可以自由用英文的 trick 了,编程的世界只有结构关系逻辑,没有自然语言的理解,所以命名应该直白地反应其构件与其他构件间的关系,直白的东西自然是无歧义的。指望代码读者了解你心理的小九九很不明智。
说起来
Map<K, V> 和 Map<K 的区别也挺奇怪的…… 词法处理的时候会遇到歧义问题,不知道不用词法处理会如何...Forwarded from dnaugsuz
顺便: 发了点关于设计模式的文章
https://t.iss.one/dsuse/14704
查了一下 interface Resolvable 只在
开始还以为是要节省内存分配,把
https://t.iss.one/dsuse/14704
查了一下 interface Resolvable 只在
sealed class Function : Resolvable 里用了啊…… 而且 val resolved:Boolean 也没覆盖开始还以为是要节省内存分配,把
Type.Named 给改成 var type:LType 的了呢,所以有 resolved ,这种做法也不用 lazy 🤔Telegram
duangsuse::Echo
用 Visitor 你可以实现计算器(add a b = a + b) 和编译器(see (it:Name) = print(it.str) )
interface Eval<out T> { fun eval(): T }
sealed class Calc: Eval<Int> {
/* literal number */
data class L(val n: Int): Calc() { override fun eval() = n }
data class Op(val a: Calc…
interface Eval<out T> { fun eval(): T }
sealed class Calc: Eval<Int> {
/* literal number */
data class L(val n: Int): Calc() { override fun eval() = n }
data class Op(val a: Calc…
https://github.com/OrkoHunter/python-easter-eggs #Python #dontknow
https://www.python.org/dev/peps/pep-0020/#id2
https://www.python.org/dev/peps/pep-0020/#id2
import this
https://www.python.org/dev/peps/pep-0401/ 只能用 <> 而不是 !=GitHub
GitHub - OrkoHunter/python-easter-eggs: Curated list of all the easter eggs and hidden jokes in Python
Curated list of all the easter eggs and hidden jokes in Python - OrkoHunter/python-easter-eggs
Forwarded from Rachel 碎碎念 (IFTTT)
麻脑壳,Java / Kotlin 工程,尤其是要牵涉到 Gradle / Maven 的那种也太重了,要是能和 Python 一样脚本语言般轻量多好
学协程想写点什么测试,在 Android 工程里面搞实验是真的麻烦,让 VS Code 来启动一个新的具有 Gradle 支持的 Kotlin 工程…得了吧,我还不如乖乖开个新 Android 工程(— Rachel 呱 (@Rachel030219) August 24, 2020
学协程想写点什么测试,在 Android 工程里面搞实验是真的麻烦,让 VS Code 来启动一个新的具有 Gradle 支持的 Kotlin 工程…得了吧,我还不如乖乖开个新 Android 工程(— Rachel 呱 (@Rachel030219) August 24, 2020
Twitter
Rachel 呱
麻脑壳,Java / Kotlin 工程,尤其是要牵涉到 Gradle / Maven 的那种也太重了,要是能和 Python 一样脚本语言般轻量多好 学协程想写点什么测试,在 Android 工程里面搞实验是真的麻烦,让 VS Code 来启动一个新的具有 Gradle 支持的 Kotlin 工程…得了吧,我还不如乖乖开个新 Android 工程(
Forwarded from Rachel 碎碎念 (IFTTT)
翻了翻以前自己的源码,感觉自己至少还是在进步
从原来「it works!」不求甚解,到现在每写一句都要思考「为什么这一句写在这里?」「这样修复 bug 原理是什么?」「我能不能更好地解耦?」
bug 还是多,引入的额外思考更让本不灵光的脑子偶尔迷迷糊糊,但至少我自己开始去问 why 了— Rachel 呱 (@Rachel030219) September 6, 2020
从原来「it works!」不求甚解,到现在每写一句都要思考「为什么这一句写在这里?」「这样修复 bug 原理是什么?」「我能不能更好地解耦?」
bug 还是多,引入的额外思考更让本不灵光的脑子偶尔迷迷糊糊,但至少我自己开始去问 why 了— Rachel 呱 (@Rachel030219) September 6, 2020
Twitter
Rachel 呱
翻了翻以前自己的源码,感觉自己至少还是在进步 从原来「it works!」不求甚解,到现在每写一句都要思考「为什么这一句写在这里?」「这样修复 bug 原理是什么?」「我能不能更好地解耦?」 bug 还是多,引入的额外思考更让本不灵光的脑子偶尔迷迷糊糊,但至少我自己开始去问 why 了
Forwarded from 层叠 - The Cascading
江苏省苏州市推出「文明码」,全国首创。
刚想说这《黑镜》在现实中的完美演绎竟是如此真实,却发现这其实不是大家第一次这么说了 [1]。
> I promise you we didn't sell the idea to the Chinese government!
src: https://mp.weixin.qq.com/s/xMYK1pmsqT94fWcEPbt5ww
alt-src: https://telegra.ph/%E5%81%A5%E5%BA%B7%E7%A0%81%E8%BF%98%E6%B2%A1%E8%B5%B0%E6%96%87%E6%98%8E%E7%A0%81%E5%8F%88%E6%9D%A5%E4%BA%86-09-04-3
1. 参见《黑镜》第三季第一集《急转直下》 ("Nosedive")。
刚想说这《黑镜》在现实中的完美演绎竟是如此真实,却发现这其实不是大家第一次这么说了 [1]。
> I promise you we didn't sell the idea to the Chinese government!
src: https://mp.weixin.qq.com/s/xMYK1pmsqT94fWcEPbt5ww
alt-src: https://telegra.ph/%E5%81%A5%E5%BA%B7%E7%A0%81%E8%BF%98%E6%B2%A1%E8%B5%B0%E6%96%87%E6%98%8E%E7%A0%81%E5%8F%88%E6%9D%A5%E4%BA%86-09-04-3
1. 参见《黑镜》第三季第一集《急转直下》 ("Nosedive")。
Weixin Official Accounts Platform
“健康码”还没走,“文明码”又来了
魔幻
Rachel 碎碎念
麻脑壳,Java / Kotlin 工程,尤其是要牵涉到 Gradle / Maven 的那种也太重了,要是能和 Python 一样脚本语言般轻量多好 学协程想写点什么测试,在 Android 工程里面搞实验是真的麻烦,让 VS Code 来启动一个新的具有 Gradle 支持的 Kotlin 工程…得了吧,我还不如乖乖开个新 Android 工程(— Rachel 呱 (@Rachel030219) August 24, 2020
记得协程的 Intrinsic 是有 create, resume, suspendOrReturn
什么时候实现 LiteralKt 就不需要为项目创建操心了……
什么时候实现 LiteralKt 就不需要为项目创建操心了……