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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from Albert News | 您可能感兴趣的内容 (Albert Xu)
Facebook Messenger is removing the ability to find someone by entering their phone number

Facebook Messenger正在删除通过输入其电话号码来查找某人的功能

来源:
https://twitter.com/wongmjane/status/1210864489358184448
翻译成中文就是
量 userProfile:AlipayProfile
@GetMapping @RequireRoles("consumer") 取者,
回 currentUser 令为(alipayUserService去::getProfile)
?去令为(::AlipayProfileData)
空则,抛下BusinessEx("unexpected_exception") 。
接着翻译就是
量 用户资料:支付宝资料传输 【身份要求 "消费者"】
【GET路径】的取者,
回 当前用户令为(支付宝用户服务去::取资料)?
去令为(::支付宝资料传输)
空则,抛下BusinessEx("unexpected_exception")。
Forwarded from dnaugsuz
所以说这样的无参 getter 就得用 val 的形式写了……虽然好像 Kotlin 的 annotation 无法把 getter 作为方法 annote?

val userProfile: AlipayProfile
@GetMapping @RequireRoles("consumer") get() {
return currentUser.let(alipayUserService::getProfile)
?.let(::AlipayProfileData)
?: throw BusinessEx("unexpected_exception")
}
duangsuse::Echo
“print("吃了么")” 说("吃了么") “// 简单值部分” “var 某变量 = 42 某变量 = 50” 变数 某变量 = 42 某变量 = 50 变参 k:数 = 1 “type inference is supported” “let 某常量 = 42” 常数 某常量 = 42 “只能在文件作用域或「例」作用域声明和定义” “let 隐式整数 = 70 let 隐式小数 = 70.0 let 显式小数: Double = 70” 量 隐式整数 = 七十 量 隐式小数 = 70.0 量…
“let 有趣的数 = [
"质数": [2, 3, 5, 7, 11, 13],
"斐波那契": [1, 1, 2, 3, 5, 8],
"平方": [1, 4, 9, 16, 25],
]”
量 有趣的数们 = 表一(
"质数"对 行一(2、3、5、7、11、13)、
"Fibo"对 行一(1、1、2、3、5、8)、
"平方"对 行一(1、4、9、16、25) ) “但这不是绝句一般的风格”

量『有趣的数们 一般风格』:表<文、行<数>> = 动表一() 顺便, “我觉得强行合法化规则还是和Kotlin一样吧”
它加入("质数"对 行一(2、3、5、7、11、13))
它加入("Fibo"对 行一(1、1、2、3、5、8))
它加入("平方"对 行一(1、4、9、16、25))
“好吧,这更不是一般风格……”

“var 最大 = 0
for (种类, 数) in 有趣的数 {
for 某数 in 数 {
if 某数 > 最大 {
最大 = 某数
}
}
}
print(最大)”
变数 最大 = 零 “皮一下”
解对『有趣的数们』里的(_种、数们),
对数们里的此数,
若此数大『最大』,最大 = 此数。
“若此数是最大,什么都不做。”
“所以说逻辑推导也是类型检查(会是这样)或者lint的时候必须的啊,还得考虑什么多线程,这又是一个难点”
“不过绝句应该好像可以加『语者』来允许 variable 的 smart cast、判定 exhaustive 什么的?”
“ ‘!语者 单线程逻辑’ ”

“var 翻番 = 2
while 翻番 < 100 {
翻番 *= 2
}
print(翻番)”
变数 『二翻番』 = 2
重复若『二翻番』小一百, “不良实践呢”
翻番令置为「*2」 “刻意用正式版的特性,以显得绝句的『高明』之处。”
“这个「」呢你可以理解为函数调用里另一个类似逗号的东西,不需要额外加括号才能调用了,不过它们也不可能作为值单独出现。”
“当然,绝句的记法(自定义中后缀)也是利用了这种括号的,不过个属于定义的就不一样了。最大的区别是调用的「」可以进行中后连缀、「定记法」和「记法的」很死。”

“var 也翻 = 2
repeat {
也翻 *= 2
} while 也翻 < 100
print(也翻)”
引记法 绝句.符号 「止」 “本来实现是在 绝句.区间.数步进 的,许多绝句的符号哪怕是「~前」「~后」都必须先「引记法」才能用,除非很内部的比如+-*/、且或非”

说((2止100)的末项)

变数 也翻=2
重复,也翻 = 也翻*2。若也翻小100; “加「;」皮一下”

“看,这里「重复……若…」里「若」的布局深度,就是父层的深度。一个「若」只能对应上一个「重复」”
“上一个也可以优雅地写进一行内,哪怕是包含多条语句也一样,这是逗号表示法最突出的一个优点。”

重复,
也翻 = 也翻*2
若也翻小100
说(也翻)

“var 总和 = 0
for i in 0..<4 {
总和 += i
}
print(总和)”
“看到这里的 0..<4,我突然觉得 Apple 的 Swift 设计得真是不考虑简单性…… 那么多特化的语法,却远远不如 Kotlin 的 a..b 和 a until b 好学、优雅”

变数 总和 = 0
对0止4里的i,总和令置为「+i」。 “再用一次正式版的特性,嘲讽一下 Swift。”
说(总和)

“// 函数和闭包”

“func 问好(人: String, 日子: String) -> String {
return "吃了么\(人), 今天是\(日子)." //“你看看这个语序不当的,表意语而不是上下文放前边。”
}
问好(人: "小白", 日子: "周二")”

“好吧,name: Type、name: Value of Type 算这个还能看得的。”

事 问好(人:文、日子:文):文 为
回"($日子)吃了么$人?"
事 问好1(人:文、日子:文) = "($日子)吃了么$人?" “传统Kotlin简化定义方式,还能返回类型推导”

问好(人="江小白"、日子="星期二") “代名调用,这样可以尽可能大的利用默认参数,规则和Kotlin一致同时只能使用带名不带名之一。”

“Kotlin fun a(x:Int=2, y:Int)=x”
“a(1) 会认为只是提供了 x 的参数,而绝句认为,形式参数跟在可选参数后是没有意义的,因为它的意义基本都可以等价代换到后面,而利用具名调用和不具名方式切分传参顺序相当令人困惑,所以类似C++地,不允许这种写法。”
“只解决不得不解决的问题(比如调用参数的模板化),不把解决方案本身做成一种问题。”

例物 星期(“公开的”量 号:文) 为 “很多东西默认都是公开的,而不是莫名其妙写一大堆public,这是鼓励大家把私下的逻辑写精炼一点。”
第一("一")、第二("二")、第三("三")、
第四("四")、第五("五")、第六("六")、
第七("日")
“本身有 name(名字)、ordinal(序号)”
“伴生例里有 values(取值)、valueOf(String)(值于)”

“func 问好(_ 人: String, 在 日子: String) -> String {
return "吃了么\(人), 今天是\(日子)."
}
问好("小黑", 在: "周三")”

“按照上面的说法,『绝句』绝不会在这种无聊的地方下功夫,为了解决一个不该存在的问题让代码更不和谐、更难理解。”
“绝句利用「记法」「内联的物」「扩物」完全有能力实现 `在("周三")向("小黑")去问好()` 这种形式且有能力进行『语序变动』的DSL,但它默认不那么做,难道这不比keyword arguments「高级」?只是不想给别人制造写出问题代码的可能性而已。”

“参数列表的特性上下功夫,甚至最后跪舔『脚本语言』Python式的弄,不如好好斟酌一下标准库怎么设计好。”

“func 统计(得分: [Int]) -> (最小: Int, 最大: Int, 总和: Int) {
var 最小 = 得分[0]
var 最大 = 得分[0]
var 总和 = 0

for 分 in 得分 {
if 分 > 最大 {
最大 = 分
} else if 分 < 最小 {
最小 = 分
}
总和 += 分
}

return (最小, 最大, 总和)
}
let 结果 = 统计(得分: [5, 3, 100, 3, 9])
print(结果.总和)
print(结果.2)”

“绝句里单引号是文档,可以在工具里看到。”
“一个类/物的类型参数可以直接加入文档,参数和返回值的文档可以直接加在前面也可以独立加”
“和Kotlin,也是Markdown的”
事 统计(得分:组<数>):‘最小、最大、总和’ 元三<数、数、数> 为
对得分里的分,
判分, “一时间我也找不到更好的方法把「对」和「判」连在一起”
它大最大,最大 = 它。 “「它」是此分支局部的”
它小最小,最小 = 它。
上皆,总和令置为「+分」。
回元三(最小、最大、总和)
这里,
变数 最小 初0;变数 最大 初0;变数 总和 初0 “不是一般的编程风格,但不置可否。”
“这个版本里,暂时我不会把对「变(属)(名)初(言)」的修改加上,请兼容前面的一部分。”

“func 返回十五() -> Int {
var y = 10
func 加() {
y += 5
}
加()
return y
}
返回十五()”
duangsuse::Echo
“print("吃了么")” 说("吃了么") “// 简单值部分” “var 某变量 = 42 某变量 = 50” 变数 某变量 = 42 某变量 = 50 变参 k:数 = 1 “type inference is supported” “let 某常量 = 42” 常数 某常量 = 42 “只能在文件作用域或「例」作用域声明和定义” “let 隐式整数 = 70 let 隐式小数 = 70.0 let 显式小数: Double = 70” 量 隐式整数 = 七十 量 隐式小数 = 70.0 量…
以前我偶尔以『艺术品』的心态想到『用中文写程序』,把中文看得比编程重,结果写出来的东西不像中文更不能编程。

现在我多学习了几门『不常见』的编程语言,Haskell、Scala、Kotlin,结果写出来的东西不仅符合编程逻辑而且像中文,这真是奇怪啊。

如果你连文字都不会敲、逗号顿号傻傻分不清,是设计不出『中文编程语言』的,这一点不必多说吧。
duangsuse::Echo
😏 Sticker
FONT = Font.FreeTypeFont.read('/usr/...')
(BASE_X, FIXED_Y) = (..., ...)
def compositeText(s):
img = Image.open('panda.png')
(txtW, txtH) = FONT.getSize(s)
txtWd2 = txtW/2 #atom layout calc (width-balance)
img.draw_text(x=(BASE_X-txtWd2), y=FIXED_Y, font=FONT, text=s)
return img #effect
def main():
for text in input().split(" "):
img = compositeText(text)
img.save(f'panda_{text}.png')


别测试,我说着玩的,没看见我没写导入吗? 😂
其实我把 Binarie 的类图都画好了,难点也的 swapIntegral, fromIntegral, toIntegral 也整理到 Convert.kt 里了,可就是没时间实现了,算。
其实 ParserKt 也一样,我完全建模好了 Input 和 Parser(以及 PredicateParser:AtomParser, ReduceParser, Seq, Repeat、OrParser) 架构,可就是没时间实现…… 也是天注定吧。
duangsuse::Echo
“let 有趣的数 = [ "质数": [2, 3, 5, 7, 11, 13], "斐波那契": [1, 1, 2, 3, 5, 8], "平方": [1, 4, 9, 16, 25], ]” 量 有趣的数们 = 表一( "质数"对 行一(2、3、5、7、11、13)、 "Fibo"对 行一(1、1、2、3、5、8)、 "平方"对 行一(1、4、9、16、25) ) “但这不是绝句一般的风格” 量『有趣的数们 一般风格』:表<文、行<数>> = 动表一() 顺便, …
事 『十五』():数 为
变数 y 初0
加();回y
这里, “当然是从 Kotlin+Haskell 共同衍生的用法,局部函数(local function) + where scope”
事 加() 为
y令置为「+5」
“一时间我也没想到「为」写一行内的做法,我考虑一下……”
“事 加() 为,y令置为「+5」。”
“可是多少还有点不好看,不够一致”
“啊,才想起来有等号函数的…… 😂
事 加():效果 = y令置为「+5」“条件是得有存储抽象,那也不是很难实现的。”
“如果说包含赋值的「事」可以写在一行内,我是断断不能同意的……Python也是一样,Lambda都不能有赋值”

“func 造累加器() -> ((Int) -> Int) {
func 加一(数: Int) -> Int {
return 1 + 数
}
return 加一
}
var 累加 = 造累加器()
累加(7)”
事 造累加器():(数)数 为
事 加一(n:数):数 = n+1
回 加一
“这个累加器很不称职,是无状态的。”
量 累加 = 造累加器()
累加(7) “8”

物 真累加器(变数 n 初0) 为 “你没有看错,的确是这种顺序。”
“再比如呢” 造于(量x:数=0、变数 y 初1)
“造于(变参n:数“变参定义” = 0“默认值”、量k:数):我(n=1)”
“不是很对称,但我也没办法,因为我觉得它是(有价值?)的,实在不行我还可以「变参」么”
事 加上(k:数):真累加器 为
n=n+k;回我
初,说("又有一个累加器被制造出来了。")。
量 实际上之累加器=真累加器()
实际上之累加器去加(7)去加(8) “7+8”

变数 a“变参定义” 初0“初始值”
晚成的变参 a1:数“定义” “……”
变参 a2:数? 初空
说(a2!) “运行时异常”

“func 有匹配(列表: [Int], 条件: (Int) -> Bool) -> Bool {
for 某项 in 列表 {
if 条件(某项) {
return true
}
}
return false
}”
定记法「存」

私下的事 存匹配(此行:行<数>、条件试:命题<数>):真假 为
对此行里的,
量符合 = 条件试(它);若符合,回真。
回假

扩物 行<数> 为 “模板特化?🤔 绝句编译器使用 Map 数据结构查找这些特化的扩物,泛化类物实例什么的,参数化类型实例都有hashCode。”
记法「存」的事 存一(条件:命题<数>) = 存匹配(我、条件)

“func 小于十(数: Int) -> Bool {
return 数 < 10
}”
事 小于十(此数:数) = 此数小十 “放心,不会和「小」冲突。调用都是「去」或者无前缀、点号前缀的”
“属别名 命题<值者> = (值者)真假”
量 小于十闭包:命题<数> = 函数,它小十。 “函数「小十」”

“var 数列 = [20, 19, 7, 12]
有匹配(列表: 数列, 条件: 小于十)”
量 数列 = 行一(20、19、7、12)
有匹配(数列、::小于十) “架构器和函数都可以被引用,要是在对象上用就得『去::』了。”

“数列.map({ (数: Int) -> Int in
let 结果 = 3 * 数
return 结果
})”
数列去投至,〖此数:数〗
量结果 = 3*此数
回结果

说(数列去投至,3*它。)
数列去投至「*3」令为(::说)
“无论是用逗号表示法+第三人称还是「」中缀简记都比 Swift 好看一万倍,🌶🐔 Swift。”
“考虑到「投」不能作为标准符号没「引记法」,要不然就基本完全是自然语言了。”

“let 映射后 = 数列.map({ 数 in 3 * 数 })
print(映射后)”
量 映射后 = 数列去投至,〖此数〗3去乘(此数)。
说(映射后)

“let 排序 = 数列.sorted { $0 > $1 }
print(排序)”

量 有序 = 数列去排至,〖a、b〗a大b。“降序”
“当然,写多参空方括号多难看啊,`数列去排至「大」`也不赖。”
断言(有序[0]大有序[1])
说(有序)
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/index.html

试着定义一些绝句的核心类型,至于绝句如何翻译至多门语言…… 只当下面是Kotlin翻译目标专属的。

包 绝句

‘绝句中任何「物」的基础物,位于继承树的最顶端。’
开放的物『值』 “公开的造于()” 为
‘将[我]与[另]进行相等性判断。若等价,回真。’
‘[另] 比较宾语,`1是2`里的`2`。’
‘实现必须满足以下性质(这里 _斜体_ 都是非空 [值]):
+ 自反性(reflexive):对何 _x_,`x是x`成立。
+ 对称性(symmetric):对何 _x_、_y_,若`x是y`,`y是x`成立。否则`y是x`定不成立。
+ 传递性(transitive):对何 _a_、_b_、_c_,若`a是b`且`b是c`,`a是c`成立。
+ 一致性(consistent):对何配对的 _a_、_b_,任意次执行`a是b`结果不变,或者说它是纯函数(pure function)。
+ 非空判断:对何 _x_,`x是空`不成立。`空是空`成立。 ’
【内建 "Any.equals"】待例、开放、算符的事 问等(另:值?):真假
‘取此值的哈希码。对于 [为等] 的值,哈希码总是一致的,即便其一「不即是」另一。’
【内建 "Any.hashCode"】待例、开放的事 化记码():记码
‘取此值的文本化表达’
【内建 "Any.toString"】待例、开放的事 化文():文


啊好累啊,会不会是绝句的文档写起来麻烦……

此外还有好多应该定义的,
Annotation 注解,这个只是个标记

Comparable 有序<入T>
算符 求序(另:T):序
例物 序 { 大、小、等 }
属别名 顺序<T> = (T、T)有序.序
Array<T> 组:可度(Sized) size大小 算符们:get取 set置 iterator建迭子
还有算符 component1-5
有许多组一 组空 组全空
  fun <reified T> emptyArray(): Array<T>
对何<真项>皆有待例的事 组空():组<项>
fun <reified T> arrayOfNulls(size: Int): Array<T?>
对何<真项>皆有待例的事 组全空(计:计数):组<项?>
fun <reified T> arrayOf(vararg elements: T): Array<T>
对何<真项>皆有待例的事 组一(许多的内容:项):组<项>
当然这个待例是【内建】的……
当然,它可以这样调用,我还没设计 spread 语法……
  组一(*xs)
还有许多的 Unboxed array:Boolean/Byte/Short/Char/Int/Long/Float/Double Array
CharSequnece 字符序列:可度

Annotation 里的也可以
  【路径们 3、[1, 2, 3]】
Cloneable 可复制
Closeable 可关闭
Throwable 可抛下
Serializable 可化串
Pair 元二
Triple 元三
String 文
Nothing 断止
Unit 效果
Version 绝句.核心库版本
Function<in T, out R> 对何<入T、出R>皆有物 函数 算符的事 用
Lazy<T> 惰性求值<值者>
例物 并发安全 { 安全、实例一致、不安全 }
Exception 错误 (接迎XX错误我觉得没啥不对的……何况异常和错误很多时候对它们的区别是让人莫名其妙的)
Error 失败
RuntimeException 运行时错误
ArithmeticException 运算错误
IndexOutOfBoundsException 索引越界错误 (一般人写程序都不会出这种错误,所以不作简化)
ClassCaseException 作属断言错误(还分 Java 的、Kotlin 的、绝句的……)
IllegalArgumentException 参数断言失败
IllegalStateException 状态断言失败
AssertionError 断言失败:失败(绝句正好反着来,Exception=错误、Error=“异常”,Error是主动的所以叫失败、Exception是被动的而我又不想破坏中文语言习惯所以这么叫)
NoSuchElementException 项目未找到错误
NotImplementedError 尚待实现失败
NoWhenBranchMatchedException 分支穷举性断言错误(据说Common里没有)
UninitializedPropertyAccessException 属性未初始化访问错误
UnsupportedOperationException 操作未支持错误
NullPointerException 非空断言错误(还分 Java、Kotlin、绝句的)
NumberFormatException 数值解析错误
OutOfMemoryError 内存耗尽失败
Closeable 可关闭
Enum<ENUM: Enum<ENUM>>: 有序<ENUM>(name: String, ordinal: Int) 枚举项
为等、化记码、化文
abstract Number 数值
to (Byte/Short/Char/Int/Long/Float/Double)
以及 Byte, Short, Char, Int, Long, Float, Double 这些加了 Comparable 的
Boolean: Comparable<Boolean> 真假
算符 且、或、非……
记法「异」
为等、化文、化记码
扩展个 『化字节』 就可以了,但我不打算让 `true>false`,看不出有什么意义。

ConcurrentModificationException 并发变动错误(暂时这么叫?
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

DeprecationLevel 弃置级别
Deprecated
SinceKotlin
Suppress, ReplaceWith
UnsafeVariance
Volatile 并发易变
Synchronized 完全同步
BuilderInference
大概就是这么说:
fun <T> sequence(block: @BuilderInference suspend Scope<T>.() -> Unit): Sequence<T>
val seq = sequence { yield(1) }
靠着 Scope<T> 上的 yield(T) 就能够推断出 Scope 的类型
我不会……

PublishedApi 事实开放
OptionalExpectation 可无实际
ParameterName 默认名
duangsuse::Echo
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/index.html 试着定义一些绝句的核心类型,至于绝句如何翻译至多门语言…… 只当下面是Kotlin翻译目标专属的。 包 绝句 ‘绝句中任何「物」的基础物,位于继承树的最顶端。’ 开放的物『值』 “公开的造于()” 为 ‘将[我]与[另]进行相等性判断。若等价,回真。’ ‘[另] 比较宾语,`1是2`里的`2`。’ ‘实现必须满足以下性质(这里 _斜体_ 都是非空 [值]): +…
然后看看一些基本的算符……
inc后 dec前
plus加+ minus减- times乘* div除/ mod取余
unaryMinus取负-@

扩展的位运算,我打算把他们放在专门的包里
and与「位交」 or或「位并」xor异或「位异」
shl左移「左移」shr右移「右移」

val KProperty0<*>.isInitialized: Boolean

fun TODO(reason: String): Nothing

fun Throwable.addSuppressed(exception: Throwable)
val Throwable.stackTrace: Array<StackTraceElement>

fun assert(value: Boolean, lazyMessage: () -> Any)
fun assert(value: Boolean)
fun check(value: Boolean)
fun require(value: Boolean)
fun <T : Any> requireNotNull(value: T?): T
fun <T : Any> checkNotNull(value: T?): T
fun <T : Enum<T>> enumValues(): Array<T>
fun <T : Enum<T>> enumValueOf(name: String): T

lazy, lazyOf
isFinite, isInfinite, isNaN
fun Double.toBits(): Long
fun Double.Companion.fromBits(bits: Long): Double
fun Double.toRawBits(): Long
fun Int.toBigInteger(): BigInteger
fun <T> Pair<T, T>.toList(): List<T>

fun <R> synchronized(lock: Any, block: () -> R): R
fun <R> runCatching(//令试

operator fun String?.plus(other: Any?): String
fun Any?.toString(): String
fun Any?.hashCode(): Int

“包 绝句.额联”定记法「接」
扩物『文』 为
待例、记法「接」的事 接(右:文):文

定记法「~次」
扩物『数』 为
记法「~次」的事 次:计次“……”
内联的事 计做(次:计次、动作:(计数)效果) 为
对次里的计,动作(计)。
……

语言内部的 ranges (progession), annotation 当然是需要的
考虑一下好像也需要 collection(Iterable可迭, Collection合, Slice切片, List行, Set集, Map表), math, text, system, io, delegates 甚至 time, reflect 这样的包。

此时和Kotlin差的除了Unsigned integer和suspend、Result<T>不多了。
唉突然莫名觉得好失望啊,做了那么多东西其实Kotlin早就有解决方案了,我还以为更好呢。

也是,绝句设计其实现在没啥时间的,还能指望什么有价值,文法上做点好东西就行了,其实类型系统本来不想的话也不必定义的。

Kotlin已经这么完善,直接翻译到Kotlin好了
inline class Result<out T> : Serializable
靠,我自己之前设计出内联类啊……Kotlin里现在也有了(虽然它早都有了,呵呵)
内联类什么的还是绝句编译器自己实现吧,免得要开Experimental以及语义差别。

对何<出值>皆有
内联物 结果:可化串……
我觉得还是苦它一点,先做成一个直接的翻译器吧…… 反正项目结构简直是和 Kotlin Van 全一致啊……

除了包命名空间的解析还是要自己做(记法的依赖),好像都没啥可说的了。

其实PKNF的形式化定义早就写出来了,而且PKNF语法本身就是上下文相关的(现在定义写在纸面上),所以说就语法而谈技术上是不存在难题。无论是『汉语编程』、自定义中缀、Layout布局、逗号表示法、汉字数值……
所以绝句应该在现在就可以开始整理语言和核心库设计了,不过在那之前我必须先把那个 Sakura 扩展lambda演算计算器的一部分弄出来,然后拿 ParserKt 尝试解决中文数值、自定义infix、布局文法的问题。(为了弄一个能被快速实现的『脚本语言』我之前有刻意简化Sakura呢,所以等这个叫Sakura的脚本语言发布之前会有一个语法比较类似的玩具能够测试各种东西)
#Android #dev #tech 之前打算重构的e2im,其实草稿都打好了……
duangsuse::Echo
#Android #dev #tech 之前打算重构的e2im,其实草稿都打好了……
1. unsigned long long in 32-bit 检查是为何而定(这部分逻辑我是抄的,但不是复制粘贴
2. 'newline' bug in result protocol (已修复)
3. check errno always single digit, for result protocol limitation
4. prototecting(variable, op) and foreach(name, begin-end iterable, op) rewrite in functional subprocedure form
5. extract takeWhile functional abstraction
6. [Kotlin] retry -> runFailures
7. extract non-su mode superclass
8. specify error code semantics
!1 open fail
!2 file not exists
!3 file not supported
9. [Kotlin] add helper for ListFlags
getWithItem(.): Array<Pair<T, Boolean>>
setWithItem(flags: Array<Pair<T, Boolean>>)
mapWithItem(f):Unit = set(get().let(f))
10. extract: abstract class ChildProcessIntract
谈范畴论:无id箭头如何
负片夜间模式(Canvas, img_cache.js, initNext(), show()=show(next);hide(this), hide()=hide(this);show(prev))
digraph 某人 {
rankdir=BT;
somebody [label="某人", shape=record];
me [lable="我"];
motherOf [label="某人的母亲"];
me -> somebody [label="coprod"];
motherOf -> somebody;
}

f: a -> b to forall a b. f: a -> b
duangsuse::Echo
🤔duangsuse 昨天晚上想到了一些话,愿意分享给大家。 #statement duangsuse(虽然一点也不好)是如何编程的呢? 他编程,是一个从整到零,再从零到整的过程。 首先是把一个相对比较大的目标,拆分成许多能够比较简单实现的小目标。 比如,把一个操作纷繁复杂的类(class),抽提出实现了很多接口的类。 接着是和自己争论实现的难点和复杂性,继续重新拆分和重新组织继承、数据依赖这样的关联,偶尔还会为一些经常联系在一起的东西(比如 Database, Controller) 起一些首字母简写,记住。…
还有就是这个,此外还应该提醒学会数据的依赖分析,这个其实主要还是看思想,实践是最好的方法。 #learn

比方说:
import java.lang.System.`in` as stdin
val input = Scanner(stdin)
val a = 1
val c = a + if (p) a else input.nextInt()
这就要求你有看出这个 c「偶尔」需要依赖 input 的(对象状态)意思。
还有,input 本身可能有状态,在控制流图(CFG, Control Flow Graph)和计算、副作用的产生中可能有怎么样的变化,必须清楚。
最基本的:给你一个 val c,你要知道求出它需要依赖什么数据,如果有些断言要做,你得知道哪些情况叫『正常程序状态』『正常代码路径/程序路径』有哪些则是可能错误的。

另外,要知道一些东西不能太注意刻板的风格,要更加在意可读性。
比如,像 Android Gradle 插件里的 android {} DSL
首先我们知道 compileSdkVersion 是不能缺的,而且对 android {} 来说只用指定一次也没同样重要的东西,所以它可以不折行直接放在 android { 后,目的是体现它与这块定义的关联性。
再如,minSdkVersion 和 targetSdkVersion 不是一个区间范围(没有说高于 targetSdkVersion 不能用的),但可以认为它们应该被写在一行内,不会引起歧义也并不莫名其妙。
versionCode 和 versionName 也是一样的。
偶尔该加的分号要加,这点和『优雅的顺序』思想是一致的。
这样,他们在基于行号的VCS里如果改一个记录会显示只有一行的变动,不过相信没人会必要这个吧。

然后是要有抽提的逻辑,比如,我们这里有一个Android活动:(不要喷,只是个例子而已,另外错了请不失风度地指出,谢谢)

class SomeButtonfulActivity: Activity() {
//KotterKnife
val btn0: Button by bindView(R.id.main.btn_0)
val btn1: Button by bindView(R.id.main.btn_1)
val btn2: Button by bindView(R.id.main.btn_2)
override fun onCreate(savedState: Bundle) {
super.onCreate(savedState)
//no-op ...?
btn0.onClickListener = {_ -> toast("wtf")}
btn1.onClickListener = {_ -> toast("wttf")}
btn2.onClickListener = {_ -> toast("wtttf")}
}
}

我们就不说 Activity 本身可继承、可抽提这件事了(可以对其中 onCreate, onResume 的逻辑等各另加组合,抽象出简单适体一点的版本给子类实现)
我们也不说其实 Activity 用 Intent 模型虽然是不得以(因为建模如此,而且语言层面也不好做什么)导致但不好看的问题了(理论上更优雅的Activity应该是带架构器参数而不是动态取参数的,否则也不该是类的形式,单实例就够了)

我们也不说 Kotter Knife 没有用 Annottion Processor 以及 Kotlin 的 first class delegates (delegated properties) 的事了。
我们也不说其实 onClick= 完全可以写在 init{} 里这件事,没必要覆盖 onCreate 这件事了……
我们也不考虑 onCreate 和其它 lifecycle event 比如 onResume 有啥区别了……
我们也不谈 Qt 的 signal/slot、.NET 的 event、Android 的传统 Listener 什么的有啥异同。

这里说说上面的一大堆 btnx.onClick { _ -> toast("...") } 怎么抽提
以前辣鸡Jawa弄得什么 anonymous subclass instance,害得那时候又年轻又阳光又帅气的我都看不懂那些代码,嘤嘤嘤。
相信写了很久Java但是不知道 new XXX() {@Override...} 啥意思的人不止我一个,以致于后来换Java8了,很多Android开发者依然不知lambda为何物。另外一些开发者则出于某些媒体拙劣的宣传把虚拟机的invokedynamic扩展和lambda挂钩了,根本不去注意一下Java8的代码dexer出来带RuntimeDesugar(其实Java8的()->也的确是sugar)。

一句话:
val buttons = listOf(btn0, btn1, btn2)
val texts = "wtf wttf wtttf".split(" ")
for ((btn, text) in buttons.zipWith(texts)) btn.
onClickListener
= { _ -> toast(text) }

稍微有点常识的人不难看出,里面那个 { _ -> } 的闭包依赖 for 里面某次的 text 数据引用。
对这里的闭包关键的一点是:for 有多少次迭代就有多少 { _ -> ...text... } 产生,所以说偶尔闭包其实也不能那么『直观』地看尽管它本身设计目的之一就是为了直观(其实也没有……)。

然后 Kotlin 的 single abstract method interface @FunctionalInterface 实现就不用说了
然后有些东西我也不懂

另:试试多加许多的 Button 然后动态创建(不是说用Anko)
typealias Consumer<T> = (T) -> Unit
Map<String, Consumer<User>>
怎么样?其实动态创建还是动态注册监听差不多。


最后的最后我想说一个问题,当然是我之前的一次误解 #web #JavaScript #fix

function fixedRateSchedule(time_ms, op) {
op(); setTimeout(() => fixedRateSchedule(time_ms, op), time_ms);
//也可以直接用 Function.prototype.bind
//语义上我们创建了一个依赖它上次调用的参数(是全等)引用的 fixedRateSchedule 闭包,实际上是不是新闭包可以自己用 (===) 判断。
}

你们说这个函数有没有『递归(recurse)』?
它有没有调用自己?答案是没调用自己,只是它做的操作引用到了自己而已。

递归的情况栈深度是除『基线』外每层调用往上涨的,非递归情况不变或者下降。

setTimeout 哪怕是timeout=0,也只可能在当前
fixedRateSchedule
实例的栈帧弹出(返回)后执行(要不然就不叫timer了),所以栈深度不变,没有递归。
(当然这不是递归最根本的特征,我只是详细说一个侧面的特征方便学习研究之用而已)

好吧这也不一定,尽管JavaScript是很单线程的语言,timeout=0 的具体情况也是看是否能抢断当前执行子程序的执行权而定的,这里假设timer需要等待应用程序的逻辑没在执行,而是回到底层的运行时库在维护工作状态时才能工作。
接下来准备弄Binarie…… 🤔
弄完我把这周学校里的绝句设计笔记拿来抄抄。

ParserKt 明天再和新的计算器一起写