Forwarded from Deleted Account
如果你对自制语言感兴趣的话,可以看看我那三个
https://duangsuse-valid-projects.github.io/Share/Others/essay-kotlin-parser
https://github.com/duangsuse-valid-projects/jison/blob/master/src/commonMain/kotlin/org/jison/JsonParser.kt
https://github.com/duangsuse-valid-projects/Share/blob/master/%E5%AF%B9drakeet%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AF%9D/DefLang/DefLang.js
很快你就会发现自己的语言可能会有写错但因为它本身没被形式化,所以找不出来的问题比较多了。
缩排很好,不过写起来有点麻烦,解析器只需要加一个
不过恕我直言你现在想写应该有点困难,还是先写个 JSON 解析器练手吧。
https://duangsuse-valid-projects.github.io/Share/Others/essay-kotlin-parser
https://github.com/duangsuse-valid-projects/jison/blob/master/src/commonMain/kotlin/org/jison/JsonParser.kt
https://github.com/duangsuse-valid-projects/Share/blob/master/%E5%AF%B9drakeet%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AF%9D/DefLang/DefLang.js
很快你就会发现自己的语言可能会有写错但因为它本身没被形式化,所以找不出来的问题比较多了。
缩排很好,不过写起来有点麻烦,解析器只需要加一个
layoutSpaceCountStack 就可以了,每层一个 layoutSpaceCount。不过恕我直言你现在想写应该有点困难,还是先写个 JSON 解析器练手吧。
Share
看完这段 Kotlin 代码后我哭了
🐕 duangsuse’s shared files(e.g. productive software projects, documents)
Forwarded from Deleted Account
关键是,有些东西比较容易眼高手低
理论很重要,但实践指导理论往往更重要,因为理论经常有瑕疵,必须靠实践去打磨、靠测试去验证
所以说简单列一下数据结构就可以了,重要的还是写出来,写不出来就继续往底层抽象,抽象到对接 Browser、Node、Filesystem 和底层框架的 API 为止。
理论很重要,但实践指导理论往往更重要,因为理论经常有瑕疵,必须靠实践去打磨、靠测试去验证
所以说简单列一下数据结构就可以了,重要的还是写出来,写不出来就继续往底层抽象,抽象到对接 Browser、Node、Filesystem 和底层框架的 API 为止。
Forwarded from Deleted Account
两年前以来我写的 Specification 可以认为是比你多了,甚至我还弄出了 GeekSpec
可是我也没实际得到什么,所以说,Specification,够用就行,没必要太重视。就像有些 Java 程序员喜欢吹设计模式和 UML,其实吹到头了什么都没有,就像 Eclipse 一样,十年如一日。
这个应用,我花了六个小时才写出来,但设计的时候我就想了一个
对应到 Android 上 input, textarea 就是 EditText、button 就是 Button,table 我不知道,反正知道了写出来就可以,实践会慢慢往上堆…… 不对,不能堆,要经常简化和归纳。
可是我也没实际得到什么,所以说,Specification,够用就行,没必要太重视。就像有些 Java 程序员喜欢吹设计模式和 UML,其实吹到头了什么都没有,就像 Eclipse 一样,十年如一日。
这个应用,我花了六个小时才写出来,但设计的时候我就想了一个
data class Record(val place: String, val name: String, val status: Boolean)
Map<PlaceId, Map<StudentID, Boolean>>
至于 findIn(place, name), findAllIn(place), runSubmit(data) 上面的 CRUD 操作(虽然我不太喜欢这个名词)都是后来动手的时候想的,我只需总结一下用到的 tag 有 <input placeholder value> <textarea> <button onclick> <table> <thead> <tbody> <tr> <td> 就好了,对应到 Android 上 input, textarea 就是 EditText、button 就是 Button,table 我不知道,反正知道了写出来就可以,实践会慢慢往上堆…… 不对,不能堆,要经常简化和归纳。
GitHub
duangsuse-valid-projects/GeekApk
GeekApk, the dying SpringBoot(a.k.a. Sping initializr) server for GeekApk(a.k.a 极安) (R - duangsuse-valid-projects/GeekApk
Forwarded from Deleted Account
代码复用也是很重要的,我讲不清楚,这两张图可以拿作例子。
导入导出数据的操作,也是由
没有魔法,就是 JavaScript ES6 而已。
runRefresh 渲染视图,用的是很 legacy 的方法,但我加了两个函数看起来就好很多了(第二幅 49 行)导入导出数据的操作,也是由
enableDataConvert 函数执行的,假设我要再支持导入导出 YAML 也很简单,只需要在对这个函数的调用里加行代码就够了,而不是改完 HTML 再加 onclick listener没有魔法,就是 JavaScript ES6 而已。
Forwarded from Deleted Account
这是谁滥用权限设计比较开放
越过我加的验证码,三秒钟就给删完了
就是批评我的验证码不够有用也不必这么搞吧 过分了
越过我加的验证码,三秒钟就给删完了
就是批评我的验证码不够有用也不必这么搞吧 过分了
Forwarded from Deleted Account
这么一看『很久很久以前』是在 2019 年 1 月左右
那年 7 月放的暑假,
熬夜记得是一个暑假熬的,之后又弄了几次…… 我都记不清了
这么说也是坚持锻炼蛮长的时间,直到 2019 年 7 月一直熬夜……
记得那时候一个月经常是两三四点不睡 也不长痘 不觉得胸闷 不觉得困
想起来也是怪可怜的 😢
最后一段时间这种情况一直连了一个星期,而且熬夜居然都是刷 Telegram…… 之后锻炼就少了
现在基本和最开始的时候没太大区别
所以说沉迷知乎也不要沉迷 Telegram…… 😂 #life #school
https://t.me/dsuse/9602 那段时间的消息
那年 7 月放的暑假,
熬夜记得是一个暑假熬的,之后又弄了几次…… 我都记不清了
这么说也是坚持锻炼蛮长的时间,直到 2019 年 7 月一直熬夜……
记得那时候一个月经常是两三四点不睡 也不长痘 不觉得胸闷 不觉得困
想起来也是怪可怜的 😢
最后一段时间这种情况一直连了一个星期,而且熬夜居然都是刷 Telegram…… 之后锻炼就少了
现在基本和最开始的时候没太大区别
所以说沉迷知乎也不要沉迷 Telegram…… 😂 #life #school
https://t.me/dsuse/9602 那段时间的消息
Telegram
duangsuse::Echo
目前回家自学半年时间,使用PHP+MySQL初步搭建了一个简易新闻网站
我当时就喷了,自学半年才这个三脚猫水
平,也不知道这位同学工程到了个什么程度呢,是测试套件写了几万行呢还是自己设计了什么不得了的框架和去繁复的方案呢、还是写出了个不得了的 Web 应用呢,还是使用了最新的框架、最新的技术、最新的点子呢,比如,OAuth、RESTFul、灰盒测试、特性测试?还是说有部分是用 C++ 写的呢?还是说你在算法上达到了多么高的造诣?形式化验证程序逻辑?自己写了所有平台的客户端?我现在真的很佩服轮子哥的忍耐能力。要是我一上去就喷...…
我当时就喷了,自学半年才这个三脚猫水
平,也不知道这位同学工程到了个什么程度呢,是测试套件写了几万行呢还是自己设计了什么不得了的框架和去繁复的方案呢、还是写出了个不得了的 Web 应用呢,还是使用了最新的框架、最新的技术、最新的点子呢,比如,OAuth、RESTFul、灰盒测试、特性测试?还是说有部分是用 C++ 写的呢?还是说你在算法上达到了多么高的造诣?形式化验证程序逻辑?自己写了所有平台的客户端?我现在真的很佩服轮子哥的忍耐能力。要是我一上去就喷...…
🤔 我又考虑了下绝句的语言特性
语言层次:常量(literal)、言元(atom expression)、言(expression)、句(statement)、段(block)、构(item)、书(file)
面向对象构件:常(const val)、变(var)、量(val) 取者(getter) 置者(setter)、事(fun)、造于(constructor) 初(init)、例(object)、物(class) 伴生例(companion object)、类(interface)
特化物:扩物、内物(inner class)、储物(data class)、例物(enum class)、况物(sealed class)、标物(annotation class)、抽象物(abstract class)
预定义引用:亲(super)、我(this)、你、它
预定义常量:真、假、空
类型系统:函数重载、子类型多态、参数化多态、入/出 生产消费型变性声明、交集上界限制、可空性、『我属』预定义类型变量
语言特性:面向对象编程、构件可见性、函数及属性扩展、闭包、多态、操作符重载、Annotation
可见性:公开、族内、私下、内部
外部定义:待例、实际
标记:【(类型) {(名=)? (常量/常量组)}、】
函数及属性修饰:抽象、实现、内联、记法 「(记法)」
函数修饰:算符、尾递归
参数修饰:许多、跨嵌、不嵌
变参修饰:晚成
类型参数修饰:实化、入、出
— 定义
包(复合名)为
引(复合名) [的(名)].[成(名)]
引全(复合名) [的].[除(名或行)]
常(类型).(名)=(常量)
属别名(名)=(类型)
对何<(类型形参)> [其中 {(类型参数):(类型)}、] 皆有
事 (名)"(" (形参) ")" 为 …其中块
事 (名)"(" (形参) ")" = (言) …其中块
其中块
其中,{局部定义}
局部定义
(量/变参/事)
顶部定义
(局部定义/常参/例/物/类)
文件
Shell行? 包? {引记法}? {引入}? {文件标记}? {属别名}? {顶部定义}?
注意这里那个 (类型) 啊不是说这个在解析器里就检查,这里 (类型) 全都视为 (复合名)。
— 缩进和文法布局
类似「事」「例」「物」「类」的定义构件,都是使用「为」来限定起止部分的。
绝句里有两个形式开启新布局:「,」及「为」
新布局由它们开启,小于后随布局空格数的缩进结束。
绝句里有可以换行的语法形式:
(缩进)要求比当前布局宽:参数切分「、」和「。」
要求持平当前布局:「;」
— 记法(自定义中及后缀)
引记法(复合名) 「(记法)」
引记法(复合名).除 「(记法)」
定记法 「(记法)」
记法可以包含任何名字本身可以包含的部分,以及符号、数学符号区段的字符。
带
— 基本控制流
—— 变量
量(名)[:(类型)]=(言)
量 提(模式)=(言)
变(类型).(名) [初(言)]
变参(名)[:(类型)] [初(言)]
—— 判断
若(你?) (言)…… [ 否则…… ] (第二人称)
判断,{ (言或列)…… } [ 否则…… ]
判(你?) (言),{ (言或列)…… } [ 否则…… ] (第二人称)
判(你?) (言)属,{ 于(类型或列)…… } [ 否则…… ] (第二人称)
判(你?) (言)存,{ 于(言或列)…… } [ 否则…… ] (第二人称)
—— 重复
对(言)里的(名)……
对(言)里的 提(模式)……
对(言)里的 你…… (第二人称)
对(言)里的…… (第三人称)
重复 若(言)……
重复…… 若(言)。
—— 返回
回(标签?) (言?)
回 交(言)
回 重写(参数列表)
—— 跳转
停下(标签?)
略过(标签?)
— 结构化异常
尝试…… { 接迎(类型)…… } [ 终焉…… ] (第三人称)
抛下(言)
— 中缀链
「它 (记法及的链)」 (第三人称)
例:「它的名字+1」、「它前」
记法包括中缀记法如「以」和后缀记法「~上面」「~为零」
中及后缀记法有否定修饰,如「是」前跟“不”构成「不是」、「为零」前跟“不”构成「不为零」
「」形式可以在需要函数的地方被提供。
— 中缀简记
你(言) {(且/或) 记法链} (第二人称)
— 逗号表示法
逗号表示法可以用于「若」「判断」这样结构「段」的表达,也可以用于创建闭包。
逗号表示法有两种形式,逗号布局、逗顿句简写。
如果用于闭包则还有一种指定闭包参数的扩展。
— 可空性
(~)? // 空访问
(~)!! // 非空断言
(~)空则(言)
(~)空则……
— 访问语法
(~)的(名)
(~)去(名)(参数列表)
(~)去::(名)
(~)"["(言)"]"
(~)(参数列表)
::(名)
— 前缀
非(言)
— 连接词
且 // (&&)
或 // (||)
是 // (==) 试等
即是 // (===)
存于 // (in) 试含
.. // (..) 取至
(~)属于(类型) // (is)
(~)作成(类型) // (as)
(~)试成(类型) // (as?)
— 数学计算
+ // 加
- // 减
* // 乘
/ // 除
— 标签
「事」及逗号闭包的接收者会引入隐式标签
「对」「重复」后可以在后面加
逗号闭包可以用
— 常量
真假 Boolean
数 Int、长数 Long
— 符号 (+/-)?、后缀 (L/l)?
— 支持 0x 0b 表示法
— 支持汉字数
短浮 Float、浮 Double
— 支持 (+/-)? (E/e)? exponents
— 后缀 (F/f)?
字 Char
文 String
— 支持
— 支持
— 支持
名(标识符)
换 Kotlin 的
注释
— 支持可嵌套
— 保留构词
模板、类实例、性质推导
— 一些非语法细节
to ~ 到;upTo ~ 至;until ~ 止
语言层次:常量(literal)、言元(atom expression)、言(expression)、句(statement)、段(block)、构(item)、书(file)
面向对象构件:常(const val)、变(var)、量(val) 取者(getter) 置者(setter)、事(fun)、造于(constructor) 初(init)、例(object)、物(class) 伴生例(companion object)、类(interface)
特化物:扩物、内物(inner class)、储物(data class)、例物(enum class)、况物(sealed class)、标物(annotation class)、抽象物(abstract class)
预定义引用:亲(super)、我(this)、你、它
预定义常量:真、假、空
类型系统:函数重载、子类型多态、参数化多态、入/出 生产消费型变性声明、交集上界限制、可空性、『我属』预定义类型变量
语言特性:面向对象编程、构件可见性、函数及属性扩展、闭包、多态、操作符重载、Annotation
可见性:公开、族内、私下、内部
外部定义:待例、实际
标记:【(类型) {(名=)? (常量/常量组)}、】
函数及属性修饰:抽象、实现、内联、记法 「(记法)」
函数修饰:算符、尾递归
参数修饰:许多、跨嵌、不嵌
变参修饰:晚成
类型参数修饰:实化、入、出
— 定义
包(复合名)为
引(复合名) [的(名)].[成(名)]
引全(复合名) [的].[除(名或行)]
常(类型).(名)=(常量)
属别名(名)=(类型)
对何<(类型形参)> [其中 {(类型参数):(类型)}、] 皆有
事 (名)"(" (形参) ")" 为 …其中块
事 (名)"(" (形参) ")" = (言) …其中块
其中块
其中,{局部定义}
局部定义
(量/变参/事)
顶部定义
(局部定义/常参/例/物/类)
文件
Shell行? 包? {引记法}? {引入}? {文件标记}? {属别名}? {顶部定义}?
注意这里那个 (类型) 啊不是说这个在解析器里就检查,这里 (类型) 全都视为 (复合名)。
— 缩进和文法布局
类似「事」「例」「物」「类」的定义构件,都是使用「为」来限定起止部分的。
绝句里有两个形式开启新布局:「,」及「为」
新布局由它们开启,小于后随布局空格数的缩进结束。
绝句里有可以换行的语法形式:
(缩进)要求比当前布局宽:参数切分「、」和「。」
要求持平当前布局:「;」
— 记法(自定义中及后缀)
引记法(复合名) 「(记法)」
引记法(复合名).除 「(记法)」
定记法 「(记法)」
记法可以包含任何名字本身可以包含的部分,以及符号、数学符号区段的字符。
带
'~' 前缀的记法是后缀记法— 基本控制流
—— 变量
量(名)[:(类型)]=(言)
量 提(模式)=(言)
变(类型).(名) [初(言)]
若(你?) (言)…… [ 否则…… ] (第二人称)
判断,{ (言或列)…… } [ 否则…… ]
判(你?) (言),{ (言或列)…… } [ 否则…… ] (第二人称)
判(你?) (言)属,{ 于(类型或列)…… } [ 否则…… ] (第二人称)
判(你?) (言)存,{ 于(言或列)…… } [ 否则…… ] (第二人称)
—— 重复
对(言)里的(名)……
对(言)里的 提(模式)……
对(言)里的 你…… (第二人称)
对(言)里的…… (第三人称)
重复 若(言)……
重复…… 若(言)。
—— 返回
回(标签?) (言?)
回 交(言)
回 重写(参数列表)
—— 跳转
停下(标签?)
略过(标签?)
— 结构化异常
尝试…… { 接迎(类型)…… } [ 终焉…… ] (第三人称)
抛下(言)
— 中缀链
「它 (记法及的链)」 (第三人称)
例:「它的名字+1」、「它前」
记法包括中缀记法如「以」和后缀记法「~上面」「~为零」
中及后缀记法有否定修饰,如「是」前跟“不”构成「不是」、「为零」前跟“不”构成「不为零」
「」形式可以在需要函数的地方被提供。
— 中缀简记
你(言) {(且/或) 记法链} (第二人称)
— 逗号表示法
逗号表示法可以用于「若」「判断」这样结构「段」的表达,也可以用于创建闭包。
逗号表示法有两种形式,逗号布局、逗顿句简写。
若此人的名字是"林则徐",这是逗号布局。
说("苟利国家生死以")
若此人的名字是"林则徐",说("民族大义")、说("苟利国家生死以")。
这是逗顿句简写。如果用于闭包则还有一种指定闭包参数的扩展。
人们 映为,〖他〗他的名字。
人们 映为,〖他〗
他的名字
— 可空性
(~)? // 空访问
(~)!! // 非空断言
(~)空则(言)
(~)空则……
— 访问语法
(~)的(名)
(~)去(名)(参数列表)
(~)去::(名)
(~)"["(言)"]"
(~)(参数列表)
::(名)
— 前缀
非(言)
— 连接词
且 // (&&)
或 // (||)
是 // (==) 试等
即是 // (===)
存于 // (in) 试含
.. // (..) 取至
(~)属于(类型) // (is)
(~)作成(类型) // (as)
(~)试成(类型) // (as?)
— 数学计算
+ // 加
- // 减
* // 乘
/ // 除
— 标签
「事」及逗号闭包的接收者会引入隐式标签
「对」「重复」后可以在后面加
[] 引入标签逗号闭包可以用
,[label] 引入标签— 常量
真假 Boolean
数 Int、长数 Long
— 符号 (+/-)?、后缀 (L/l)?
— 支持 0x 0b 表示法
— 支持汉字数
短浮 Float、浮 Double
— 支持 (+/-)? (E/e)? exponents
— 后缀 (F/f)?
字 Char
文 String
— 支持
\"\'\t\b\n\r\$\\ escape— 支持
$(名) 和 ${(言)} 嵌入— 支持
""" """ 跨行文本名(标识符)
换 Kotlin 的
`` 成 『』注释
— 支持可嵌套
“” 全角双引号,‘’ 不可用— 保留构词
模板、类实例、性质推导
— 一些非语法细节
to ~ 到;upTo ~ 至;until ~ 止
/tmp/duangsuse.sock
🤔 我又考虑了下绝句的语言特性 语言层次:常量(literal)、言元(atom expression)、言(expression)、句(statement)、段(block)、构(item)、书(file) 面向对象构件:常(const val)、变(var)、量(val) 取者(getter) 置者(setter)、事(fun)、造于(constructor) 初(init)、例(object)、物(class) 伴生例(companion object)、类(interface) 特化物:扩物、内物(inner…
今天上午,我想了一些语言实现的细节。
1. 绝句的一些语法大体上是那样,但偶尔会有『插入模式』的修改,怎么做这一部分的代码复用
比如,绝句的逗号表示法偶尔会有带 [] 标签的版本和 〖〗 参数的版本、enum class 的布局也要允许在顿号后换行,怎么在兼容这样情况同时进行解析器的代码复用
2. 我说「回」「抛下」「停下」不是表达式,那么
况且绝句的逗号表示法的逗顿句简写,基本上可以认为是等同 Kotlin 的 {} brace block,那么它是否可以有值?是不是应该分出单句和多句的情况?
3. 关于语法实现难点——「,」「为」布局的细节定义和实现方法。
新布局由「,」及「为」开启,小于后随布局空格数的缩进结束,就是不知道哪里可以换行
一般的实现认为缩进 GT 即为「一行内」、EQ 即为「断行」、LT 即为「块结束」,我不打算支持。
🤔我刚才考虑了一下 enum class 的例子,EQ 和 GT 的区分容易导致一些滥用的表达
可是如果用
不过我觉得还是标准化一下比较好,这样吧,参数列表里的顿号也可以开启布局?
……算了还是支持原判吧,缩进比当前布局宽就是「一行内」,顿号后面可以换行。
但目前的解析器方案是 scannerless parsing,我们没有一个分词的阶段来刻意读取判断布局状态
顿号后只能是比当前布局宽的缩进,窄了的话不可以,一个逗号块和「为」块的断句方案也一样,也就是说我们的规则更严格一些,更容易死。
——记法的实现
记法就是自定义中缀、后缀运算符,并且这是不需要空格切分的,它必须动态修改『名』名字的语法以准确分词。
记法的分词,可以用字典树 walk,但我还不太会写那个
动态运算符优先级是比较简单的
1. 绝句的一些语法大体上是那样,但偶尔会有『插入模式』的修改,怎么做这一部分的代码复用
比如,绝句的逗号表示法偶尔会有带 [] 标签的版本和 〖〗 参数的版本、enum class 的布局也要允许在顿号后换行,怎么在兼容这样情况同时进行解析器的代码复用
2. 我说「回」「抛下」「停下」不是表达式,那么
空则,回。 这样的类型检查怎么做?况且绝句的逗号表示法的逗顿句简写,基本上可以认为是等同 Kotlin 的 {} brace block,那么它是否可以有值?是不是应该分出单句和多句的情况?
3. 关于语法实现难点——「,」「为」布局的细节定义和实现方法。
新布局由「,」及「为」开启,小于后随布局空格数的缩进结束,就是不知道哪里可以换行
一般的实现认为缩进 GT 即为「一行内」、EQ 即为「断行」、LT 即为「块结束」,我不打算支持。
🤔我刚才考虑了一下 enum class 的例子,EQ 和 GT 的区分容易导致一些滥用的表达
可是如果用
行一() 来定义一个列表的话,好像不得不支持这种传统的缩进断行方法不过我觉得还是标准化一下比较好,这样吧,参数列表里的顿号也可以开启布局?
……算了还是支持原判吧,缩进比当前布局宽就是「一行内」,顿号后面可以换行。
但目前的解析器方案是 scannerless parsing,我们没有一个分词的阶段来刻意读取判断布局状态
顿号后只能是比当前布局宽的缩进,窄了的话不可以,一个逗号块和「为」块的断句方案也一样,也就是说我们的规则更严格一些,更容易死。
——记法的实现
记法就是自定义中缀、后缀运算符,并且这是不需要空格切分的,它必须动态修改『名』名字的语法以准确分词。
记法的分词,可以用字典树 walk,但我还不太会写那个
动态运算符优先级是比较简单的
secret base ~君がくれたもの~ (10 years after Ver.)
茅野愛衣, 戸松遥, 早見沙織
「secret base ~君がくれたもの~ (10 years after Ver.)」
茅野愛衣, 戸松遥, 早見沙織
茅野愛衣, 戸松遥, 早見沙織
Forwarded from ┗|∵|┓Hz ❁ HoneyWorks
YouTube
15 分鐘內,一次就搞懂「合成器」!(Synthesizer)
好和弦頻道沒有開啟 YouTube 廣告,因此我不會從 YouTube 這邊得到任何收入,如果你覺得好和弦的課程有幫助到你,請你考慮購買「家庭號大包裝」來支持好和弦,讓好和弦能夠繼續提供免費的教學給所有人!到以下的連結喔:
好和弦 220 集紀念版大大大大大大大大大大包裝:https://gum.co/NiceChordBigPack220
好和弦家庭號大包裝(中國大陸):http://www.upchord.cn/downloads/nicechord/
好和弦 Instagram:https://…
好和弦 220 集紀念版大大大大大大大大大大包裝:https://gum.co/NiceChordBigPack220
好和弦家庭號大包裝(中國大陸):http://www.upchord.cn/downloads/nicechord/
好和弦 Instagram:https://…