不知多久能学会 Elisp

2021-04-10
阅读 2 分钟
5k
在一个春天的夜晚,好久也没怎么出门的我,偶然发现 Emacs Lisp 程序能够像脚本程序那般运行,而不仅仅是用于为文本编辑器 Emacs 编写配置文件或插件。这个发现,让我觉得无意中发现了一宗瑰奇的宝藏。

Elisp 11:动态模块

2021-04-10
阅读 11 分钟
3.9k
Emacs 从版本 25 开始支持动态模块。所谓动态模块,即 C 语言编写的共享库 1 。Emacs 的动态模块,就是 Elisp 的动态模块。因此,倘若 Elisp 语言编写的程序某些环节存在性能瓶颈,可借 C 语言之力予以缓解。对于其他编程语言,只要能够调用 C 程序库,皆能用于编写 Emacs 的动态模块。本章仅讲述如何使用 C 语言完成此...

Elisp 10:宏

2021-04-09
阅读 4 分钟
3.7k
上一章实现了只定义了一个函数的库 newbie.el。事实上,这个函数可以不用定义成函数,定义成宏也可以,而且能让调用代码的执行效率微乎其微地更高一些。因为,调用函数,就像是去车站乘坐客车,而调用宏,犹如乘坐自家的私家车。这是一个不是很准确的比喻,所以它仅仅是个比喻。

Elisp 09:库

2021-04-07
阅读 2 分钟
2.9k
从第 1 章就定义了的 princ\' 函数被我一路使用至今,我一直觉得它很有用处,特别是在我调试程序的时候。我承认,用这种办法调试程序很原始。不过,筷子也很原始。为了不再张贴完整的代码之时附上它的定义,我决定建立一个 Elisp 库,用于存放它的定义以及今后我定义的其他函数。

Elisp 08:文本跨行提取

2021-04-06
阅读 6 分钟
3.2k
前言:不知多久能学会 Elisp上一章:命令行程序界面在上一章的结语里,我说这个教程是否会有第二部分,取决于我是否遇到了新的文本处理问题。结果很快如愿以偿。问题下面是 XML 文件 foo.xml 的内容: {代码...} 我需要从 <attachment>...<attachment> 块里提取以下条目: {代码...} 文本跨行匹配现在假设已...

Elisp 07:命令行程序界面

2021-04-05
阅读 6 分钟
2.8k
很多程序是有图形界面的,就是日常所见的那些有菜单和按钮的窗口以及对话框之类。在终端里运行的程序,通常也叫命令行程序,它们也有界面,即一组选项和参数。这两种程序,各有所长,也各有所短。

Elisp 06:缓冲区变换

2021-04-05
阅读 7 分钟
2.8k
在第一章「Hello world!」和第二章「文本解析」里已初步介绍了缓冲区的基本知识。使用 Elisp 语言编写文本处理程序时,充分利用缓冲区,似乎是着实是在发挥 Elisp 的一项长处。因而本章要思考和解决的一个现实问题是,缓冲区可以用来做什么。

Elisp 05:文本匹配

2021-04-05
阅读 3 分钟
3.5k
前言:不知多久能学会 Elisp上一章:迭代在第二章「文本解析」所实现的解析器程序里,为了判断一行文本是否以 \`\`\` 开头,我定义了一个函数: {代码...} 事实上,Elisp 提供了更强大的文本匹配函数。如何的强大呢?强大到了支持正则表达式匹配。正则表达式,就像古代官府捉拿江洋大盗时在城门边上张贴的通缉告示上的罪...

Elisp 04:迭代

2021-04-04
阅读 3 分钟
3k
前言:不知多久能学会 Elisp上一章:变量迭代,亦称循环,表示一段重复运行的程序,其状态可在每次重复运行的过程中发生变化。基于递归函数可以模拟迭代过程。例如以下程序 {代码...} Elisp 解释器在上述程序最后一个表达式 (every-line) 求值时,会转而对 every-line 函数定义里的每个表达式进行求值,但是当 Elisp 解...

Elisp 03:变量

2021-04-03
阅读 4 分钟
2.5k
前言:不知多久能学会 Elisp上一章:文本解析上一章实现的解析器程序——当然仅仅是玩具,有几处颇为丑陋,还有一处存在着安全问题。全局变量安全第一。先从安全问题开始。观察以下代码: {代码...} 上述代码定义的这个函数可判断字符串对对象 src 的内容是否以字符串对象 dest 的内容作为开头,例如 {代码...} 输出 t。这...

Elisp 02:文本解析

2021-04-03
阅读 8 分钟
3.2k
前言:不知多久能学会 Elisp上一章:Hello world!本章介绍 Elisp 的变量、列表、符号、函数的递归以及一些更便捷的插入点移动函数。这些知识将围绕一个实际问题的解决过程逐步展开。问题假设有一份文档 foo.md,内容如下: {代码...} 其中有一部分内容被包含在以 \`\`\` 为开头的两个文本行之间,如何使用 Elisp 编写一...

Elisp 01:Hello world!

2021-04-02
阅读 6 分钟
3.8k
倘若将 Elisp 的应用场景固定为文本处理,学习 Elisp,我认为无需像学习其他任何一门编程语言那样亦步亦趋,所以本章直接从文件读写开始入手,通过一些小程序,建立对 Elisp 语言的初步感受。

Bash Tips 03:双引号的重要性

2021-03-16
阅读 1 分钟
1.8k
假设在一份 Bash 脚本里,函数 foo 的定义如下: {代码...} 调用 foo: {代码...} 亦即,以空字串和 "test" 为参数值调用 foo,结果为 {代码...} 现在假设有函数 bar,其定义如下 {代码...} 然后调用 bar, {代码...} 结果输出 {代码...} 原因是,bar 接受的第一个参数值是空字串,但是当它将这个参数值传递给 foo 时,B...

Bash Tips 02:构造相对路径

2021-03-16
阅读 2 分钟
1.7k
假设此刻我的工作目录是 /tmp/demo/source/foo,该目录相对于 /tmp/demo 的路径显然是 source/foo,后者相对于前者的路径显然是 ../..,但是在 Bash 脚本里,该如何构造这样的路径呢?这个问题,在我写 gar 脚本时,是一个很关键的技术问题,因为在此我仅仅是举例说 /tmp/demo 是我的文档项目的目录,事实上,这个目录并...

Bash Tips 01:获取脚本自身路径

2021-03-16
阅读 4 分钟
4.5k
在写 gar 脚本的时候,我需要在 gar 脚本在运行时确定它自身在文件系统中所处目录的路径。基于该路径,可将 gar.css 文件部署到文档项目的根目录下,因为 gar.css 与 gar 脚本在同一目录下,后者需要根据自身的位置方能找到它,否则就只能由 gar 脚本的用户提供 gar.css 的路径,有所不便。

屏幕录制

2021-02-22
阅读 2 分钟
2.8k
在「用 Bash 脚本写一个截屏工具」一文的后记里,我将截屏脚本略加改动,得到了一个可录制屏幕中指定窗口区域的脚本。翻手为云,覆手为雨,全拜 ffmpeg 所赐。

用 Bash 脚本写一个截屏工具

2021-02-20
阅读 6 分钟
3.2k
在 Bash 看来,或者在任意一种在 Linux 环境里称得上 Shell 的物种看来,只要有了 ffmpeg、grep、sed、awk 以及一个 X 窗口系统之类的东西,就可以用不到 50 行代码写出一个不错的截屏工具。当然,倘若还有 GIMP 或类似的东西,风味更盛。

天网

2020-10-31
阅读 6 分钟
2k
这篇文章依然无趣,因为有变量,有各种几何体,有宏,有数组,有循环,有 union,没有 difference,有动画……最终我画出来的东西,无非是一个模拟地球自转的奇怪的几何体,尽管我给它取了个宏大的名字叫世界。

第一颗卫星

2020-10-30
阅读 4 分钟
1.5k
现在,我想以 A 为原点,构造一个直角坐标系 (X_A, Y_A, Z_A)。X_A 轴与 Y_A 轴分别与过 A 点的纬线和经线相切,Z_A 轴指向 <0, 0, 0>。

经纬

2020-10-30
阅读 5 分钟
1.9k
假设以 <0, 0, 0> 为中心,半径为 1 的球面是天球,构造天网的第一步是建立球面的经纬度模型,即对于球面上的任意一点 A,能够基于它的经度值 U 和纬度值 V 计算它在世界坐标系中的位置 <x, y, z>。我打算先通过直观的图形弄清楚 U, V 和 <x, y, z> 的关系。

标准正交基

2020-10-29
阅读 2 分钟
3.5k
任意非零向量 <x, y, z>,可使用 POV Ray 提供的 vnormalize 单位化处理,亦即将该向量转化为模长为 1 的新向量 <x', y', z'>。例如

坐标系

2020-10-29
阅读 6 分钟
2.3k
上一篇:坐标变换今天不再编蹩脚的故事,只是一本正经地画一个坐标系。坐标系的原点用球体表示。画球的语法为 {代码...} 例如: {代码...} 坐标系的每个轴向由一个圆柱体和一个圆锥体组合而成。圆柱体的语法为 {代码...} 例如 {代码...} POV Ray 没有提供绘制直线段的功能,可以用圆柱模拟直线段。圆锥体(确切地说,是...

坐标变换

2020-10-28
阅读 4 分钟
2.2k
今天,是我从乡下老家返城的第三天。为了拯救这个世界,我决定能不出门就不出门。第一天上午出去买的菜,如果一直放不坏,兴许能吃十天。缺锌,有葡萄糖酸锌片。缺维生素 B,有复合维生素 B 片。这让我觉得,养活一个像我这样的人,成本实在太低了,很容易让我变得没追求。现在想想,我没追求好像已经挺久了。

飞走的盒子

2020-10-28
阅读 3 分钟
2k
上一篇:成千上万个盒子静极思动。一尺之棰,日取其半,万世不竭。飞矢不动。动中有静,静中有动。人活着,总要搞出点动静。我召唤 POV Ray。POV Ray 随一缕青烟飘然而至。这让我想起,上次他是化作一缕青烟消失了。不过,我并不觉得奇怪,就像他能用咒语画画也没让我觉得奇怪那样。「有什么办法可以让盒子飞来飞去,而...

插曲:成千上万个盒子

2020-10-28
阅读 1 分钟
1.6k
如果有人也像我一样,时不时要画成千上万个盒子,而且并不排斥 POV Ray 的绘画方式,那么,不妨使用我用 Python 3 刚写好的 draw-boxes 脚本。前几天,我的所有工作都是为了写出这个脚本。

有物混成

2020-10-28
阅读 3 分钟
1.6k
上一篇:框架昨天,我没有描述 POV Ray 看了我写的能画出带框架的透明盒子的咒语的表情。当时,他满脸嫌弃,像是在看着一个正在咳嗽却不掩口鼻的人,「你知道的越多,一致性就越是缺乏。只是有耐心,远远不够。你看, {代码...} bar_size 与向量的相乘以及 texture 语句不断重复,让咒语冗长,不仅容易出错,而且毫无美...

框架

2020-10-27
阅读 5 分钟
2k
上一篇:变量既然 POV Ray 认为我已经具备运用咒语绘制一切的能力,我决定闭门造车,让之前画的盒子更复杂一些,为它增加一个板条框架。盒子是平行六面体,要为它造框架,我需要 12 根板条,蓝色的。所谓板条,无非是细长的盒子罢了。首先,基于盒子的尺寸 {代码...} 我能确定盒子顶面上的 4 个顶点的坐标: {代码...} ...

变量

2020-10-27
阅读 2 分钟
1.8k
POV Ray 认为,在理论上我已经具备了用咒语画出一切的能力了。当我反对他的乐观时,他以 Minecraft 这个游戏作为论据。我无言以对,但是,总觉得少了一些什么。

盒子

2020-10-27
阅读 4 分钟
1.7k
POV Ray 是个画家。他画画的方式有些奇怪,用的不是画笔,而是咒语。2020 年,过年那段时间,匿在家中躲避新型冠状病毒的我,在娃去院子里骑着童车周游世界的时候,百无聊赖,决定向 POV Ray 学一点用咒语作画的本事。

写给高年级小学生的《Bash 指南》

2018-12-03
阅读 18 分钟
4.9k
若让计算机理解我的意图,可以有两种方式,说和指。这与生活中我为了让他人能够理解我的意图所采用的方式相似。譬如,我想让朋友去超市帮我买瓶饮料,我可以使用祈使句,「帮我去超市买瓶可乐,如何?」我也可以把他领到超市门口,指一下超市,然后再把他领进超市,指一下饮料柜里的一瓶可乐,然后再指一下他口袋里的钱...