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
typealias Shift<I> = I.(Cnt) -> Iintegral to sequence of Byte
typealias ByteSelect<I> = I.(I) -> Byte
typealias ByteUnion<I> = I.(Byte) -> I
1234 -> 1,2,3,4kotlin:
^popleft(shl(8*n)&and)
inline fun <I> integralToBytes(n: Cnt, byte_left: Byte,sequence of Byte to integral
crossinline shl: Shift<I>, crossinline and: ByteSelect<I>, i: I): Sequence<Byte> = sequence {
var accumulator = i
for (_t in 1..n) {
yield(accumulator.and(byte_left))
accumulator = accumulator.shl(Byte.SIZE_BITS)
}
}
1,2,3,4 -> 1234:kotlin:
(shl&or...&or)^pushright
1,2,3,4 -> 0(zero: I)
1,2,3,4 -> 0 shl 8 or 1
2,3,4 -> 1 shl 8 or 2
3,4 -> 12 shl 8 or 3
...
inline fun <I> bytesToIntegral(zero: I,rotate byte order
crossinline shl: Shift<I>, crossinline or: ByteUnion<I>, bytes: ByteIterator): I {
var accumulator = zero
for (byte in bytes) {
accumulator = accumulator.shl(Byte.SIZE_BITS).or(byte)
}
return accumulator
}
1 2 3 4 ->(rotate) 4 3 2 1
pop^(shr&and) push^(shl&or) kotlin:
inline fun <I> rotateIntegral(n: Cnt, byte_right: I,
crossinline shr: Shift<I>, crossinline and: ByteSelect<I>,
crossinline shl: Shift<I>, crossinline or: ByteUnion<I>, i: I): I {
var source = i; var rotated = i
for (_t in 1..n) {
val rightmost = source.and(byte_right).also { source = source.shr(Byte.SIZE_BITS) }
rotated = rotated.shl(Byte.SIZE_BITS).or(rightmost)
}
return rotated
}
duangsuse::Echo
typealias Shift<I> = I.(Cnt) -> I typealias ByteSelect<I> = I.(I) -> Byte typealias ByteUnion<I> = I.(Byte) -> I integral to sequence of Byte 1234 -> 1,2,3,4 ^popleft(shl(8*n)&and) kotlin: inline fun <I> integralToBytes(n: Cnt, byte_left: Byte, crossinline…
我想,这可能就是所谓的Literal Programming吧,或者即便不一样、有本质上的区别,也是一样高的代码质量,因为每一个步骤都说得清清楚楚,不带含糊冗余的东西,即便有bug也不需要debug,再看一遍就好了。
那个用 Sequence 是为了表述清楚一点的,实践上我可能害怕 Kotlin 不能给它弄成小体积点的形式…… 所以得换成继承自基于 ByteIterator 的超类。
那个用 Sequence 是为了表述清楚一点的,实践上我可能害怕 Kotlin 不能给它弄成小体积点的形式…… 所以得换成继承自基于 ByteIterator 的超类。