构造Pythonic C module

最近又对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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值