最近又对C产生了极大的兴趣,于是重读了《C Primer Plus 》。C的灵活和性能毋庸置疑,但是项目级程序还有一部分很有价值的东西是处理逻辑,这是脱离于语言实现而只存在于人脑子中的生产力,C在这方面就明显缺少表现手法了。或者说,可以表现,但是没有那么方便,不够Pythonic。
用惯了Python,感觉其所包含的基本对象已经能够满足大部分逻辑描述的需求,如果把Python源码中list、dict等基本对象的C代码抠出来,直接在C代码中调用函数接口其实就可以实现了。但是原始Python中中对对象包装的太好,如果还是在写C的角度,有些包装是不需要的,而且出于锻炼自己的角度,因此尝试自己写一点Pythonic的C module 出来。
基本思路如下:
1. 三个基本对象类型:
字符串: 包含C中的字符和字符串类型, 对应于Python中的string
整型:包含C中所有的整数类型,对应于Python中的int和long
浮点型: 包含C中所有浮点数类型,对应于Python中的float
** 其实,每个所谓的对象只是一个简单结构体,包含一个类型字符和一个指向任何实际值的指针:
typedef struct _Object{
char _type_;
void *value;
} Object;
2. 三个基本容器:
列表: 对应于Python中的list,添加一个frozen属性来对应tuple,其中的元素可以是三种基本对象或者三种基本容器中的任意一种
字典:对应于Python中的dict,set对应所有value都为None的字典,key必须是三种基本对象
树:这个。。。在Python中没有对应,但是我自己的项目中频频的用到树结构,我真切的希望能有一个方便的可直接调用生成数的结构,这也是我最近对C重新产生兴趣的原因。
** 对象的方法都用函数来替代,比如List_append(list, item)对应于list.append(item)
折腾了一天,300行C代码就实现了不到一半的"字符串"和"列表",实际使用类如:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "object.h"
#include "list.h"
int main(void){
char *str1 = "string1";
char *str2 = "string2";
char *str3 = "string3";
List *listP;
List_append(listP, StringObject(str1));
List_append(listP, StringObject(str2));
List_append(listP, StringObject(str3));
List_show(listP);
return 0;
}
编译后运行,就会输出:
<s:string1><s:string2><s:string3>
后续学习Python的dict实现来实现这里的字典,还需考虑实现内存池来避免频繁malloc。