单子,想弄不懂都很难

2017-12-15
阅读 3 分钟
4.8k
C 语言里没有现代程序员热衷于讨论的那些东西。 不过,那些东西不是原本就没有么? 下面我尝试用 C 语言来写一个单子(Monad)。 看下面这段代码: {代码...} 在 C 语言里,这是个结构体,而且是一个似乎很无聊的结构体。这种结构体能用来做什么呢? 可以作为函数的返回值类型。例如: {代码...} 假设 foo 像下面这样调...

<译> 自然变换

2017-12-11
阅读 11 分钟
8.8k
我们已经讨论过,函子可以在维持范畴结构的前提下实现范畴之间的映射。函子可以将一个范畴嵌入到另一个范畴,它也可以让多个范畴坍缩为一个范畴且不会破坏范畴的结构。凭借函子,我们可以在一个范畴之内构建另一个范畴。源范畴可视为目标范畴的部分结构的模型或蓝图。

程序的基本形状

2017-12-06
阅读 2 分钟
3.7k
一时兴起,用了差不多十天的时间,为「不懂编程」的人写了一系列的形散神不散的散文。这是我在这一年里做的我觉得最有意义的一件事,当然在我身边的人看来,这可能是我在这一年里做的最不务正业的事了。

无所遁形

2017-12-06
阅读 3 分钟
2.5k
按语:我任何路边的摄像头下走过的时候为「不懂编程的人」写了这一系列文章的最后一篇,整理于此。它的前一篇是《咒语》,介绍了如何在 Emacs Lisp 程序的世界里登坛作法,呼风唤雨。

咒语

2017-12-06
阅读 8 分钟
2.6k
按语:我在围观茅山道士跳大神的时候为「不懂编程的人」写了这一系列文章的第十一篇,整理于此。它的前一篇是《从混乱到有序》,介绍了如何用 Emacs Lisp 语言写一个快速排序程序。

从混乱到有序

2017-12-05
阅读 11 分钟
3.1k
按语:我在一锅汤里为「不懂编程的人」写了这一系列文章的第十篇,整理于此。它的前一篇是《长长的望远镜》,作为《无名》一篇的补充,介绍了 Emacs Lisp 的动态域与词法域。

长长的望远镜

2017-12-05
阅读 3 分钟
2.5k
按语:我在送孩子去幼儿园的路上为「不懂编程的人」写了这一系列文章的第九篇,整理于此。它的前一篇是《无名》,讲述了如何一步一步「推演」出 Y 组合子。

无名

2017-12-05
阅读 10 分钟
2.6k
按语:我从悬崖上跳了下去,在除了坠落没别的事可干的过程中为「不懂编程的人」写了这一系列文章的第八篇,整理于此。它的前一篇是《周游抑或毁灭世界》,讲述了递归函数的基本用法。

周游抑或毁灭世界

2017-12-05
阅读 2 分钟
2.6k
在 Emacs 里,世界就是缓冲区。(goto-char (point-min)) 可以让准备周游世界的光标跳到世界的起点,同理 (goto-char (point-max)) 可以让光标跳到世界的尽头。于是,光标就以光的速度周游了一遍世界。

红药丸,还是蓝药丸

2017-12-04
阅读 4 分钟
5.3k
用 Emacs 打开 init.el 文件,将上面的代码复制到 init.el 文件的尾部,然后将光标移动到 murphis 这个函数定义的末尾,执行 C-x C-e。这样 Emacs Lisp 解释器就知道了 murphis 这个函数的定义了。

周而复始

2017-12-04
阅读 3 分钟
2.9k
无论是汽车、轮船还是火箭,所有的交通工具里面,都有一个被称为发动机的东西。即使我们徒步或骑着单车,这里面也有一个发动机——我们的心脏。计算机里面也有个发动机,就在 CPU 里。

原子与虚空

2017-12-04
阅读 3 分钟
3.9k
到现在为止,我们已经大致见识了在 Emacs Lisp 语言中如何定义一个函数,也见识了interactive、insert、read-string、list 等函数的基本用法。我几乎未对这些函数给出细致的解释,但是通过几次简单的实践,它们的功能应该是显而易见的。不过,这种显而易见是建立在对编程的基本知识有所了解的基础之上的。

勤劳,还是懒惰?

2017-12-04
阅读 3 分钟
3.2k
但是一旦弄懂了如何使用 Emacs Lisp 语言定义一个函数,以及 interactive 与 insert 的用法,我们就可以在很多时候从一个勤劳的人蜕变为一个懒惰的人。

第一声问候

2017-12-04
阅读 6 分钟
3.2k
理解了 Emacs 身为计算机的本质之后,在 Emacs 里编程就顺理成章了。不过,在此之前,还需要略微介绍一下 Emacs 最基本的操作。

Emacs 是一台计算机

2017-12-04
阅读 2 分钟
4.6k
按语:这是我在幽暗的山洞里为「不懂编程的人」写的系列文章的第一篇,整理于此。在这篇文章之前,有一篇前言《程序的基本形状》,它也兼职了目录功能,便于让你纵览这个系列文章的全貌。

C 程序眼中的 Unicode

2017-11-21
阅读 12 分钟
7.6k
去年写了一篇文章「在 C 程序中处理 UTF-8 字符串」,介绍了如何使用 GLib 提供的 UTF-8 字符串处理函数来实现基本的 UTF-8 文本处理。不过,GLib 是一个功能比较全面的 C 程序库,C 字符串处理仅仅是它的一个很小的模块。属于 GNU 项目一部分的 libunistring 是更专注 Unicode 字符串处理的 C 库,使用 GPL/LGPL 双协议...

有理曲线的构造

2017-11-18
阅读 4 分钟
3.3k
当我生活在一条多项式曲线 $P(t)$ 构造的空间里,要让我感受到这个空间是弯曲的,需要给我一个测量工具,让我能够测量这个空间里任意两个 $t$ 值 $t_a$ 与 $t_b$ 对应的两个点 $P_a$、$P_b$ 之间的距离,即 $d(P_a, P_b)$。为了便于描述,我给 $t$ 取了个名字,叫时间。

曲线插值:大直若曲

2017-11-13
阅读 4 分钟
3.4k
声明:以下内容出现了一些 TeX 数学公式,它们显示不出来,这不是我的错 :) 更正:段错误网站有个 Bug,它会自动检测文本里是否出现了 TeX 数学公式,然后才能进行公式渲染,但检测规则是必须出现行间公式,即

斯坦福兔子的伪全息舞台剧

2017-11-10
阅读 3 分钟
5.5k
前两天用 Python 语言写了个小工具 Hamal,可以将一些朴素的数据文件转化为 POV-Ray 场景文件,然后进行光线跟踪渲染,从而实现数据的可视化。有关 Hamal 的用法,详见 「Hamal 指南」。

Hamal 指南

2017-11-09
阅读 3 分钟
4.3k
Hamal 是一份 Python 3 脚本,可将点集、无向图、曲线、矢量场、网格曲面等三维几何数据转化为 POV-Ray 场景文件。也就是说,Hamal 不生产数据,也不负责图形渲染,它只能算是一个数据格式转换器,面向对 POV-Ray 有一些了解并且希望使用 POV-Ray 对上述三维几何图形进行光线追踪渲染的人。

真正好用的软件都会有个 Shell

2017-11-08
阅读 2 分钟
2.3k
截止到公元 2017 年 11 月 7 日晚上 10 点,菜单、工具栏与快捷键依然是几乎所有带图形界面的软件的标配。我们已经习以为常,每天像杂货铺的老板一样清点着它们。

趴边去!

2017-11-06
阅读 3 分钟
2.4k
昨天,一整天都在折腾,用 Python 写出来一个挺简单的 POV-Ray 代码生成器,解决了三维点集的可视化问题。今天对它又作了一些改进,之后又写了一个无向图的 POV-Ray 代码生成器。以后再有需要,还得为向量场、曲线等几何对象的可视化写相应的代码生成器。

当 Python 邂逅 POV-Ray

2017-11-06
阅读 12 分钟
6k
POV-Ray 是一种专业的三维场景描述语言,它描述的三维场景可交由 POV-Ray 的解析器(或编译器)采用光线跟踪技术进行渲染,渲染结果为位图。

有个空间,名叫 Gamma

2017-09-11
阅读 4 分钟
2.6k
Gamma 空间是计算机图形学领域的一个很古老的传说。最近我在看 POV-Ray 的官方指南时才注意到它的存在。这篇文章是我阅读一些资料之后写的一篇笔记,其中有一些内容属于猜测,若有错误,请不吝指正。

为小项目写 Makefile

2017-08-26
阅读 11 分钟
4.4k
这篇文章以我的一个小项目为例,阐述了面向 GNU Make 的 Makefile 文件的基本写法。由于我未认真阅读 GNU Make 的文档,并且对于符合 POSIX 标准的 Makefile 格式并不了解,所以我写的 Makefile 可能不甚严肃,还请擅长此道者不吝赐教。

orez 的故事

2017-01-16
阅读 14 分钟
4.6k
事实上,zero 的生死,对这个世界没有任何影响。尽管从理论上说,我是它唯一的用户,但是它的死对我也没有任何影响。因为在它死去之后,orez 就诞生了。不过,orez 的生,对这个世界继续不会有什么影响。

GNU parallel 笔记

2016-12-04
阅读 3 分钟
4.4k
以前虽然知道有这么个工具,但是一直没想到要用。今天在删除我的 Gentoo 系统的 /usr/src 目录下的旧版本的内核源码目录时用了一次,很好用。

基于 m4 的 C 代码模板化

2016-12-02
阅读 12 分钟
6.2k
foo 所接受的两个参数 x 与 y 分别是指向两个点对象的指针。为了追求通用性,foo 这个函数努力成为一个不依赖具体数据类型的「泛型」函数。也就是说,现在我们并不知道 x 与 y 所指向的点对象究竟有着怎样的数据结构。也许它们的数据结构是:

在 C 的世界之外

2016-11-30
阅读 6 分钟
4.7k
B:不可以,除非不在意自己的 C 程序在性能上输给 C++ 模板程序。如果这种密集型的运算过程仅仅是对某些数据类型有所依赖,此时可以用宏进行抽象。

C 的容器、环境与算法

2016-11-13
阅读 10 分钟
5.6k
本文介绍了有助于提高 C 代码复用程度的一些基本抽象手段。原本是写给组里初学 C 的的小伙伴们看的…… C 程序是什么 A:程序是什么? B:程序 = 算法 + 数据结构。 A:算法是什么? B:是一个函数,$Y = f(X, t)$。这个函数描述的是一组初始状态 $X$ 如何随着时间 $t$ 的变化逐步演化为另一组状态 $Y$。 A:数据结构是什...