其实我把 Binarie 的类图都画好了,难点也的 swapIntegral, fromIntegral, toIntegral 也整理到 Convert.kt 里了,可就是没时间实现了,算。
其实 ParserKt 也一样,我完全建模好了 Input 和 Parser(以及 PredicateParser:AtomParser, ReduceParser, Seq, Repeat、OrParser) 架构,可就是没时间实现…… 也是天注定吧。
其实 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翻译目标专属的。
啊好累啊,会不会是绝句的文档写起来麻烦……
此外还有好多应该定义的,
Annotation 注解,这个只是个标记
Comparable 有序<入T>
算符 求序(另:T):序
例物 序 { 大、小、等 }
还有算符 component1-5
有许多组一 组空 组全空
当然,它可以这样调用,我还没设计 spread 语法……
CharSequnece 字符序列:可度
Annotation 里的也可以
Closeable 可关闭
Throwable 可抛下
Serializable 可化串
Pair 元二
Triple 元三
String 文
Nothing 断止
Unit 效果
Version 绝句.核心库版本
Function<in T, out R>
例物 并发安全 { 安全、实例一致、不安全 }
Exception 错误 (
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
大概就是这么说:
我不会……
PublishedApi 事实开放
OptionalExpectation 可无实际
ParameterName 默认名
试着定义一些绝句的核心类型,至于绝句如何翻译至多门语言…… 只当下面是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>靠着 Scope<T> 上的 yield(T) 就能够推断出 Scope 的类型
val seq = sequence { yield(1) }
我不会……
PublishedApi 事实开放
OptionalExpectation 可无实际
ParameterName 默认名
Kotlin
kotlin - Kotlin Programming Language
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右移「右移」
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>不多了。
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好了
也是,绝句设计其实现在没啥时间的,还能指望什么有价值,文法上做点好东西就行了,其实类型系统本来不想的话也不必定义的。
Kotlin已经这么完善,直接翻译到Kotlin好了
inline class Result<out T> : Serializable靠,我自己之前设计出内联类啊……Kotlin里现在也有了(虽然它早都有了,呵呵)
内联类什么的还是绝句编译器自己实现吧,免得要开Experimental以及语义差别。
对何<出值>皆有
内联物 结果:可化串……
我觉得还是苦它一点,先做成一个直接的翻译器吧…… 反正项目结构简直是和 Kotlin Van 全一致啊……
除了包命名空间的解析还是要自己做(记法的依赖),好像都没啥可说的了。
其实PKNF的形式化定义早就写出来了,而且PKNF语法本身就是上下文相关的(现在定义写在纸面上),所以说就语法而谈技术上是不存在难题。无论是『汉语编程』、自定义中缀、Layout布局、逗号表示法、汉字数值……
所以绝句应该在现在就可以开始整理语言和核心库设计了,不过在那之前我必须先把那个 Sakura 扩展lambda演算计算器的一部分弄出来,然后拿 ParserKt 尝试解决中文数值、自定义infix、布局文法的问题。(为了弄一个能被快速实现的『脚本语言』我之前有刻意简化Sakura呢,所以等这个叫Sakura的脚本语言发布之前会有一个语法比较类似的玩具能够测试各种东西)
除了包命名空间的解析还是要自己做(记法的依赖),好像都没啥可说的了。
其实PKNF的形式化定义早就写出来了,而且PKNF语法本身就是上下文相关的(现在定义写在纸面上),所以说就语法而谈技术上是不存在难题。无论是『汉语编程』、自定义中缀、Layout布局、逗号表示法、汉字数值……
所以绝句应该在现在就可以开始整理语言和核心库设计了,不过在那之前我必须先把那个 Sakura 扩展lambda演算计算器的一部分弄出来,然后拿 ParserKt 尝试解决中文数值、自定义infix、布局文法的问题。(为了弄一个能被快速实现的『脚本语言』我之前有刻意简化Sakura呢,所以等这个叫Sakura的脚本语言发布之前会有一个语法比较类似的玩具能够测试各种东西)
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
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))
f: a -> b to forall a b. f: a -> b
负片夜间模式(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
比方说:
还有,input 本身可能有状态,在控制流图(CFG, Control Flow Graph)和计算、副作用的产生中可能有怎么样的变化,必须清楚。
最基本的:给你一个 val c,你要知道求出它需要依赖什么数据,如果有些断言要做,你得知道哪些情况叫『正常程序状态』『正常代码路径/程序路径』有哪些则是可能错误的。
另外,要知道一些东西不能太注意刻板的风格,要更加在意可读性。
比如,像 Android Gradle 插件里的
首先我们知道
再如,minSdkVersion 和 targetSdkVersion 不是一个区间范围(没有说高于 targetSdkVersion 不能用的),但可以认为它们应该被写在一行内,不会引起歧义也并不莫名其妙。
versionCode 和 versionName 也是一样的。
偶尔该加的分号要加,这点和『优雅的顺序』思想是一致的。
这样,他们在基于行号的VCS里如果改一个记录会显示只有一行的变动,不过相信没人会必要这个吧。
然后是要有抽提的逻辑,比如,我们这里有一个Android活动:(不要喷,只是个例子而已,另外错了请不失风度地指出,谢谢)
我们也不说其实 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 什么的有啥异同。
这里说说上面的一大堆
以前辣鸡Jawa弄得什么 anonymous subclass instance,害得那时候又年轻又阳光又帅气的我都看不懂那些代码,嘤嘤嘤。
相信写了很久Java但是不知道
一句话:
val buttons = listOf(btn0, btn1, btn2)
val texts = "wtf wttf wtttf".split(" ")
for ((btn, text) in buttons.zipWith(texts)) btn.
稍微有点常识的人不难看出,里面那个 { _ -> } 的闭包依赖 for 里面某次的 text 数据引用。
对这里的闭包关键的一点是:for 有多少次迭代就有多少 { _ -> ...text... } 产生,所以说偶尔闭包其实也不能那么『直观』地看尽管它本身设计目的之一就是为了直观(其实也没有……)。
然后 Kotlin 的 single abstract method interface
然后有些东西我也不懂
另:试试多加许多的 Button 然后动态创建(不是说用Anko)
最后的最后我想说一个问题,当然是我之前的一次误解 #web #JavaScript #fix
它有没有调用自己?答案是没调用自己,只是它做的操作引用到了自己而已。
递归的情况栈深度是除『基线』外每层调用往上涨的,非递归情况不变或者下降。
setTimeout 哪怕是timeout=0,也只可能在当前
(当然这不是递归最根本的特征,我只是详细说一个侧面的特征方便学习研究之用而已)
好吧这也不一定,尽管JavaScript是很单线程的语言,timeout=0 的具体情况也是看是否能抢断当前执行子程序的执行权而定的,这里假设timer需要等待应用程序的逻辑没在执行,而是回到底层的运行时库在维护工作状态时才能工作。
比方说:
import java.lang.System.`in` as stdin这就要求你有看出这个 c「偶尔」需要依赖 input 的(对象状态)意思。
val input = Scanner(stdin)
val a = 1
val c = a + if (p) a else input.nextInt()
还有,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 明天再和新的计算器一起写
弄完我把这周学校里的绝句设计笔记拿来抄抄。
ParserKt 明天再和新的计算器一起写
duangsuse::Echo
https://github.com/graninas/software-design-in-haskell
Haskell 拿来设计real-world大材小用了,何况我估计也没人会拿它做那事🤔emmmm
呵呵呵呵呵呵…… 忍不住想到会不会 Monad Activity 什么的,真是令人困惑呢。
呵呵呵呵呵呵…… 忍不住想到会不会 Monad Activity 什么的,真是令人困惑呢。
Scala 的特性也很高级,有各种 implicit 还多态还 case pattern matching,可是做工程也是没几个人用,估计是被人嫌太复杂
Kotlin 在 Java..Scala 是折中的,既做好语法设计,也不过分简单,还不太难学。
Kotlin 在 Java..Scala 是折中的,既做好语法设计,也不过分简单,还不太难学。
duangsuse::Echo
然后看看一些基本的算符…… 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:…
abstract class EnumMap<K, EV>(private val map: Map<K, EV>): Map<K, EV> by map {
constructor(values: Iterable<EV>, key: (EV) -> K): this(values.map { key(it) to it }.toMap())
}
inline fun <K, reified EV: Enum<EV>> EnumMap(noinline key: (EV) -> K) = EnumMap(enumValues<EV>().asIterable(), key)
// f**k 不行啊
enum class Abc123(private val digit) {
A(1), B(2), C(3);
companion object: EnumMap<Int, Abc123>(Abc123::digit)
}
艹,忘记reified只能用于内联函数上了从学校带来的一张被作为草稿的卷子直接打上来的:
做梦一般又默写了一遍,反正我是想的 sourceSets, compileOptions, kotlinOptions 都是为了支持Kotlin+默认JDK 8然后居然就记住了,莫名其妙地。
//setting.gradle
rootProject.name = 'projectName'
include ':subName'
//build.gradle
buildscript {
ext {
kotlin = 'org.jetbrains.kotlin:kotlin'
adtVersion = '3.2.1'
kotlinVersion = '1.3.41'
}
repositories { jcenter(); google() }
dependencies {
classpath("com.android.build:gradle-build-tools:$adtVersion")
classpath("$kotlin-gradle-plugin:$kotlinVersion")
}
}
allprojects {
repositories { jcenter(); google() }
}
apply plugin: 'com.andriod.application' //|library
apply plugin: 'kotlin-android'
dependencies {
implementation("$kotlin-stdlib-jdk8:$kotlinVersion")
}
android { compileSdkVersion(25)
defaultConfig {
applicationId("com.example")
minSdkVersion(9); targetSdkVersion(26)
versionCode(1); versionName("1.0")
}
buildTypes {
def proguardDefault = getDefaultProguradFiles("progurad-rules.pro")
release { minifyEnabled(true); proguardFiles(proguardDefault) }
}
sourceSets {
main.java.srcDirs += "src/main/kotlin"
}
compileOptions {
def Java8 = JavaVersions.JAVA_1_8
sourceCompatiblity = Java8
targetCompatiblity = Java8
}
kotlinOptions {
jvmTarget = "1.8"
}
} 做梦一般又默写了一遍,反正我是想的 sourceSets, compileOptions, kotlinOptions 都是为了支持Kotlin+默认JDK 8然后居然就记住了,莫名其妙地。
import java.nio.ByteOrder as NioByteOrder
typealias Cnt = Int
typealias Idx = Int
typealias IdxRange = IntRange
typealias Buffer = ByteArray
infix fun IdxRange.untilSize(size: Cnt): IdxRange = this until (this+size) //0 until (0+10): 0..9
inline val IdxRange.size: Cnt get() = (last - first).inc() //0..0: (0-0)+1
typealias Nat8 = Int
typealias Nat16 = Int
typealias Char16 = Char
typealias Int8 = Byte
typealias Int16 = Short
typealias Int32 = Byte
typealias Int64 = Byte
typealias Rat32 = Float
typealias Rat64 = Double
interface MarkReset { fun mark() fun reset() }
fun <R> MarkReset.positional(op: Producer<R>): R
fun positionalTask(): Closeable //JVM
interaface ReadControl: MarkReset, Closeable {
val position: Cnt; val estimate: Cnt
fun skip(n: Cnt)
}
override tailrec fun seek(n: LongCnt) {
if (n == 0L) return //EOS
val skipped = this.skip(n)
if (skipped != 0L) seek(n - skipped)
} // for JVM InputStream
override var position: Idx = 0
protected set // for JVM InputStream
interface WriteControl: Flushable, Closeable
interface ByteReader {
fun readByte(): Byte
fun readTo(destination: Buffer, indices: IdxRange)
fun readToFill(destination: Buffer)
fun takeBytes(count: Cnt): Buffer
}
interface ByteWriter {
fun writeByte(b: Byte)
fun writeFrom(source: Buffer, indices: IdxRange)
fun writeAllFrom(source: Buffer)
}
interface DataReader {
fun readNat8():Nat8 fun readNat16():Nat16
fun readChar16():Char16
fun readInt8():Int8 fun readInt16():Int16
fun readInt32():Int32 fun readInt64():Int64
fun readRat32():Rat32 fun readRat64():Rat64
}
interface DataWriter {
fun writeNat8(x:Nat8) fun writeNat16(x:Nat16)
fun writeChar16(x:Char16)
fun writeInt8(x:Int8) fun writeInt16(x:Int16)
fun writeInt32(x:Int32) fun writeInt64(x:Int64)
fun writeRat32(x:Rat32) fun writeRat64(x:Rat64)
}
enum class ByteOrder { LittleEndian, BigEndian }
interface ByteOrdered { var byteOrder: ByteOrder }
fun systemOrder(): ByteOrder = when (NioByteOrder.nativeOrder()) {
NioByteOrder.LITTLE_ENDIAN -> ByteOrder.Little
NioByteOrder.Big_ENDIAN -> ByteOrder.Big
}
abstract class BaseDataReader(private val sourceOrder: ByteOrder): ByteOrdered, DataReader {
protected val shouldSwap get() = byteOrder != sourceOrder
}
interface Reader: DataReader, ByteReader, ReadControl, ByterOrdered
interface Writer: DataWriter, ByteWriter, WriteControl, ByterOrdered