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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo pinned «🤔duangsuse 昨天晚上想到了一些话,愿意分享给大家。 #statement duangsuse(虽然一点也不好)是如何编程的呢? 他编程,是一个从整到零,再从零到整的过程。 首先是把一个相对比较大的目标,拆分成许多能够比较简单实现的小目标。 比如,把一个操作纷繁复杂的类(class),抽提出实现了很多接口的类。 接着是和自己争论实现的难点和复杂性,继续重新拆分和重新组织继承、数据依赖这样的关联,偶尔还会为一些经常联系在一起的东西(比如 Database, Controller) 起一些首字母简写,记住。…»
duangsuse::Echo
我吃饭回家路上考虑了一下 首先为了能够实现 函数,〖x0〗x0。 函数,〖x0〗 x0 这种逗号表示法的形式,这个样子的逗号表示法类似: 逗号块(逗号修饰, 体)…… 同时,我也终于决定抛弃了逗号表示法的 {} 替换: 若p { op0() } 否则 { op1() } “不允许。” 毕竟绝句不需要像 Haskell 那样 \case ox (Some x) -> 切换布局块和非布局块版本的语法,逗号表示法「,、。」是比较简单的。 现在这个开闭符号是『reserved』了。 然后,绝句也可以利…
本来不该就这么快结束的,可我觉得思路和细节已经基本在我上面写的例子里显示出来了(比如量『a』=1;变文『s』这种不带空格的类词法解析定义),所以我觉得还是继续写我的 e2im-2、Binarie、ParserKt 吧……


嗯……其实不对,我还有许多设计笔记没有发的,而且最重要的中缀操作符、优先级,我都没任何定义。
下次吧,毕竟一时半会也实现不了。
Forwarded from 布丁 包
@duangsuse 话说最近那个文言语言是你的嘛?
Forwarded from dnaugsuz
那不是文言啊,那是现代文。每次我去学校的时候偶尔会有机会设计一下,目前也就完善了两次(第二次还没发上网)

最近我有 Kotlin Multiplatform 二进制序列化组合子库 Binarie 和解析组合子库 ParserKt 要写,暂时没时间实现它

因为绝句程序设计语言依赖很多上下文相关的语法(主要是实现『布局』语义特性的,比如逗号表示法、「为」文法,那是必须的。)
所以我绝对不能使用一些比较老式的解析器实现方式,比如ANTLR来实现它。

也只能慢慢看喽,何时有了 ParserKt,我打算先弄个 prototype(原型) 翻译到Kotlin。至于 1.0 的语言特性我得先实现另外一门「脚本语言」再考虑。

如果你感兴趣可以来看看之前的一些设计笔记,不算太严谨。
#zhihu https://zhuanlan.zhihu.com/p/91353256

https://t.me/dsuset/6816; https://t.me/dsuse/12085 @吴烜 你说的大概上没有问题,可略微有点无力,如果不嫌长的话可以看看我的。如果你想了解关于布局文法上下文相关解析(也可以在分词的阶段做)或可动态扩展中缀链解析(infix subparser)或汉字数值解析和格式化输出的内容我可以帮说几句,上面的链接可能要科学地上网才能访问。


我觉得没有必要呀。
编程,其实是符号编程,比如汇编,就是明显的符号。
后来高级语言了,使用有语义的符号。
比如if,for,case
其实他们还是符合.。
查查英文字典,case是啥意思,和代码里的case有关系吗?
英文更适合表示符号。
中文不适合“符号”这种表达方式。
再来看命名。
这个看项目。
以前做过一个工程车辆的销售项目,他们有n多表格,表格都要做到数据库里面。
那么字段名就直接用表格里的名字好了。
(有点表格是中文,有点表格是英文,有的表格是中英文双语的。)
于是用英文还是中文,就是一件很自然的事情了,没必要强求,也没必要强推。

"case this object of" 在 Google Translate 里是『案此对象(为)』的意思。

我们所有有点英文语感的人都会觉得它是『判此对象为』,案『情况(case)』处理的意思。


难道存但仅存一点点语义上的关系就不叫关系?照这个逻辑类似 ES6 的 let { name: its_name } = obj; Python 的 ''.join([1,2,3]) 这样罕见的颠倒情况(很不好找,因为英文中文语序的确区别很大,英文时基本不会让人觉得和自然语言区别很大)本该再多加设计、等号也不该分长等号赋值和短等号判定了。


而 for (name in iterable) 这个算是直接对应了吧?为什么中文就不能用非『符号』的表达形式 对iterable里的name……?语言不是符号?


至于强推什么的,其实哪怕是之前 5kw 的易语言我也没见人迫害 521,『中文编程』一直以来都是很克制的。(当然,也是很少有人愿意观看的)


中文命名不需要驼峰命名: https://zhuanlan.zhihu.com/p/40098652

在有类型声明的代码中, 类型前缀并不建议使用. 一定要的话, 中文前缀照样可以.

连字符, 与驼峰同理.

看到的中文命名实例中, 命名风格大同小异. 母语同是中文, 用词风格趋同只是时间问题. 还是那句话, 路是走出来的, 规范更是实践中形成的.

是的,比如最经典的 "abc".startsWith("a"),要在中文的思维方式里自然地表达出来就得使用「以」这个介词来连接两个对象。

如果这一点设计好了(比如 Z语言的序列式函数应用,比如 "abc"以("a")始()),绝对是不需要驼峰英文分词的。

否则的话 "abc".以始("a")或者好一点,"abc".开头为("a") 这种,那只能说是暴殄天物了,好歹也是所谓『夜鬼哭』的汉字啊。


命名规范怎么考虑中文呀。
中文没有大小写,那么什么驼峰了啥的完全用不上。
类型前缀(比如intAge)也没法弄前缀。
vue里面的连字符,比如v-if,my-form,的-也,对于中文来说这个减号也没用。
总之,基本没法用。

>v-if,my-form


那个 '-' 不叫减号,这里是破折号(dash)的意思,详情 Scheme 命名风格。

比如:

scheme

(define (histogram vector-of-words)
(define hash (make-hash))
(for ([word (in-vector vector-of-words)])
(hash-set! hash word (add1 (hash-ref hash word 0))))
hash)


好吧,你开心就好。另外听过无代码吗?

无代码nocode 是一些 别有用心 的前端们的笑话,没有啥实际效用。


只要人活着就得吃饭,它试图否定目标的价值(比如,活着。)而没有任何理由,然后提醒你只要不活了就可以不吃饭,当然只是个笑话啊。


我赌五毛弄出这个项目的前端不知道 JSON 形式化文法是啥子。
引记法 绝句.符号 「与」
引记法 绝句.符号 「止」
引记法 绝句.符号 「步长」

量 人物类型 = 表一("唐僧"对"人"、"孙悟空"对"猴")
解对人物类型里的(人、型),说("$型 $人")。

“人 唐僧”
“猴 孙悟空”

量 人物 = 行一("唐僧"、"孙悟空"、"猪八戒"、"沙僧")
解对人物与索引里的(人、引),说("$引 $人")。 “记法「与」的事 与索引……”

“0 唐僧”
“1 孙悟空”
“2 猪八戒”
“3 沙僧”

量 问题 = 行一("名字"、"追求"、"喜爱颜色")
量 答案 = 行一("玄奘"、"真经"、空)

解对问题与(答案)里的(问物、回复), “对何<另项>皆有事 「与」(另:可迭<另项>:可迭<元二<项、另项>>)”
说("你的${问物}是什么?答曰,${回复}")

对零止10步长2里的,说(它)。


“with open(file) as f: f.close()”
尝试文件(径)去开启()成书,书去写文("emmm")。
接迎打开失败不常,告警("emmmmm: $径")。
“终焉,书去关闭()。”

对何<项> 项:有序<项> 皆有
事 冒泡排序(动片:动切片<项>) 为
对动片的索引里的『某针』,
对(某针后..动片的末引)里的『此试』,
若动片[此试]小动片[某针],动片去交换(此试、某针)。
对何<项>皆有
扩物 动切片<项> 为
事 交换(甲:引数、乙:引数) 为
我[甲] = 我[乙];我[乙] = 老甲
其中,
量 老甲 = 我[甲]


例 『某易语言而不是易飞扬程序』: 应用程序() “还有『带参应用程序』” 为
实现的事 入口() 为
量 a = 听去数一()
量 b = 听去数一()
若a大b,交换(a、b)。“假设这是1.0,绝句有存储抽象”
a定「不大b」
说("$a $b") “绝句可没有啥『调试说』”
回效果 “当然是不必显式写出来的”

def 妖精(能耐, 名字='白骨精', 降服者='孙悟空', 原形='骷髅'):
print("尽管善于" + 能耐 + ", "
+ 名字 + "仍被" + 降服者 + "制服,"
+ " 变回" + 原形)

事 说妖精(妖精:文、原型:文、能耐:文、降服者:文) 为
说("尽管善于${能耐},${妖精名}仍被${降服者}制服,变回${原型}")
例 西游记: 应用程序() 为
实现的事 入口() = 说妖精("白骨精"、"白骨"、能耐="变化"、降服者="孙悟空")
“绝句暂时不打算支持 partial application”
量 说白骨精:(文)效果 = 函数,〖能耐〗说妖精("白骨精"、"白骨"、能耐、降服者="孙悟空")。

看来设计类型推导方法是个苦差事啊,学术派一点要用 unification 归一化,而且逻辑式 miniKanren 好像不也是用 unification state&goals?
看来多态推导有点麻烦…… 大概还是写的出吧。

“Java:”
“if (true) { System.out.println("OK"); }”
“「易」语言:”
“如果 真 那么打印"OK"结束如果”
若真,说("OK")。
若组件[i]之为已创建,组件[i]去销毁()。
若你组件[i]之为已创建,你去销毁()。 -- 不能这样!改回

“我这时觉得绝句真的是美得像天使一样,干净利落不带空白,和没有逗号表示法的语言比。”

记法,是绝句里为了拟自然语言加入的自定义介词。
一般来讲,它的处理过程不必多加空格,所以词法类似+-*/等符号,必须在标识符读取过程里时刻检查,往往会用动态 Trie 树进行这种解析。

定记法 「问」
引记法 绝句.额联 藏「对」
引记法 绝句.额联 藏「+」 “尽管这可能是绝句语法上的华点之一,它们不特殊、所有和语法结构无关的东西(那些东西一般都是全角或中文词)都不特殊。”



包 绝句.标量
定记法「+」
定记法「-」
“……”

物『数』 为
“……”
【内建】【名字合法化】待例、记法「+」的事『+』(另:数):数
“这时,尽管+已经是一种记法,它依然可以被『』括住作为名字的一部分甚至全部,而在符号解析过程中这是有效的。”
“『』形式的名字不被称为合法化,只是叫『角括号名字』而已,合法化的意思是即便它对目标语言不合法,也自动mangle这个name而不是报错。”


但是以上好像是在朝着Scala的方向走,原因仅仅是为了支持标准库怎么这么地(而且大家都不知道『数』是不是该在标准库定义一个),实在是必须多想想。
而且这样,「算符」这个修饰,还有1去加(2)这种用法就泡汤了,运算符优先级实现也本不是记法会考虑的事情,那如何呢……

定义基于中缀记法的事(当然必须是中缀单参数的方法「」啊,噢不,介于「之为」这样的记法导致的问题它也可以记「量」)时候,可以选择:
记法「之」的事 之存一(条件:命题<项>):真假
其中『之存一』这个函数名必须以中缀字面开头。或者,
记法「对」的事 对(另:项):元二<项、项>
绝句里,「~上」这种后缀记法只允许使用「的」访问的属性使用。
记法「~上」的量 上面:位置

绝句没有Kolin的infix关键字,就是因为它用的是不必加空格的记法系统,虽然这个方式的结合性、优先级也基本是没改。

解析的结果是记法(也就是「的」「去」的替换符)的字面形式(比如他对她他上里,「对」和后缀的「~上」)
基本可以说是等价 他去对(她)他的上
语言类型分析过后,就有机会找到前表达式base对应的记法定义,进行进一步的处理。

记法访问(左表达式、记法名、右表达式)
“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
量 显式小数:实数 = 70.0 “小数点不能去!”

“let 标签 = "宽度为"
let 宽度 = 94
let 宽度标签 = 标签 + String(宽度)”
量 标签 = "宽度为"
量 宽度 = 94
量 宽度标签 = 标签去接(宽度去化文())

“let 苹果 = 3
let 桔子 = 5
let 苹果小结 = "我有\(苹果)个苹果."
let 水果小结 = "我有\(苹果 + 桔子)个水果." ”
解量 (苹果、桔子) = 元二(3、5)
量苹果小结="我有${苹果}个苹果"
量水果小结="我有${苹果+桔子}个水果"

“let 引用 = """
我说"我有\(苹果)个苹果."
我又说"我有\(苹果 + 桔子)个水果."
""" ”
量 引用 = """ 为
我说"我有${苹果}个苹果."
我又说"我有${苹果 + 桔子}个水果."

“var 购物单 = ["鱼", "水", "花"]
购物单[1] = "瓶水" ”
量购物单=动行一("鱼"、"水"、"花")
购物单[1] = "瓶水"

“var 职位 = [
"小二": "船长",
"小王": "机械师",
]
职位["小刘"] = "公关" ”
量 职位 = 动表一("小二"对"船长"、"小王"对"机械师")
职位["小王"] = "公关"

“购物单.append("颜料")
print(购物单)”
购物单去加入("颜料")
说(购物单)

“let 空数组 = [String]()
let 空字典 = [String: Float]()”
量 空数组 = 组<文>(0),“初始化器为”不可能。
量 空字典 = 表<文>(初始大小=0)。

“购物单 = []”
购物单=动行空()
“职位 = [:]”
职位=动表空()

“// 控制流部分”

“let 个人得分 = [75, 43, 103, 87, 12]
var 队得分 = 0
for 得分 in 个人得分 {
if 得分 > 50 {
队得分 += 3
} else {
队得分 += 1
}
}
print(队得分)”
量 人得分 = 行一(75、43、103、87、12)
变数 队得分 = 0
对人得分里的分数,
判存分数,
于0..50,队得分=队得分+1。
否则,队得分=队得分+3。 “这是假设绝句还没到第一个正式版的时候,没有存储抽象”
“有的话:队得分令置为「它后」“只是说可以这么写”、队得分令置为「+3」”

“var 可缺字符串: String? = "Hello"
print(可缺字符串 == nil)”
量 可缺字符串:文? = "Hello"
说(可缺字符串是空)

“var 可缺名字: String? = "鸟布拉斯基"
var 问好 = "吃了么!"
if let 名字 = 可缺名字 {
问好 = "吃了么, \(名字)"
}”
变文? 可缺名字 = "鸟布拉斯基"
变文 问候 = "吃了么!"
可缺名字? 令为,
问候 = "吃了么,$名字?"
“可见绝句要好好考虑一下这个标识符允许什么东西的问题,我的建议是:”
“(1) 参考Kotlin,因为Java/Kotlin 都不允许Unicode中符号的部分字符作为标识符成分,比如'?'。”
“(2) 针对全角半角的常见中文和程序设计语言文法符号,令解析器创建有针对性的镇静解析容错策略。”

“let 绰号: String? = nil
let 全名: String = "鸟布拉斯基"
let 打招呼 = "你好\(绰号 ?? 全名)"”
量 绰号:文? = 空
量 全名:文 = "鸟布拉斯基"
量 招呼 = "你好${绰号空则全名}"

“let 蔬菜 = "红椒"
switch 蔬菜 {
case "西芹":
print("纤维素高")
case "黄瓜", "胡萝卜":
print("干啃不错")
case let x where x.hasSuffix("椒"):
print("\(x)辣么?")
default:
print("炖汤里都行")
}”
引记法 绝句.符号 「以」
引记法 绝句.数据.文 「~终」

量 蔬菜 = "甜椒"
量 建议 = 判蔬菜,
"西芹","纤维素高"。
"黄瓜"、"胡萝卜","干啃不错"。
“它以("椒")终……” “这也是可选的。”
否则,
若蔬菜以("椒")终,"${蔬菜}辣么?"。
否则,"炖汤里都行"。
“这是绝句的带宾语判断(subjective when),中缀链表示法也是可以使用的,不过要在前面加上「它」以与值判断区分。”

判断,
蔬菜是"西芹",说("纤维素高")。
蔬菜是"黄瓜"、蔬菜是"胡萝卜",说("干啃不错")。
上皆,说(“那些是正常情况hhh”)。
“when语句不需要exhaustive也不需要有「否则」”

“顺便说一句,如果每一个 when branch 都是常量,最好还是用 `表一("A"对1、"B"对2)` 吧”
“可见,第三人称形式需要我们好好考虑何处该有,何处不该有。词法作用域技术上还是没问题的。”
“绝句不能学着类似Scala、Swift、Ruby一样什么都抄它们的,就随机判断而言我很不支持那种模式匹配做法,Haskell也不支持(这里,「随机」的机是当机立断的机)”
“这就是我说的「90%」以外的极端情况,为什么判断要有顺序?
判断、判x、判属、判存这些都是无序的,
允许 where x.hasSuffix() 就可能引入了副作用,这是不规范的。”
“相比之下,一般而言绝句的「」中缀记法的实现(和「算符」是不同的,算符是『元方法』)都不会有副作用,所以是相对一致的。”
#security 忍不住让我想到了以前的 war dial-up 攻击。
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 默认名