推荐几个 R6RS 实现
https://www.biwascheme.org/ 基于 JavaScript 的字节码解释器
http://ikarus-scheme.org/ 原生代码编译
http://www.larcenists.org/download.html 同,区别在于只面向(x86, x64)/ARMv7l
https://www.biwascheme.org/ 基于 JavaScript 的字节码解释器
http://ikarus-scheme.org/ 原生代码编译
http://www.larcenists.org/download.html 同,区别在于只面向(x86, x64)/ARMv7l
https://github.com/marcomaggi/vicare 这是 Ikarus 的续任者,前者已经停止更新多年
http://www.larcenists.org/benchmarksGenuineR6Linux.html 这个 R6RS 实现维护了跑分列表
http://www.larcenists.org/benchmarksGenuineR6Linux.html 这个 R6RS 实现维护了跑分列表
GitHub
GitHub - marcomaggi/vicare: A native compiler for Scheme compliant with R6RS
A native compiler for Scheme compliant with R6RS. Contribute to marcomaggi/vicare development by creating an account on GitHub.
(一件好玩的事情是, Chez Scheme 都不支持 R7RS 特性, Larceny 则支持, 所以我这里 Chez 的环境还居然无法编译 Larceny...
刚才编译了 Larceny(特地首先准备的实现)
感觉编译速度果然还是不如 Chez 快, 但其实已经很快了, GCC 和 Clang(只是前端) 都要花多多少倍的时间
可能 Chez 编译时不是直接生成机器码或者汇编的吧,可以看到 Larceny 的确慢了不少, 至于是不是都是 pass 架构的不清楚
Larceny 至少是 Linux 上不支持 X86_64,所以还得特地去装个 32 位兼容 libc 和头文件才能用... 还依赖 NASM
之后,不知道具体流程上有何差距,Chez 当时自己带了 boot 文件,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 需要用现有的解释器编译自己,不懂这些...
其实是我弄错了... 我想要类似 Petit Larceny 这样编译到 C 的,或者说可以脱离专门的运行时的实现
( 但我没有注意到这实际上是不可能的,除非是用 C, D, Fortran, no_std 的 Rust 之类
但挂上运行时其实也可以,因为运行时有 400k 大小
不过还是失望...
( 但我没有注意到这实际上是不可能的,除非是用 C, D, Fortran, no_std 的 Rust 之类
但挂上运行时其实也可以,因为运行时有 400k 大小
不过还是失望...
duangsuse::Echo
int 类型的全部实例构成了一个集合(范畴),如果我们为其定义了一些函数,而且它们之间的复合运算满足结合律的话,我们就可以把这种函数叫做 int 类型范畴上的“态射”,态射讲的是范畴内部元素间的映射关系 // 将函数 g 与 f 复合,(g ∘ f)(x) = g(f(x)) Func<X, Z> Compose<X, Y, Z>(Func<Y, Z> g, Func<X, Y> f) => (X x) => g(f(x)); Func<int, int> f = (int x) => x * 2; …
提示一下,Haskell 那里有一些入门教程,简单地诠释了函数合成理念(是比喻 + 图解)
duangsuse::Echo
http://sassy.sourceforge.net/ 可以作为 Kasm 的参考... 不过看到说是占 Larceny 代码大部分我知道大概... 很难
曾经也写过 compose 函数,duangsuse 自豪的表示(大嘘)
当然啦,由于技术太菜,这是黑历史... 不仅概念错误还白白使得灵活无比的 JavaScript 变得如此死板
https://popf.rip/ (因为域名暂时没有地方用,据说很多搜索引擎根本不爬 rip/* ... 气死
当然啦,由于技术太菜,这是黑历史... 不仅概念错误还白白使得灵活无比的 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 代码...
注释,直接 skip 掉,包含行注释和块注释
字符串文本,需要侦测的只有
\"字符文本,需要侦测的只有
\'就是说什么别的词法规则都不需要考虑,现在正在编写 Lex 代码...
duangsuse::Echo
https://t.me/dsuses/2484 Flex 找不到例子,而且少例子居然是错误的,无法编译通过,只得换 re2c,可能只有 JFlex 现在可以用
re2c 各种水土不服,体积还过得去但是使用起来非常不方便,会出一些问题... 还是 Lex 好啊