总之就是算法分析模拟和理论理解能力还不够强,虽然比以前看着 MapGen 一脸蒙蔽好多了,依然有很大的提升空间,看来天才还是不存在的... 不相信天才... 即使我已经高二了
duangsuse::Echo
学会了什么? #learn #kotlin 1. java.imageio 和 java.awt 包部分功能的使用 2. Java URL 类使用 3. RGB Color 4. Kotlin vararg 5. 知道了自己现在还是不知道 Array<out String> 啥意思 6. 知道了可能别人也不知道,就是从 Kotlin 编译器推导的类型抄抄罢了 7. step 和 until 语法 8. 之前把图片打印倒了的说,一改循环 xy 到 yx 立刻修好 8.5. 我下面说的算法分析能力几乎没有就是指不知道为啥会打印倒…
10. 还是对函数式 Functional 和类型论 Type Theory 一无所知
这点是一直没变的
这点是一直没变的
https://github.com/kztao/yscheme/blob/master/compiler.ss
这个从 Chez Scheme 作者 Kent Dybvig 的课堂上带来开源的 Scheme 编译器,可以把 R6RS 的子集的代码转换为 AT Syntax X86(_64) 汇编代码,不过需要一个额外的运行环境才能执行
直到现在都没有人公开编写此编译器输出需要的链接库,这也就是个废物了?因为可能大家都看不懂递归、CPS、Combinator... (反正还有一大堆真·函数式的理论没几个人看的)
在他删除这个 repo 之后,只有寥寥两个 fork 继续存在,而且没有人动过那些代码,真是应了某些科幻小说里“他们无法解开我加密的代码”这句话了,Scheme 是多像数学,看起来多么美观自然但是多么难理解,不熟悉者对着一大堆括号一头雾水,满眼
最多的分析大概就是他吹出去的那 40 行代码了,一个 CPS 编译器
A notable thing of this compiler is its use of high-order evaluation contexts, an advanced technique used in CPS transformers, which resulted sometimes in much simpler and shorter code.
那么多人崇拜王垠,觉得他很酷,很厉害,可惜这些觉得他很厉害的程序员里,有几个知道他到底是做什么的呢?
所谓编译原理、编译器技术,可能以他为榜样的那部分人里,并没有人真正对这些感兴趣,只是作为一个遥不可及的偶像罢了。
可是,现在的计算机工程需要一种像神一样的存在吗?
真香... 🙈
这个从 Chez Scheme 作者 Kent Dybvig 的课堂上带来开源的 Scheme 编译器,可以把 R6RS 的子集的代码转换为 AT Syntax X86(_64) 汇编代码,不过需要一个额外的运行环境才能执行
Only the main compiler code is here. I don't have copyright of the rest of the code (test framework, runtime system etc)直到现在都没有人公开编写此编译器输出需要的链接库,这也就是个废物了?因为可能大家都看不懂递归、CPS、Combinator... (反正还有一大堆真·函数式的理论没几个人看的)
在他删除这个 repo 之后,只有寥寥两个 fork 继续存在,而且没有人动过那些代码,真是应了某些科幻小说里“他们无法解开我加密的代码”这句话了,Scheme 是多像数学,看起来多么美观自然但是多么难理解,不熟悉者对着一大堆括号一头雾水,满眼
define lambda match 不知何意,大概 Haskell 都比这更像过程式语言不是吗...最多的分析大概就是他吹出去的那 40 行代码了,一个 CPS 编译器
A notable thing of this compiler is its use of high-order evaluation contexts, an advanced technique used in CPS transformers, which resulted sometimes in much simpler and shorter code.
那么多人崇拜王垠,觉得他很酷,很厉害,可惜这些觉得他很厉害的程序员里,有几个知道他到底是做什么的呢?
所谓编译原理、编译器技术,可能以他为榜样的那部分人里,并没有人真正对这些感兴趣,只是作为一个遥不可及的偶像罢了。
可是,现在的计算机工程需要一种像神一样的存在吗?
如果你希望你的DSL跑的像射命丸文一样快,你可以把这些特性去掉,然后你就能在你自己的编译器里做优化(inline,JIT,fusion,tco,lazy,unwrap lambda)了。
然后你又会发现,这些其实很简单的东西知乎上的程序员似乎觉得这很高大上诶!那些脑子转不过来的程序员连 Parser Combinator 都搞不懂,用 JS 写出 JS 的 Parser、写出 C 语言的 Tokenizer 和 Grammar Analyzer 就能称霸一方,你一去他们岂不是集体跪拜?
真香... 🙈
GitHub
yscheme/compiler.ss at master · kztao/yscheme
a compiler from a subset of Scheme into X64. Contribute to kztao/yscheme development by creating an account on GitHub.
duangsuse::Echo
https://github.com/kztao/yscheme/blob/master/compiler.ss 这个从 Chez Scheme 作者 Kent Dybvig 的课堂上带来开源的 Scheme 编译器,可以把 R6RS 的子集的代码转换为 AT Syntax X86(_64) 汇编代码,不过需要一个额外的运行环境才能执行 Only the main compiler code is here. I don't have copyright of the rest of the code…
现在咱正在测试 play compiler.ss 🐱
终于知道
注释掉没有的代码后,
因为 compiler.ss 使用了太多自定义语法 想白白测试来很困难,所以暂时不继续测试了
终于知道
define-syntax 是什么意思了...注释掉没有的代码后,
;(load "match.ss")Chez Scheme 说
;(load "helpers.ss")
;(load "driver.ss")
;(load "fmts.pretty")
;(load "wrapper.ss")
[DuangSUSE@duangsuse]~/Projects% scheme compiler.ss发现有这些代码
Chez Scheme Version 9.5
Copyright 1984-2017 Cisco Systems, Inc.
Exception: misplaced aux keyword (unquote x) at line 234, char 8 of compiler.ss
(define mref?然后,参照手册 https://www.scheme.com/tspl4/examples.html
(lambda (x)
(match x
[(mref ,base ,off) #t]
[,x #f]))) ; misplaced aux keyword (unquote x) at line 234
(display ,x) ; misplaced aux keyword (unquote x)好玩,可惜 ApkBundler Scheme 不打算使用这样的宏系统
(define-syntax unquote
(lambda (x) 1)
(display ,s) ; => 1
(define-syntax unquote
(syntax-rules ()
[(_ e) (display e)]))
,display
#<procedure display>
因为 compiler.ss 使用了太多自定义语法 想白白测试来很困难,所以暂时不继续测试了
#learn #functional #scheme #cs #pl
https://www.cnblogs.com/JacZhu/p/9729587.html 阅读者 duangsuse 做的总结 以下
-Infinity: 以下可能不是标准的 C# 代码,如果不容易理解全换乘伪代码
0. 笔者一直以为 LINQ 是专门用来对不同数据源进行查询的工具
1. C# 3.0 的 LINQ 可以做 Parser Combinator
2. 我也好需要 Parser Combinator 编写技能啊
3. 任何实现了
4. 如果我们为
首先我们要定义一个
9.
12. 可以看到,当出现了两个
14. 因为我们所写的第二个
细心的你可能已经发现了,不管是 LINQ to Task 还是 LINQ to Result,我们都使用了某种特殊的类型(如:Task,Result)对值进行了包装,然后编写了特定的拓展方法 —— SelectMany,为这种类型定义了一个重要的基本操作。在函数式编程的里面,我们把这种特殊的类型统称为“Monad”,所谓“Monad”,不过是自函子范畴上的半幺群而已
https://www.cnblogs.com/JacZhu/p/9729587.html 阅读者 duangsuse 做的总结 以下
-Infinity: 以下可能不是标准的 C# 代码,如果不容易理解全换乘伪代码
0. 笔者一直以为 LINQ 是专门用来对不同数据源进行查询的工具
1. C# 3.0 的 LINQ 可以做 Parser Combinator
2. 我也好需要 Parser Combinator 编写技能啊
3. 任何实现了
Select,SelectMany 等方法的类型,都是支持类似于 from x in y select x.z 这样的 LINQ 语法的4. 如果我们为
Task 类型实现了上面提到的两个方法,那么我们就可以不借助 async/await 来对 Task 进行操作taskA = Task.FromResult(12)5. 我们来为
taskB = Task.FromResult(12)
resultA = await taskA
resultB = await taskB
result = resultA + resultB // 12 + 12
resultLINQ =
from a in taskA // a = await taskA
from b in taskB // b = await taskB
select a + b // 简不简洁?
Task 类型添加 LINQ 语法首先我们要定义一个
Select 拓展方法,用来实现通过一个 Func<TValue, TResult> 将 Task<TValue> 转换成 Task<TResult> 的功能。static async Task<TR>6. 然后是
Select<TV,TR>
(this Task<TV> task, Func<TV, TR> selector)
{
var value = await task; // 取出 task 中的值
return selector(value); // 使用 selector 对取出的值进行变换
}
static async Task<TaskResultType>
Select<TaskSelf, TaskResultType>
(Task<TaskSelf> self, Function<TaskSelf, TaskResultType> selector)
{ return selector(await self) }
taskA = Task.FromResult(12)
result = from a in taskA select a * a;
// taskA.Select(a => (a * a))
// `a => a * a' 就是 Select 中 selector /* (a => a * a) */ (await self) 被调用的那个 selector
SelectMany 函数class Task7. 这个
async SelectMany<ThisType, SelectorType, ResultType>
(self, selector: Function<ThisType, Task<SelectorType>>,
projector: Function<ThisType, SelectorType, ResultType>): Task<ResultType>
{
var value = await self;
return projector(value, await selector(value));
}
SelectMany 实现的功能就是,通过一个 Func<TValue, Task<TResult>> 将 Task<TValue> 转换成 Task<TResult>
8. 如果看不懂上面的解释的话,不要灰心,因为我也看不懂9.
taskA.SelectMany(a => taskB, (a, b) => (a * b))
10. from a in taskA from b in taskB select a * b
11. 后面还有一点我也看不懂,只看懂了一句话,就是 "SelectMany 可以被看作为把两层 Task 转换成单层 Task"12. 可以看到,当出现了两个
Task 之后,LINQ 就会使用 SelectMany 来代替 Select
13. 想为什么 LINQ 不像之前那样,用两个 Select 分别处理两个 Task 呢14. 因为我们所写的第二个
Select 其实就是 SelectMany,结果比 LINQ 还多调用了两次 Select
15. 后面的看不懂细心的你可能已经发现了,不管是 LINQ to Task 还是 LINQ to Result,我们都使用了某种特殊的类型(如:Task,Result)对值进行了包装,然后编写了特定的拓展方法 —— SelectMany,为这种类型定义了一个重要的基本操作。在函数式编程的里面,我们把这种特殊的类型统称为“Monad”,所谓“Monad”,不过是自函子范畴上的半幺群而已
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;
最后:学不下去了... 停车... 我要停车...#PL #dev #tech https://www.gnu.org/software/guile/
真是大开眼界 http://www.r6rs.org/implementations.html
1. GDB 好看的交互是基于 R6RS 实现 Guile
2. GNU 家的项目居然能把前端做得这麽好,而且在国内还是不知名语言
GitHub 上语言实现绑定只有一两个,倒是库和使用它的应用有一些
真是大开眼界 http://www.r6rs.org/implementations.html
1. GDB 好看的交互是基于 R6RS 实现 Guile
2. GNU 家的项目居然能把前端做得这麽好,而且在国内还是不知名语言
;;; Hello HTTP serverGuile 在国内可真是可谓无人知晓... RubyGems 根本没有 果然凉啊
(use-modules (web server))
(define (my-handler request request-body)
(values '((content-type . (text/plain)))
"Hello World!"))
(run-server my-handler)
GitHub 上语言实现绑定只有一两个,倒是库和使用它的应用有一些
www.gnu.org
GNU Guile
Guile is designed to help programmers create flexible applications that can be extended by users or other programmers with plug-ins, modules, or scripts.
推荐几个 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 需要用现有的解释器编译自己,不懂这些...