当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 编程手记之ANSI C篇-(六)LISP宏解析LISP以其优美简洁的语法备受编程爱好者推崇,至今在许多基于脚本的解释环境中,LIisp语言的影子仍随处可见,在此仅讨论一个与LISP类似的宏公式解析,姑且称其为LISP宏吧,该LISP宏主要用于表单项目或网格列的自动计算。
 

 

    摘要:第一节--面向对象编程面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲.//haohappy注:喻指模块间的关联度过高,相互依赖性太强.更动一个模块导致其它模块也必须跟着更动.想像一下,如果有一个用来处理登录的模块允许一个信用卡处理模块......
 ·php5的对象模型[3]--定义一个类    »显示摘要«
    摘要:当你声明一个类,你需要列出对象应有的所有变量和所有函数—被称为属性和方法. 3.1.1中显示了一个类的构成. 注意在大括号({})内你只能声明变量或者函数. 3.1.2中显示了如何在一个类中定义三个属性和两个方法.3.1.1 class name extends another class { access variable declaration access function d......


编程手记之ANSI C篇-(六)LISP宏解析

编程手记之ansi c篇-(六)lisp宏解析

1.lisp宏文法 【程序编程相关:winform中树和数据库关联操作的例子

lisp以其优美简洁的语法备受编程爱好者推崇,至今在许多基于脚本的解释环境中,liisp语言的影子仍随处可见,在此仅讨论一个与lisp类似的宏公式解析,姑且称其为lisp宏吧,该lisp宏主要用于表单项目或网格列的自动计算. 【推荐阅读:COM+入门

lisp宏由一个函数体构成 【扩展信息:使用UML对系统进行建模

/************************************************************

eg: func1(param1,func2(parm,...),param2,...)

函数体由函数名与参数列表组成

lispnode --> funcname + "(" + {funcparam + ","} + ")"

参数可以为常数.变量或子函数体

funcparam --> lispnode | variable | consttoken

函数名由字母开头的字符串组成

funcname --> {a | b... | 1 | 2 ...}

变量由字母开头的字符串变量组成

variable --> {a | b | ... | 1 | 2 ...}

常数可以为数字常数或字符串常数

consttoken -> [stringtoken | numerictoken]

字符串常数由前后单括号与字符串组成

stringtoken --> "´" + {a | b... | 1 | 2 ...} + "´"

数字常数由数字与小数点组成

numerictoken --> {1 | 2 | ...}

*************************************************************/

2.lisp宏解析的终结符集合

/*define some terminated char*/

#ifndef nill

#define nill  _t(´\x02´)

#endif

/*define blank char for skiping*/

static tchar lispblankchar[] = {_t(´ ´),_t(´\t´),´\r´,_t(´\n´),nill};

/*define function name terminated char*/

static tchar lispfuncnameterm[] = {_t(´(´),_t(´\0´),nill};

/*define param terminated char*/

static tchar lispparamterm[] = {_t(´,´),_t(´)´),_t(´\0´),nill};

3.lisp宏数据结构定义

/*define lisp node struct*/

typedef struct _lispnode{

 link lk;  /*lisp node self link component*/

 link lkparams; /*lisp node param root link component*/

 int type;  /*lisp node tag eg: lnnull for nothing, lnstring,lnnumeric for const value, lnvar for variable item, lnnode for sub lisp node*/

 tchar* data; /*lisp node data, case lnstring data is const string token,case lnnumeric data is const numeric token,case lnitem data is variable name, case lnnode data is function name*/

}lispnode;

/*定义用于取得变量值的回调函数*/

typedef tchar* (*lispvarfetch)(const tchar* var,void* parm);

/*定义宏计算函数的统一样式*/

typedef tchar* (*lispfuncptr)(tchar* pa[],int size);

/*define lisp data struct*/

typedef struct _lispdata{

 link lk;  /*lisp data self link component*/

 linkptr ht;  /*lisp function set, storing in hash table*/

 linkptr ln;  /*lisp root node*/

 lispvarfetch vf; /*fetch outside variable value*/

 void* vfparma; /*variable fetch func callback param*/

}lispdata;

/*define lisp node type*/

typedef enum{lnnull = 0,lnnode = 1,lnvar = 2,lnstring = 3,lnnumeric = 4}nodetype;

/*定义从通用连接件中恢复数据节点*/

#define lispnodefromlink(p) ((lispnode*)((unsigned int)p - (unsigned int)&(((lispnode*)0)->lk)))

#define lispdatafromlink(p) ((lispdata*)((unsigned int)p - (unsigned int)&(((lispdata*)0)->lk)))


...   下一页
 ·php5的对象模型[5]--对象复制    »显示摘要«
    摘要:第五节--克隆php5中的对象模型通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,php定义了一个特殊的方法,称为__clone. 像__construct和__destruct一样,前面有两个下划线.默认地,用__clone方法将建立一个与原对象拥有相同属性和方法的对象. 如果你想在克隆时改变默认的内容,你要在__clone中覆写(......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE