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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
推荐几个 R6RS 实现

https://www.biwascheme.org/ 基于 JavaScript 的字节码解释器
http://ikarus-scheme.org/ 原生代码编译
http://www.larcenists.org/download.html 同,区别在于只面向(x86, x64)/ARMv7l
(一件好玩的事情是, Chez Scheme 都不支持 R7RS 特性, Larceny 则支持, 所以我这里 Chez 的环境还居然无法编译 Larceny...
刚才编译了 Larceny(特地首先准备的实现)
感觉编译速度果然还是不如 Chez 快, 但其实已经很快了, GCC 和 Clang(只是前端) 都要花多多少倍的时间
可能 Chez 编译时不是直接生成机器码或者汇编的吧,可以看到 Larceny 的确慢了不少, 至于是不是都是 pass 架构的不清楚

Larceny 至少是 Linux 上不支持 X86_64,所以还得特地去装个 32 位兼容 libc 和头文件才能用... 还依赖 NASM

../larceny-1.3-bin-native-ia32-linux86/larceny

Larceny v1.3 "Grain Alcohol and Rainwater" (Aug 6 2017 01:16:30, precise:Linux:unified)
larceny.heap, built on Sun Aug 6 01:16:56 EDT 2017

(load "setup.sch")
(setup 'scheme: 'larceny 'host: 'linux86 'sassy 'string-rep: 'flat4)

(build-config-files)
(load-compiler)
(build-heap)
(build-runtime)
(build-executable)

; complete Larceny user system including the Twobit compiler
(build-larceny-files)


之后,不知道具体流程上有何差距,Chez 当时自己带了 boot 文件,Larceny 需要用现有的解释器编译自己,不懂这些...
http://sassy.sourceforge.net/

可以作为 Kasm 的参考... 不过看到说是占 Larceny 代码大部分我知道大概... 很难
This media is not supported in your browser
VIEW IN TELEGRAM
其实是我弄错了... 我想要类似 Petit Larceny 这样编译到 C 的,或者说可以脱离专门的运行时的实现
( 但我没有注意到这实际上是不可能的,除非是用 C, D, Fortran, no_std 的 Rust 之类

但挂上运行时其实也可以,因为运行时有 400k 大小

不过还是失望...
duangsuse::Echo
http://sassy.sourceforge.net/ 可以作为 Kasm 的参考... 不过看到说是占 Larceny 代码大部分我知道大概... 很难
曾经也写过 compose 函数,duangsuse 自豪的表示(大嘘)
当然啦,由于技术太菜,这是黑历史... 不仅概念错误还白白使得灵活无比的 JavaScript 变得如此死板
https://popf.rip/ (因为域名暂时没有地方用,据说很多搜索引擎根本不爬 rip/* ... 气死

// 用来创建混合函数的高阶函数
// @arg func: 被内联的函数
// @arg chain_fun: 目标函数
// @return 生成的混合函数闭包
function mixture(func, chain_fun) {
return function (arg1) {
return func(chain_fun(arg1))
}
}
// Curry for mixture
function mk_mixture(chain_fun) {
return function (func) {
return mixture(func, chain_fun)
}
}

// 用来添加 JSON 解码功能的高阶函数
json_decode_chain = mk_mixture(JSON.parse)

// 这玩意是这么玩的
function ruser(id, fun) {
$$.ajax({
method: 'POST',
url: uq_api.replace('xxxx', id || ''),
success: json_decode_chain(fun)
});
}
duangsuse::Echo
先试用 lex / re2c 和 Yacc
就是 re2c 版本的 HanPP 和 Yacc 版本的 +-*/ 计算器
HanPP 是一个 C-like 语言预处理器可以将 C 标识符们预处理为标准 C 允许的 ^[A-Za-z_][A-Za-z0-9_]* 模式

但是,要无视掉这些而不能随意合法化处理

BlockComment: '/*' .*? '*/'
LineComment: '//' ~[\r\n]*
StringLiteral: EncodingPrefix? '"' SCharSequence? '"'
SimpleEscapeSequence: '\\' ['"?abfnrtv\\]
EncodingPrefix
: 'u8'
| 'u'
| 'U'
| 'L'
;


(随手抄的,但其实有差别,少了一个 ''
整理一下,需要忽略的有:

注释,直接 skip 掉,包含行注释和块注释
字符串文本,需要侦测的只有 \"
字符文本,需要侦测的只有 \'

就是说什么别的词法规则都不需要考虑,现在正在编写 Lex 代码...
duangsuse::Echo
https://t.me/dsuses/2484 Flex 找不到例子,而且少例子居然是错误的,无法编译通过,只得换 re2c,可能只有 JFlex 现在可以用
re2c 各种水土不服,体积还过得去但是使用起来非常不方便,会出一些问题... 还是 Lex 好啊
比如 YYLIMIT 不知为何无效,或者设计不知为何不能像我想的一样
总是段错误,然后不能单单靠 getchar() 完成分词
总结:很失败
This media is not supported in your browser
VIEW IN TELEGRAM