看起来,practical common lisp书里介绍的就是比较实用的方法了。
可以简省的首先是定义宏的部分。不妨试试看把所有的宏定义部分都跳过,
直接看涉及defmethod read-value与write-value的部分?
这方面,基本的思想就是,read-value与write-value接受这样几个
参数:字段名、类型、长度。它们根据不同的类型来进行不同的
存取,并且输出(返回)指定的值。可以看到,不同数据类型的
二进制存取机制是完全不同的,所以面向对象的多态性思想在此
很有用。
但我们也可以完全跳过面向对象思想。面向对象、多态性,在这
里的用途就是一个豪华级的cond或者case分发。所以,你可以用
cond或者case来代替面向对象,实现这个分发功能,也就是说,
根据不同的类型来进行不同的存取操作。
对二进制数据的整体marshal,这个功能在C语言里是内建的,
因为这是C语言的专属领域。同时,后来很多模仿C语言的“花括号”
语言也继承了这个功能。但是,lisp里没有,所以我们需要
专门写一个循环,在循环里写cond或者case,来一个一个字段
地marshal。
在读取时,如果你事先能肯定每个字段的二进制长度,那么也
可以考虑先按照它们的长度把它们切分开来,然后用mapcar来
一个个处理。
希望上述解释对你有用~
【 在 snoopyzhao (只打酱油,不兼职) 的大作中提到: 】
: 就是有一个(二进制)数据结构,大概这个样子:
: id: 定长字符串
: ver: 单精度符点数
: ...................
--
FROM 101.88.36.*