Skip to content

Instantly share code, notes, and snippets.

@duangsuse
Created March 9, 2024 13:45
Show Gist options
  • Save duangsuse/531cbced797ee007875baf97ed818500 to your computer and use it in GitHub Desktop.
Save duangsuse/531cbced797ee007875baf97ed818500 to your computer and use it in GitHub Desktop.
懒得喂给GPT了,因为知道要协商很久。 我觉得在语法低冗余前,这些比DSL还虚的还是少设计的好。从库的角度看,复杂用法的“美”绝对是昙花一现的。

请写一个 type inference ,正确判别以下表达式

toAST.run {
  `+`(+1, +1)
  `+`(+"Hi", +"World")
  say(+"Good"); say(Str)
}
toAST.runCatching {
  `+`(+1, +"World")
  `+`(+true); `+`(+1)
  say(say(+"void"))
  F(1){x-> x[0](Str); x[1](`+`(x[0], +1)) }
  //编译器只对函数体内调用赋值执行断言,(x:Int,y:Str) 是{dict}的写法而已
}
toAST.run {
  `+`(+1, `+`(+2, +3))
  F(1){x-> x[0]  (3); x[1](`+`(x[0], +1)) }
  F(1){x-> x[1](Var(Box,x[0])) }(Int)
  F(1){x-> Var(Box,x[1])(x[0]); }(Var(Box,Int))
  // ([T])=>T 和 (Str)=> 检查程序相同
}

必须基于以下AST 仔细思考

data F(n:Int, arg:(List<VT>)->Unit) {//arg+1 ret(T)
  invoke(*arg:List<VT>): T
  var next:F?//+1 overload
}
data T(override var type:Class?): VT {
  invoke(:Any)=tryFit(T(a::class.java)).isInstance(a).or("lit")
  invoke(:VT)=type!!.isAssignableFrom(t.tryFit(type)).or("call")
  tryFit(t)=type?:let{ type=t;t }
}
data Var(type,inout=0, vararg v:T): VT {
  invoke(:VT)=// 0完全相等,1允许v(out vt) 2允许vt(in v)
}
object toAST {
  //Str,Int=T()
  //Box=T(null)
  //say: F(null,Str)
  //`+`: F(2){x-> Int(x[0]); Int(x[1]); Int(x[2]) } or F(2){Str;Str} 
}
//其中参考了
fun Bool.or(:Str)=let{if(!it)println("bad $s"); it}
fun Any.unaryPlus()=T(this)
sealed May2<A,B> {
  data A(:A)
  data B(:B)
  way(A:(A)->R, B:(B)->R)
}

为了简洁就避免使用 单例Visitor(本质是做一次fn.bind常量)和链表式全局域 obj.k 这种语法,看着也像受检查的 obj[k] ,不过obj的类型若非final,传obj相当于传入了一堆函数值,这是静态类型特有的"多态" 同样是代码+bind双指针,OOP组合性比FP差。FP因为太紧凑不被职人习惯。

写java,C++ 这些的时候有种错觉: public 是🔘列表符号 分号和各种不执行的标注也完全喧宾夺主了 以上的 data{} 也有这种感觉。 对于重复率如此高的元组定义,为何不物以类聚呢?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment