Google

星期一, 八月 25, 2008

孟岩《来自巴西的Lua语言新星让我脸红》及网友评论

一种自由软件的脚本语言 Lua ,由于在游戏界日益成为主流脚本语言(得到著名的卢卡斯艺术公司两款游戏采用,并在GameDev.net的调查中高居脚本语言榜首),最近引起了业界的广泛关注。
Lua (葡萄牙语,义为月亮)是一种轻量级的强大的扩展语言,用纯ANSI C编写,最初版本只有6000行代码,却实现了垃圾收集、反射、面向对象等机制。Lua 是由巴西里约热内卢天主教大学计算机系的Roberto Ierusalimschy 等人于1993年开发的。
最近,Roberto Ierusalimschy 撰写的《Programming in Lua》一书也已经出版
---tangl_99

Python是荷兰人写的,Ruby是日本人写的,Lua是巴西人写的,我这个中国人只能在这里脸红。
---孟岩

不必人人制轮胎,难道你不想躺在轮胎做的吊床上休息?
---牡蛎

只选对的,不选贵的。
---路人甲

转载自tangl_99的blog孟岩的blog

Python是荷兰人写的,Ruby是日本人写的,Lua是巴西人写的,我这个中国人只能在这里脸红。
Lua是所有动态语言中间平均效率最高的一个。它最初是以Library的形式存在,纯粹只是用作C/C++的一个扩展。现在不仅发展出了解释器,还发展 出了编译器。游戏开发里Lua是使用最广泛的脚本语言。当世界上第一本Lua图书上市销售的时候,一位读者评价道:"Lua is a real gem."
(牡蛎到没有听过Lua、Python或者Ruby的编译器——.NET的冒牌货除外)

Lua很棒,Lua是巴西人发明的,这些都令我不爽,但是还不至于脸红,最多眼红。
让我脸红的是Lua的源代码,百分之一百的ANSI C,一点都不掺杂。在任何支持ANSI C编译器的平台上都可以轻松编译通过。我试过,真是一点废话都没有。
我1996年就学会了C,1997年就跑去研究Win32 API,后来是C++,STL,Java... 直到2002年看到C Interfaces and Implementations,才知道仅仅用ANSI C就可以实现一个强大的优美的library,直到2004年看到Lua的源代码才知道仅仅用ANSI C就可以实现一个非常快的虚拟机、非常棒的解释器/编译器和非常漂亮的语言实现。
这8年我都干什么去了?
---孟岩

http://www.chinaitpower.com/2005September/2005-09-13/204728.html

标签: , , , , , , ,

星期六, 四月 26, 2008

a+b=c跟c=a+b为什么不一样? C新新手问题

弹头:我要把a和b相加,然后赋值给c, 为什么我写成a+b=c就编译出错,写c=a+b就没有问题?? 这2个式子不一样么??为啥呢?谢谢

blankyao : 等号是赋值运算,不能把值赋给a+b
只能把a+b赋给c

弹头 : 我写成a+b=c出错阿,我是linux下gcc

lenovo : 哥们,有c语言教科书吗?
没有去买一本。

弹头 :
书上就说c=a+b这种,可是没说为啥?为啥a+b=c这种不行呢?

motalelf :
哥们我看好你哦。

当年我初学C,也这么问过老师,可能老师忙着去泡妞了,也没给我解释明白。

结果我C考试时也就糊里糊涂,最后不及格。


弹头: 难道说就是语法规定,没有什么为什么,必须这么写??

flw : 编程语言中借鉴了很多数学符号/概念,
但是这些符号和数学课本上的符号/概念还是有很大区别的。

就拿 = 这个符号来说,数学上把它叫做“等号”,
但是 C 语言里,它不是“等号”,而是“赋值号”,
C 语言里的“等号”是 ==,也就是两个等号连起来这样子。
== 满足交换律,c == a+b 和 a+b == c 是同一个意思,
但是 = 不满足交换律,它是有方向的,它的方向,代表了赋值的方向,
也就是数据存取的方向。

c=a 的意思是把 a 的值取出来,存入 c,
a=c 的意思是把 c 的值取出来,存入 a,
它们俩的含义显然是不同的。
反应到你的例子中,
c=a+b 就是把 a 和 b 的值取出来,进行加法运算,然后把结果存入 c,但是 a+b=c 是什么意思呢?难道是把 c 的值取出来存入 a+b 吗?
因为 a+b 不是一个变量,因此无法往里面存入值,
因此 a+b=c 是错误的。

等你后来慢慢学的深入了,就知道 a+b 其实是一个右值(right value),不是左值(left value),
因此不能往它里面存入(store)任何数据,但是 c 就是一个左值(left value),可以往里面存入(store)和它的类型相匹配的值。

一言以蔽之,计算机是“工科”,数学是“理科”,学习时要注意区别对待。计算机是实践性很强的一门科学,它不是纯理论,因此学习理论知识时,应该结合电脑硬件的基本工作流程来学习。
http://bbs.chinaunix.net/thread-1085912-1-1.html
最后:>>> 哲学问题。因为在新手眼里看起来这两个都是等式,没有什么分别。

偶要在新语言里设计符号:->和<-。分别用于赋值。 a+b->c;
c<-a+b;
至于C里常用的指针还是用pascal的^.吧。

标签:

星期二, 四月 03, 2007

libxslt教程

John Fleck

libxslt 0.4版的教程

版权所有,2001 John Fleck
翻译,2007 Ou Lanhui

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found here.

目录

介绍
主要功能
准备解析
解析样式表
解析输入文件
应用样式表
保存结果
参数
清理

附录 代码

摘要


使用libxslt库建立一个例程的教程是执行XSLT转换,将一个XML文件转换到HTML格式。

介绍

可扩展标记语言(XML)是全球信息网协会为了结构化文本格式数据交换工作而制订的标准。由于它的通用性,现在十分流行。每台电脑都可以读取文本文件。有正确的工具,任何一台电脑都可以阅读其它电脑的XML文件。

这些工具中最重要的之一就是XSLT:可扩展的样式表语言转换。XSLT是一种可声明的语言,允许你使用样式表将你的XML转换至任何一种文本输出。libxslt提供执行转换的相关函数。

libxslt是一个由Daniel Veillard为GNOME项目编写的免费的C语言库,允许你编写执行XSLT转换的程序。

注意

虽然libxslt是在GNOME项目的赞助之下编写的,但是它并不依赖于任何GNOME库。在本教程中就没有使用。

本教程举例说明了一个读取XML文件,应用样式表然后保存输出结果的简单程序。这不是一个你自己想要创的程序。xsltproc是在libxslt包所包含的一个做相同的事情但是更健壮和全功能的程序。本例中所编写的这个程序是为了说明libxslt的功能而设计的xsltproc的一个裁减版本的程序。

xsltproc的全部代码在libxslt发行包的xsltproc.c文件里。它也可以在网站上获得。

引用:

* W3C XML页面
* W3C XSL页面
* libxslt页面

主要功能

目录

准备解析
解析样式表
解析输入文件
应用样式表
保存结果
参数
清理

想转换一个XML文件,你必须执行以下三个函数:

1. 解析输入文件
2. 解析样式表
3. 应用样式表

准备解析

在你可以开始解析输入文件或者样式表之前,你需要执行一些步骤或者设置实体的处理方式。这些步骤对于libxslt来说不是唯一的。一些解析XML文件的libxml2程序可能会采用相似的步骤。

首先,你需要设置一些libxml的内部参数。传递一个整数1给xmlSubstituteEntitiesDefault函数,这将告诉libxml2的解析器置换实体内容就象解析你的文件。(传入0则libxml2不进行对应的置换)

其次,把xmlLoadExtDtdDefaultValue的值设成等于1。这将告诉libxml装载外部实体子集。如果你不这样做,当你的输入文件包含外部实体子集的时候,将会出错。

解析样式表

解析样式表使用一个简单的函数调用,需要一个xmlChar类型的变量:

cur = xsltParseStylesheetFile((const xmlChar *)argv[i]);

在这种情况下,我将从命令行参数传入的样式表文件名转换成xmlChar类型。返回值是xsltStylesheetPtr类型的值,是一个包含样式表树和其它关于样式表信息的内存结构。它可以被直接操作,但是在本例中不需要如此。

解析输入文件

使用一个函数调用解析输入的文件:

doc = xmlParseFile(argv[i]);

这个函数会返回一个xmlDocPtr类型的指针,一个包含文档树的内存结构。这个结构可以直接被操作,但是在这个例子里你不需要这样做。

应用样式表

现在你已经有表达文档的树和内存中的样式表了,可以对文档应用样式表了。实现这一功能的函数是xsltApplyStylesheet:

res = xsltApplyStylesheet(cur, doc, params);

这个函数使用一个xsltStylesheetPtr和一个xmlDocPtr类型做为参数,即前两个函数返回的值。第三个变量,params用来传入为样式表传入XSLT参数。它是一个空结束的静态字符串类型的名称/值对数组。

保存结果

libxslt包括了一族用来保存结果的函数。对于这个例子,使用了xsltSaveResultToFile,结果将被保存到:

xsltSaveResultToFile(stdout, res, cur);

注意

libxml也包含输出函数,如xmlSaveFile,它也可以在这里使用。然而,如果这里没有使用libxslt的保存函数,在样式表中包含的输出相关信息,如使用的编码声明就会丢失。

参数

在XSLT中,参数可以作为向样式表传递附加信息的途径之一。 libxslt允许将XSLT参数作为一个值传入xsltApplyStylesheet。

在教学的例程和xsltproc,就是教程例子所基于的那个程序,参数的传递采用键-值对来进行。程序从命令行收集这些内容,并将它们插入到params数组,然后将它们传给对应的函数。数组中的最后一个元素被设置成NULL。

注意

如果被传递的参数是一个字符串而不是XSLT节点,则它会被忽略。在教程的程序中,对于教程产生的程序,将如下实现:tutorial]$ ./libxslt_tutorial --param rootid "'asect1'" stylesheet.xsl filename.xml

清理

你完成这些工作之后,libxslt和libxml提供了释放已分配内存的函数。
xsltFreeStylesheet(cur);1
xmlFreeDoc(res);2
xmlFreeDoc(doc);3
xsltCleanupGlobals();4
xmlCleanupParser();5

1 释放你的样式表使用的内存。
2 释放结果文档使用的内存。
3 释放原始文档使用的内存。
4 释放libxslt全局变量使用的内存。
5 释放XML解析使用的内存。

附录. 源代码

libxslt_tutorial.c

/*
* libxslt_tutorial.c: demo program for the XSL Transformation 1.0 engine
*
* based on xsltproc.c, by Daniel.Veillard@imag.fr
* by John Fleck
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Cambridge, MA 02139, USA.
*
*/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include



extern int xmlLoadExtDtdDefaultValue;

static void usage(const char *name) {
printf("Usage: %s [options] stylesheet file [file ...]\n", name);
printf(" --param name value : pass a (parameter,value) pair\n");

}

int
main(int argc, char **argv) {
int i;
const char *params[16 + 1];
int nbparams = 0;
xsltStylesheetPtr cur = NULL;
xmlDocPtr doc, res;

if (argc <= 1) {
usage(argv[0]);
return(1);
}


for (i = 1; i < argc; i++) {
if (argv[i][0] != '-')
break;
if ((!strcmp(argv[i], "-param")) ||
(!strcmp(argv[i], "--param"))) {
i++;
params[nbparams++] = argv[i++];
params[nbparams++] = argv[i];
if (nbparams >= 16) {
fprintf(stderr, "too many params\n");
return (1);
}
} else {
fprintf(stderr, "Unknown option %s\n", argv[i]);
usage(argv[0]);
return (1);
}
}

params[nbparams] = NULL;
xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = 1;
cur = xsltParseStylesheetFile((const xmlChar *)argv[i]);
i++;
doc = xmlParseFile(argv[i]);
res = xsltApplyStylesheet(cur, doc, params);
xsltSaveResultToFile(stdout, res, cur);

xsltFreeStylesheet(cur);
xmlFreeDoc(res);
xmlFreeDoc(doc);

xsltCleanupGlobals();
xmlCleanupParser();
return(0);

}

原文在此。有一些地方翻译的有问题,欢迎指导。

标签: , , , , ,

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger