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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
Photo
#project #PL HanPP 由于开始词法分析器设计失当暂时无限期暂停开发(此前修复了 printf() 格式化字符串 %x 长度参数不对导致越界访问的问题,现 %hhx
顺便一提,RegularPP 会自带 legalize 合法化功能

[master d45872d] 修复双引号词法问题 引入更多问题 “无限期”暂停开发,中文编程真的累...
2 files changed, 6 insertions(+), 4 deletions(-)
create mode 100755 hanpp
比如我要描述一些专门拿来拼字符串的逻辑,就有很多复杂的正则之类的逻辑,我相信会正则表达式的程序员很多都只会使用『匹配』这一功能,会把值 group 出来的就少很多,知道实现的又少很多,知道正则可以编译的又少很多,知道正则还能 JIT 的就更少了,你怎么又能保证没有希望使用正则代替 bnf 的愿望呢?(ice1000.org)

曾经连 Regex 都不会的 duangsuse 会被喷的说(现在稍微会一点

PCRE(Perl 兼容标准的)正则表达式,和数学公式有着类似的性质 — 看着优雅,部分情况下甚至理解和使用起来也方便,但是如果没有专业的训练,很难理解,并且学习后也比较容易忘记

《ES6 标准入门》上所说,ES6 应该已经支持了

至于正则的「匹配」,举例来说,匹配 C 预处理指令们

grep -P "^\s*#.*$" ~/Projects/cJSON/cJSON.c

/^\s*#.*$/
大概就是说匹配类似 /[\r\n]\s*#.*[\r\n]/
这个模式的意思是 /换行符 任意长度的空白字符 # 任意长度非换行符 换行符/
当然 $^ 的语义没有那么简单,可能还要以「先行(否定)断言」解释,但这里就是这个意思

《深入分析 GCC》中用到了很多字符流处理工具辅助处理代码文件,比如 GAWK、SED、GREP,都和 Regexp 息息相关

正则的「Group」

const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;
// 匹配 2018-09-19

而使用具名组匹配,就更加方便了
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
比之前的数字反引用 xref 方便多了 \0 \1 啊....

\k<组名>

node --use_strict --harmony
> const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
undefined
> RE_DATE.exec('2018-09-19')
[ '2018-09-19',
'2018',
'09',
'19',
index: 0,
input: '2018-09-19',
groups: { year: '2018', month: '09', day: '19' } ]

正则可以编译,一般听说过 re2c 这个词法分析器生成器或在 Rust 里用过 regex 的人应该知道
如果能编译成流匹配代码,自然也就可以 JIT 了
正则代替 BNF 当然也是可能的,Ohm.js 现在就使用正则 + PEG 的方式解析代码,不过完全取代可能还需要别的扩展什么的,现在原理上也不是不可能 #tech #javascript #learn
This media is not supported in your browser
VIEW IN TELEGRAM
那些脑子转不过来的程序员连 Parser Combinator 都搞不懂,用 JS 写出 JS 的 Parser、写出 C 语言的 Tokenizer 和 Grammar Analyzer 就能称霸一方,你一去他们岂不是集体跪拜?然后你在社区获得了正反馈,积累来的编程语言优化经验给了你大厂的工作机会,公司的网站又快了几倍,被无所事事的同事抢了三分之二的功劳剩下的钱也够你过上学生时代希望的平淡生活了。

"连 Parser Combinator 都搞不懂" 说的是我啊(对号入座付
"Tokenizer 和 Grammar Analyzer 是梗,只会这些当然是不可能称霸一方的。" 也是我(跑路

如果我不会 LALR 或者其他词条流匹配算法的话,RegularPP 就写不出来了(
当然,字典树也是一样,RegPP 的替换是基于字节流处理 C 编写的,所以需要 ByteTrie 树来完成 section-based 替换
目前想到一种基于 ArrayMap 的 ByteTrie 树结构和算法

“Perl6 和 Nimlang 可以修改自己的语法。” 如果这次我能写出 ApkBundler Scheme(以后这里都简称 ABS(
那它也可以修改自己的语法了,BreakLexer、Combinator 即是为这种特性计划的,BreakLexer 可以用于扩展词法(自定义部分词法特性、自定义运算符和关键字),Combinator 用于结合运算符(虽然后来还是打算好好学习一下 Parserc,然后就扩展了吧...
ABS 是面向流解释代码的,就是说可以即时执行匹配到的 S 表达式,所以可以随意操作字符流、词条流、S 表达式流来任意切换语言前端

[require 'inscript]
[lang inscript]

# InScript code goes here
lang 'apkbundler-scheme'
; ApkBundler Scheme code goes here
#Haha #backend #PL #java #cpp #recommended

笑哭 🙈 ice1000/algo4j/jni/math/BigInt.cpp#3

我的高精度 简洁简洁最简洁 逃课去机房我情不自禁 测试测试 在那垃圾的电脑上测试
月光下我看到测试全通过 有时很快有时很慢 感到一种力量驱使我的手速 有了高精度
负数都不怕 加法减法 乘法除法 乘方取余不压位 为了方便输出 为了方便输出 为了方便输出
http://ice1000.org/2017/02/17/TranslationDLPL/ #ai #ann

之前稍微理解了一下 KNN 机器学习,但是不了解人工神经网络,现在看看
duangsuse::Echo
https://chortle.ccsu.edu/java5/Notes/chap85/ch85_12.html
#word inline,JIT,fusion(haskell optimization),tco,lazy,unwrap lambda(absal programming language)
两个没听说过
#frontend #css #html 好耶!是 CSS 动画!

header nav ul img:hover, header nav ul i.fa:hover {
transition: all 0.2s cubic-bezier(0.5, 1.45, 0.64, 1.87);
transform: translateY(-0.2em);
}
#c #php #java #recommended http://ice1000.org/2018/09/24/CodeEditor4/

duangsuse 阅读时注意到的事情(本文第一次,作为编辑器后端架构基本蒙蔽)

0. 我又看到了 gap buffer
1. freenode #lisp 有 dalao
2. Oracle 开发 JavaX 的程序员很有文化
3. VSCode 前端程序员们有不考虑字面 literal 包含 EOL 的 Token “优化” 的黑历史
4. 他们曾经也没考虑当前编辑行
5. VS 很厉害,会缓存每行代码渲染后生成的纹理 buffer
我也想试用下 FreeType 来着
可惜后来没时间了 2333
我曾经修改的一个 Rust badge 生成器,现在还在 docs.rs 上,用了 FreeType 的一个 Rust 绑定,当初看不懂 算
6. 冰冰现在也做数据结构 & 算法可视化动画了 LineSpan 的数据结构可视化
7. 太长不看 TLDR
8. 所谓太长不看的大多是 文本序列数据结构的通用性质
讲的还挺好的
+ 一个 item 指文本序列的最小单位,通常是 char 或者 wchar_t
+ 一个 sequence 指一系列以各种方式组合并在逻辑上是连续的 item ,即刚才提到的抽象结构,比如 LinkedList<Character>, std::list<char>
+ 一个 buffer 指一段在物理上连续的 item std::vector<char>::data, java.util.ArrayList<Character>, mmap() 映射的
+ 一个 item 序列如果同时是 sequence 和 buffer 那么它是一个 span like java.lang.String, std::string
+ Ruby/Lua/JavaScript/Dart/Perl 等语言中的 string 是 span
8.5. PHP 也是,如上文,Java 当然也是

// 可以认为 PHP 里 string 是这样的
struct php_string {
php_refcount rc;
unsigned long hash;
size_t length;
char buffer[1]; // 多出来的一字符用于存储 CString 的 EOS '\00'
};

这里 struct php_string 是一个 item 为 char 的 (sequence 兼 buffer)a.k.a. span,因为它在物理上也是连续的

9. 菜鸡 duangsuse 也是正式入坑 CS 足足一年半后才知道啥是位长度啥是进制的,烫烫烫烫烫烫烫烫烫烫...
10. code 现在使用 Piece Table 来作为存储后端数据结构实现
11. 简单数据库操作 CRUD 简单序列操作 QID