-
如何在CommonLisp中解析命令行参数
clingonclingon 是一个 Common Lisp 的命令行选项的解析器,它可以轻松地解析具有复杂格式的命令行选项。例如,下面的代码可以打印给定次数的打招呼信息 123456789101112131415161718192021222324252627282930313233343536#!/bin/sh#|-*- mode:lisp -*-|##|exec ros -Q -- $0 " -
自己动手打印整数
在 Common Lisp 中,打印整数一般用函数format。例如,上面的代码会往标准输出中打印出233这个数字: 1(format t "~D" 233) 除此之外,format还可以控制打印内容的宽度、填充字符、是否打印正负号等方面。例如,要控制打印的内容至少占据6列的话,可以用如下代码 1(format t "~6D" 233) 如果不使用字符串形式的 DSL,而是以关键字参数的方式来实现 -
为什么管Java叫单派发以及什么是多派发
众所周知,在 Java 语言中支持基于子类型的多态,例如某百科全书中就给了一个基于Animal及其两个子类的例子(代码经过我微微调整) 1234567891011121314151617181920212223242526abstract class Animal { abstract String talk();}class Cat extends Animal { -
直观地了解自己每天在吃上面的开销
众所周知,我用Emacs的ledger-mode来记账(参见以前的文章《程序员的记账工具——ledger与ledger-mode》)。作为一个出色的命令行报表工具,ledger的命令balance和register足以涵盖大部分的使用场景: balance可以生成所有帐号的余额的报表,用于每天与各个账户中的真实余额进行比较; register可以生成给定帐号的交易明细,用于在余额不一致时与真实账 -
git-log很好,你也可以写一个
序言作为一个天天都在用的工具,各位同行想必都非常熟悉 Git 的基本用法,例如: 用git-blame找出某一行 bug 是哪一位同事引入的,由他背锅; 用git-merge把别人的代码合进自己完美无瑕的分支中,然后发现单元测试无法跑通; 用git-push -f把团队里其他人的提交通通覆盖掉。 除此之外,Git 其实还是一个带版本功能的键值数据库: 所有提交的内容都存储在目录.git/ob -
-
屠龙术——如何运用整洁架构
序言或许是为了显摆,也或许是虚心学习,总之我在去年年初花了大约两个月读完了《架构整洁之道》。但读过后也仅仅就是读了而已,尽管书中描绘了一个名为整洁架构的软件架构,但我并没有理解并应用到实际的开发中去。书中的诸多理念最终都蛰伏在了我的脑海深处。 今年年初的时候我换了工作。新的单位给每人都配备了办公用的电脑,从此我也不用背着2公斤重的MacBook Pro通勤了。美中不足的地方是,我和cuckoo之间 -
模拟小于运算符的短路特性
忆往昔峥嵘岁月稠在Python的语言标准的Comparisions章节中提到 Also unlike C, expressions like a < b < c have the interpretation that is conventional in mathematics 也就是说,在C语言中要写成a < b && b < c的表达式,在Pyth -
从AOP到method-combination
“实战Elisp”系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教——如果真的有广大Emacs用户的话,哈哈哈。 Emacs的org-mode用的是一门叫Org的标记语言,正如大部分的标记语言那样,它也支持无序列表和检查清单——前者以-(一个连字符、一个空格)为前缀,后者以- [ ]或- [x]为前缀(比无序列表多了一对方括号及中间的字母x) 此外, -
非递归遍历二叉树到底有什么用
准备过互联网公司的服务端岗位面试的人,对于二叉树的三种遍历方式想必是如数家珍。假设以类BinaryTree定义一棵二叉树 12345class BinaryTree: def __init__(self, left, right, value): self.left = left self.right = right self.value = val -
当你SET的时候,Redis到底在SET些什么
准备过互联网公司的服务端岗位面试的人,对Redis中的5种数据类型想必是如数家珍。而网上很多面试题里也会出现这道题目 随着行业曲率的增大,光是知道有这些数据类型已经不够了,还得知道同一个类型也有不同的底层数据结构。例如同样是string类型,不同内容或不同长度会采用不同的编码方式: 123456789101112131415161718127.0.0.1:6379> SET key1 -
多重返回值的阵营九宫格
通常在糊业务代码的时候,不管是函数、方法,还是宏,都只会有一个返回值。比如在C语言用于检查一个字符是否为阿拉伯数字的isdigit函数就只会返回是(1)或否(0) 12345678910#include <ctype.h>#include <stdio.h>intmain(int argc, char *argv[]){ char c = 'a'; p -
终端看片指日可待
序言在旧文《如何写一个命令行的秒表》中,借助命令tput,我实现了“原地更新”所输出的时分秒的效果 其中用到的是ASCII转义序列\x1b[8D和\x1b[0K。除此之外,ASCII转义序列还有许多其它功能。例如,可以用来定制输出内容的前景色 将转义序列中的参数38改为48,可以定制输出内容的背景色 将打印内容改为两个空格,看起来就像是在一块黑色的画布上涂了一个红色的方块 既然如此,只要尺 -
此数绵绵无绝期——欧拉计划第66题
仅以此文膜拜八年前的自己 序言欧拉计划(Project Euler)就像LeetCode,是一个编程答题的网站。不同于LeetCode的是,欧拉计划只要求用户提交最终答案即可(一般是一个数字),而不需要完整代码。因此,可以尽情地使用自己喜欢的编程语言——不少题目甚至光靠笔和纸便能解决。 欧拉计划的第66题非常有意思,它的题目很简单,就是要求找出在不大于1000的整数中,以哪一个数字为丢番图方程 -
format,不只是格式化
《实战Common Lisp》系列主要讲述在使用Common Lisp时能派上用场的小函数,希望能为Common Lisp的复兴做一些微小的贡献。MAKE COMMON LISP GREAT AGAIN。 序言写了一段时间的Python后,总觉得它跟Common Lisp(下文简称CL)有亿点点像。例如,Python和CL都支持可变数量的函数参数。在Python中写作 12def foo(*