`
Lich_Ray
  • 浏览: 164085 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

古老,但很神奇

阅读更多
!我的圈子函数式编程の道已经建立,对 FP 感兴趣的人可以加入,共同探讨这一古老的新事物!
引用
写在前面的话:Scheme、函数式编程(FP) 已入门者无须阅读。
这是我很久以前在自己写的一篇文章,现在又拿出来,是为了在 JavaEye 上造势,让访客们看一看 Scheme & 函数式编程世界的精彩(如果还不知道什么的 FP 的话)——当然,我绝对没有要贬低其它语言(除了 Java)的意思,事实上我最喜欢的语言之一就是文中提到的 C。好了,不罗嗦了,让我们一起来推开 Scheme 那道门吧。造势之后,我会写文章,结束关于函数式编程语言效率问题的讨论,值得期待哦~~
PS: 文中的 C、Java 代码可能不可以运行,它们只是用来说明问题的。



剧本:《古老,但很神奇》
人物:XX大学计算机系的社友 Go4——8呆,F1,老农和小四。
时间:“晚汇报”时间…
(老农在计算机系混的时间不短了,可惜技术一直没长进——连打电脑游戏都“不上档次”(小四语)。这不,昨天打 CS 又被 F1 欺负了,现在正郁闷着呢。)

老农(上网无聊中):这年头,电脑好的人就是吃香啊~~(旁白)俺编程也差,游戏也差,废啦~~有了,上 CSDN.net,找点文章进修一下。
F1:老农,怎么样,CS 技术不行啊!好好练吧!
小四(推推眼镜):老农伯伯!算了吧,我看你还是把编程学学好吧,哈哈,你那本《数据结构》好像还是新的吧?
(老农翻着 CSDN 上最新的 Blog 文章,忽然眼睛一亮。)
小四:嘿,发现什么了?
老农(连忙把 Firefox 最小化):没什么,又不是黄网激动什么?!
老农(旁白):不错,就用这篇文章 K.O.他们。
老农(满脸堆笑):嘿,你们仨过来,我在网上发现一道数据结构方面的面试题目,想不想试试?
(正在上铺捧着 SIC P发呆的8呆忽然从发呆状态切换到亢奋状态,人啊~~)
8呆:少废话,快说!
老农(奸笑中):设计一个函数 visit_tail,要求通过一次遍历找到链表中倒数第n个节点,然后从它开始用函数 func 例遍后面的所有链表元素,链表可能相当大,可使用辅助空间,但是辅助空间的数目必须固定,不能和n有关。还有,为了简化问题,可以不给出链表的其它操作函数,比方说内存分配。
8呆(再次切换回发呆状态):无聊…这也配叫题目…
老农(怒):那你做啊!
(8呆在他的 SICP 上写了点什么,然后很潇洒地离开了寝室)
老农(专向另两个人):既然他不参加,那我们三个比吧。
小四、F1(信心实足):那现在开始计时吧。
…………
(老农把刚才背下来的代码改了改,花了3分钟抄在终端里)
老农(觉得时机移到):我好了,你们呢?
小四(大喊):解决解决!
F1:恩,我也好了,只是还没做单元测试。
(老农、小四(旁白):我说你是编程还是写软件啊~~)
(3个人凑在老农的电脑上开始比拼)
老农:你们看,我是用 C 写的,已经测试过的。思想是,用两根指针,第一根先出发,相距 n 步后第二根出发。然后同时步进,直到第一根指针达到末尾,然后用 func() 函数对第二个指针开始的子链表进行例遍。
(小四和 F1 仔细一看,大笑不止。老农的代码如下(注释是笔者所加,其实是F1和小四看到各句时的反应):)
typedef struct{ //哟,终于不用struct Node了,
    int data;
    Node * next;
} Node;
Node * visit_tail(iNode * head,int n,void (* func)(int cur)){ 
    //K&R 时代的函数指针,见到老佛爷啦!!Node *pfirst; 
    Node *psecond; //吓,终于用到匈牙利命名法了(老农:#!?%)
    pfirst=head;
    for(counter=0;counter<n;counter++){
        if(pfirst->next)
            pfirst=pfirst->next;
        else
            return NULL; //什么破编程风格,真实版初学者啊
    }

    psecond=head;
    while(pfirst!=NULL) {
        pfirst=pfirst->next;
        psecond=psecond->next;
    }
    for(int i=0;i < n; i++)
        (* func)(psecond.data);
        psecond=psecond->next;
    }
} //靠,一个函数解决所有问题,高耦合啊!

老农(再怒):小四少罗嗦!你的呢!拿出来啊?!
小四:在这儿,好好学学吧!
(大家一看,小四也用了 C,但…好漂亮啊。代码如下(注释是小四的解释):)
typedef T int
    //没有 C++ 一样“泛型”!

typedef struct {
    T data;
    Node * next;
} Node;

typedef struct {
    Node * pre;
    Node * curr; //当前结点与 List 绑定,不但可以分步例遍,还能保证正确初始化
} List;

void init_curr (List * l) {
    l->curr = l->pre; //什么叫“编程风格”,知道不?!
}

void visit (List *l, void (* func)(T data)) {
    while (l-curr) { //少用 !=NULL,这可是《The C Programing Language》上说的!
        (* func)(l-curr->data);
        l-curr = l->curr->next;
    }
} //使用内联结点的公用访问函数,降低耦合

void index (List * l, int n) {
    if (n) return NULL; //结点下标从1开始
    init_curr(l);
    if (n > 0) {
        for (int i = 0; i < n; i++) {
            curr = l->curr->next;
        }
    } //小四(自我陶醉):漂亮啊
    if (n < 0) {
        tmp = l->curr;
        for (int i = 0; i < n; i++) {
            tmp = tmp->next;
        }
        while (tmp) {
            l->curr = l->curr->next;
            tmp = tmp->next;
        }
    }
    return l->curr; //方便用户,增强鲁棒性能
}

void visit_tail (List * l, int n, void (* func)(T data)) {
    index(l, -n);
    visit(l, func);
} //多清爽

老农(口吐白沫):我的挽回面子计划就这么,完了…
小四(偷笑):你还是面对现实吧…
F1:小四你先别得意,我的你们还没拜读过呢!
(大家跑到 F1 电脑前一看,先是被长度吓了一跳,然后,无语。)

package datastruct.fifi.com.baidu.hi; //加入我的数据结构Java包

//当然只有包内成员才能创建Node对象
protected class Node {
    private Object data; //多态性,让你们的 typedef 去死吧!
    private Node next;

    //构造函数
    Node (Object data) {
        this.data = data;
    }

    //获取下一个元素
    public Node next () {
        return this.next;
    }

    //变换下一个元素,用户不能调用
    protected void setNext (Node o) {
        this.next = o;
    }

    //取数据
    public Object getData () {
        return this.data;
    }

    //换数据
    public void setData (Object data) {
        this.data = data;
    }

    //根据Effective Java的最高指导,要重写toString()方法
    public String toString () {
        return this.data.toString();
    }
}

//自定义异常类,数据结构下标越界
public class IndexOutOfRangeException extend IndexOutOfBoundsException {
    public IndexOutOfRangeException (int lower, int upper, int index) {
        super("Lower: " + lower +", Upper: " + upper + ", index: " + index);
    }
}

//用于被继承的访问类
public class Visitor {
    public operation (Object o) { //访问操作
        System.out.println(o);
    }
}

public class List {
    private Node preFix;
    private Node current;
    private int size;

    List () {
        current = preFix = new Node();
        size = 0;
    }

    //定位函数
    private void index (int i) throws IndexOutOfRangeException {
        if (i > size || i < -size-1) {
            thows new IndexOutOfRangeException(0, size+1, i);
        }
        this.init();
        if (i >= 0) {
            for (int j=0; j < i; j++) {
                current = current.next();
            }
        }
        if (i < 0) {
            i = - i - 1;
            for (int j=0; j < i; j++) {
                current = current.next();
            }
        }
    }

    //基本访问函数,需要一个继承自Visitor类的访问工具
    public visit (Visitor v) {
        while (current != null) { //Java拒绝看不懂的 while(curr) !
            v.operation (current.data());
            current = current.next();
        }
    }

    //访问后n个元素
    public visitTail (Visitor v, int n) {
        this.index(-n);
        this.visit(v);
    }
}

小四:靠!过分了!Java真是让程序员远离算法的祸首啊!爱好算法的人千万离它远些!
老农:反正我的“扬眉吐气”计划是泡汤了,你们想怎么讨论就怎么讨论吧。。。
小四:>_< 。。。
F1:we 得意。

(3人正在争执着,忽然门“吱”的一声(什么破门)开了,8呆走了进来。)
8呆:吵什么呢,比完了没?我是第一吧?
F1、小四、老农:什么啊,你不是自顾自走了啦?!
8呆(诧异):我走之前已经写好啦。
(8呆拿来他的 SICP,递给三人。只见上面写了两行 Scheme 代码:)
(define (list-visit-tail func n l)
    (map func (list-tail l (- (length l) n))))


(编辑公曰:上面这段 Scheme 代码滴意思斯酱紫滴:先定义一个名为 list-visit-tail 的过程,然后用内置宏 list-tail 取 list 的后 n 位组成 list 返回,再用操作 map 进行例遍。过程 map 是列表基础操作,实现也就3行;它不改变列表本身,而是返回操作后的列表。不改变状态是函数式编程的精髓。)
(完)

结语:
这个题目其实对于任何函数式编程语言来说都是一两句话。Scheme、Haskell它们都来自于世界上第二古老的语言 Lisp,但它们的思想博大精深——基于 lambda 演算理论的函数式编程,古老,但很神奇。

参考资料:
老农说的“这篇文章”:一次遍历找链表倒数第n个节点

8呆的书SICP:Structure and Interpretation of Computer Programs

命令式语言的劣势:为何 Java(以及很多其他编程语言)令人不爽

函数式语言的优势:为什么函数式编程至关重要?

Scheme 入门推荐书:Teach Yourself Scheme in Fixnum Days

如果你还没学过编程的话:How to Design Programs

如果你对函数式编程语言的效率有疑虑:
函数式语言:我的性能没问题 (一)

其它有关 Scheme 的东东详见:我的 Scheme 学习笔记 (1  2  3  4  5)
(官网可能暂时关闭)
分享到:
评论
29 楼 ray_linn 2007-07-17  
那么我请问你,推出这个结论:这个题目其实对于任何函数式编程语言来说都是一两句话。是不是需要上面大篇大篇的Java, C 和C++代码。

根据你的逻辑,作者应该把所有函数式语言的例子都书写一遍,而不是用java  c和C++的代码。单从汉语的语法结构上来,论据不支持论点,这篇文章难道不算写得不好吗?

事实上,作者把java c 和C++代码列在这里,做四者之间的比较之意是司马昭之心,你又何必强辩?只是他选的例子根本不恰当,书写的代码也根本不合理,结果被我揪出了毛病。

天天扣分封我id也不怕。
28 楼 lonelyblue 2007-07-17  
Lich_Ray 写道
我绝对没有要贬低其它语言(除了 Java)的意思


就凭这句话 就该给你扣上愤青的帽子!
27 楼 lszone 2007-07-16  
你们都钻到牛角尖里去
26 楼 cat 2007-07-13  
好久没看吵架了……
25 楼 ray_linn 2007-07-13  
Trustno1 写道
ray_linn 写道
Trustno1 写道
引用
请仔细读一下他自己写的结论:

这个题目其实对于任何函数式编程语言来说都是一两句话。

这个结论有任何问题么?
他的结论说,对于上述链表问题任何函数式语言都是一两句话.并没有说,非函数式语言对于上述链表问题不可能用一两句话实现.如果你说他错,就应该指出哪些函数语言不是一两句话,而不是什么C#能用1句话实现.这难道不是典型的答非所问么?



好吧,那我修改我的结论:作者java的功底太臭,才写出那么烂的代码。这下你满意了吧?



引用
我认为我已经对这篇文章做了适当的批判,能读完文章的人自然自己能有所取舍,和你的纠缠已经毫无意义了。


?????


你非要争论,那我就改变主意啊,我的主意变得很快的。而且我这人问过则喜,你既然说我指摘的地方不对,那只能闻过则改,指摘一个对的地方吧?
24 楼 Trustno1 2007-07-13  
ray_linn 写道
Trustno1 写道
引用
请仔细读一下他自己写的结论:

这个题目其实对于任何函数式编程语言来说都是一两句话。

这个结论有任何问题么?
他的结论说,对于上述链表问题任何函数式语言都是一两句话.并没有说,非函数式语言对于上述链表问题不可能用一两句话实现.如果你说他错,就应该指出哪些函数语言不是一两句话,而不是什么C#能用1句话实现.这难道不是典型的答非所问么?



好吧,那我修改我的结论:作者java的功底太臭,才写出那么烂的代码。这下你满意了吧?



引用
我认为我已经对这篇文章做了适当的批判,能读完文章的人自然自己能有所取舍,和你的纠缠已经毫无意义了。


?????
23 楼 ray_linn 2007-07-13  
Trustno1 写道
引用
请仔细读一下他自己写的结论:

这个题目其实对于任何函数式编程语言来说都是一两句话。

这个结论有任何问题么?
他的结论说,对于上述链表问题任何函数式语言都是一两句话.并没有说,非函数式语言对于上述链表问题不可能用一两句话实现.如果你说他错,就应该指出哪些函数语言不是一两句话,而不是什么C#能用1句话实现.这难道不是典型的答非所问么?



好吧,那我修改我的结论:作者java,C, C++的功底太臭,才写出那么烂的代码,或者是故意写这样代码,来给非函数式语言摸黑?这下你满意了吧?
22 楼 Trustno1 2007-07-13  
ray_linn 写道

我只证明他的例子不恰当,我并不想说C#比lisp高级,请你注意,不要在话题在引入到无意义的逻辑学纠缠里去。

既然你仍然在强调证明,那么你自然要有一个证明的过程.如果证明的过程逻辑都是错的,怎么能相信的你的结论正确?
21 楼 Trustno1 2007-07-13  
引用
请仔细读一下他自己写的结论:

这个题目其实对于任何函数式编程语言来说都是一两句话。

这个结论有任何问题么?
他的结论说,对于上述链表问题任何函数式语言都是一两句话.并没有说,非函数式语言对于上述链表问题不可能用一两句话实现.如果你说他错,就应该指出哪些函数语言不是一两句话,而不是什么C#能用1句话实现.这难道不是典型的答非所问么?
20 楼 ray_linn 2007-07-13  
Trustno1 写道
ray_linn 写道
Trustno1 写道

问题是,这篇文章难道不是就在说FP适合什么,java/c不适合什么.
有说FP一切都比java/c强么?



错。这篇文章根本没有说到重点,FP适合什么,java和C不适合什么,正如我说的假如java和C#都有一个内置的tail方法,那么java和C#的长度就和FP一样精炼,所以我举个反例,C#有个XmlSerilizae的方法,在处理XML自然比lisp精炼,从这篇文章里,我是不是只可以得出lisp的优点在于有list-tail函数?

我只证明他的结论是错的,这就够了,一篇文章结论是错误的,就没什么好说的。请仔细读一下他自己写的结论:



问题是你的证明在那里呢?你说tail的C# lisp的内置实现作者没有详细的论证所以说作者提出的观点和例子都是错误的.那么请看你现在提出在上XmlSerilizaeC#要比Lisp精炼.请问你这个结论有没有详细的证明过?你不同样抛出了一个没有证明的反例?




我只证明他的例子不恰当,我并不想说C#比lisp高级,请你注意,不要在话题在引入到无意义的逻辑学纠缠里去。

我认为我已经对这篇文章做了适当的批判,能读完文章的人自然自己能有所取舍,和你的纠缠已经毫无意义了。
19 楼 Trustno1 2007-07-13  
ray_linn 写道
Trustno1 写道

问题是,这篇文章难道不是就在说FP适合什么,java/c不适合什么.
有说FP一切都比java/c强么?



错。这篇文章根本没有说到重点,FP适合什么,java和C不适合什么,正如我说的假如java和C#都有一个内置的tail方法,那么java和C#的长度就和FP一样精炼,所以我举个反例,C#有个XmlSerilizae的方法,在处理XML自然比lisp精炼,从这篇文章里,我是不是只可以得出lisp的优点在于有list-tail函数?

我只证明他的结论是错的,这就够了,一篇文章结论是错误的,就没什么好说的。请仔细读一下他自己写的结论:



问题是你的证明在那里呢?你说tail的C# lisp的内置实现作者没有详细的论证所以说作者提出的观点和例子都是错误的.那么请看你现在提出在上XmlSerilizaeC#要比Lisp精炼.请问你这个结论有没有详细的证明过?你不同样抛出了一个没有证明的反例?



18 楼 ray_linn 2007-07-13  
Trustno1 写道

问题是,这篇文章难道不是就在说FP适合什么,java/c不适合什么.
有说FP一切都比java/c强么?



错。这篇文章根本没有说到重点,FP适合什么,java和C不适合什么,正如我说的假如java和C#都有一个内置的tail方法,那么java和C#的长度就和FP一样精炼,所以我举个反例,C#有个XmlSerilizae的方法,在处理XML自然比lisp精炼,从这篇文章里,我是不是只可以得出lisp的优点在于有list-tail函数? 甚至C#根本也不需要那个tail函数,看我的代码,是不是也完全实现了,甚至还可以用delegate替换掉Math.Sqrt.

foreach(int i in list.GetRange(list.Length-4,4)) Math.Sqrt(i);


一个完全不恰当的例子,怎么能说明FP适合什么,java不适合什么,这不是误人子弟么?

这篇文章比“殊途同归,四个程序员的一天”要差,那篇文章用的运算符重载的例子来说明FP里一切都是函数。


我只证明他的结论是错的,这就够了,一篇文章结论是错误的,就没什么好说的。请仔细读一下他自己写的结论:

这个题目其实对于任何函数式编程语言来说都是一两句话。
17 楼 ray_linn 2007-07-13  
Lich_Ray 写道
To ray_linn:
意义在于引起你的兴趣。既然你看问题看地如此“清楚”,觉得“特别没意义”,那我也不说什么了。反正上帝只关心他自己的选民,SICP 只需要它自己的教徒。我不会在这儿把书中实现这些内置函数和宏的几行代码都抄过来,而且我也不指望所有看了这篇文章的人都能就此更新一下思想。
以上是我写这篇文章的一些想法。不知道我的话又触动了 ray_linn 哪根神经了。

PS: 不要企图以“那就不要用到内置函数和宏,从原生语言开始比起吧”之类的话来评判 Lisp。FP 不会一切强于命令式语言,但从语言语义角度来说,使用抽象语法的语言是完全自足的,语义与图灵机也是等价的——所以请不要拿鸡蛋砸石头

引用
如果是我说的Object系列化成XML (偏向C#),那lisp肯定占不了优势

这就是“拿鸡蛋砸石头”的一个例子。看看这个:为什么是 XML 而不是 Lisp?!



要让人感兴趣,就麻烦写出点有真材料的文章。文章写的不好,难道还不许别人指摘吗???

第一,这篇文章无非是仿效天极网中“殊途同归, 四个程序员的一天”写出来的,也不算是什么原创了。

第二,你的代码明天有问题,为什么要让C C++ java去定义它们的链表,你的Lisp却直接使用list,在java中我直接使用ArrayList,你的java代码要少多少行?

第三,你文章中明显以程序长短来做评判,而中间却用了这么多偷步的方法,我已经证明,在同样条件下,java, C# ,C++也都是一行就搞定。从而你文章后面的结论:这个题目其实对于任何函数式编程语言来说都是一两句话,是正确的,还是误导的?


第四,要单纯论证FP的好处,还不如去讨论C# 3.0中的FP特性,为什么要在oop中引入FP。
16 楼 Trustno1 2007-07-13  
Elminster 写道
话说眼看这 FP 和 lambda 演算大行其道,命令式语言和图灵机已经快和微软一样成为腐朽没落的代表了呀。嗯嗯,看来是该考虑写一篇“帝国反击战:命令式语言和图灵机的逆袭”了 ……


未....未可的亚.Fp是IT界的凉宫春日亚.在你那无耻的逆袭到来之前,你便会被它那在众人面前盛氣凌人,兩人獨處的時嬌羞可人的傲娇的萌性所一击萌杀.所以你这没有领悟到高层次萌道的劣者觉悟吧.口瓦口哈口哈,萌就是王道,可爱就是正义.
15 楼 Elminster 2007-07-13  
话说眼看这 FP 和 lambda 演算大行其道,命令式语言和图灵机已经快和微软一样成为腐朽没落的代表了呀。嗯嗯,看来是该考虑写一篇“帝国反击战:命令式语言和图灵机的逆袭”了 ……

14 楼 Trustno1 2007-07-12  
Lich_Ray 写道
To ray_linn:
意义在于引起你的兴趣。既然你看问题看地如此“清楚”,觉得“特别没意义”,那我也不说什么了。反正上帝只关心他自己的选民,SICP 只需要它自己的教徒。我不会在这儿把书中实现这些内置函数和宏的几行代码都抄过来,而且我也不指望所有看了这篇文章的人都能就此更新一下思想。
以上是我写这篇文章的一些想法。不知道我的话又触动了 ray_linn 哪根神经了。

PS: 不要企图以“那就不要用到内置函数和宏,从原生语言开始比起吧”之类的话来评判 Lisp。FP 不会一切强于命令式语言,但从语言语义角度来说,使用抽象语法的语言是完全自足的,语义与图灵机也是等价的——所以请不要拿鸡蛋砸石头

引用
如果是我说的Object系列化成XML (偏向C#),那lisp肯定占不了优势

这就是“拿鸡蛋砸石头”的一个例子。看看这个:为什么是 XML 而不是 Lisp?!


我觉得呢,你推广lisp,fp是好的.不过要分清两种目的,是纯粹的理论学习还是在现实中寻求某些应用.理论学习在空余的时候大家讨论讨论增广一点见识扩展一下思维,锻炼一下脑子是非常有趣而优雅的事情,不必要做的那么你死我活针锋相对.
寻求某些应用,光推纯粹的FP语言效果并不好,lisp乃至大多数FP语言在那么长的时间里不为大家所闻也是有他们自身内在缺陷的.但是我们也要看到好的一面,现在ruby python动态语言广泛传播开来FP的很多特性也在这些语言里面大放光彩,甚至C#3这些静态语言也有lambda.要从应用推广FP,在这方面入手,去发掘FP特性在系统架构设计上的优势,没有这些特性的时候我们怎么设计,我们有了这些特性以后又怎么设计?.甚至你也可以分析这些语言在FP特性实现上的不足,然后假设性去分析如果为这些语言扩展某些不具备的FP特性,能不能达到更好的效果?如果可以,自己又如何去实现他们?

相对对你在圈子上的那句话,我觉得还是Alan Kay说的更好"The best way to predict the future is to invent it"


13 楼 Lich_Ray 2007-07-12  
To ray_linn:
意义在于引起你的兴趣。既然你看问题看地如此“清楚”,觉得“特别没意义”,那我也不说什么了。反正上帝只关心他自己的选民,SICP 只需要它自己的教徒。我不会在这儿把书中实现这些内置函数和宏的几行代码都抄过来,而且我也不指望所有看了这篇文章的人都能就此更新一下思想。
以上是我写这篇文章的一些想法。不知道我的话又触动了 ray_linn 哪根神经了。

PS: 不要企图以“那就不要用到内置函数和宏,从原生语言开始比起吧”之类的话来评判 Lisp。FP 不会一切强于命令式语言,但从语言语义角度来说,使用抽象语法的语言是完全自足的,语义与图灵机也是等价的——所以请不要拿鸡蛋砸石头

引用
如果是我说的Object系列化成XML (偏向C#),那lisp肯定占不了优势

这就是“拿鸡蛋砸石头”的一个例子。看看这个:为什么是 XML 而不是 Lisp?!
12 楼 Trustno1 2007-07-12  
ray_linn 写道

你的第一个引用:这个例子本身就是比较偏向FP的例子,......,语言都是有它的使用范围,代码长度说明不了什么---》这文章无意义。

问题是,这篇文章难道不是就在说FP适合什么,java/c不适合什么.
有说FP一切都比java/c强么?



引用
假使真的要比较长度,那就不要用到内置函数和宏,从原生语言开始比起吧,文章根本无法证明这点


引用
如果是我说的Object系列化成XML (偏向C#),那lisp肯定占不了优势

既然你说别人没有证明他的观点所以他无意义,那么你的上面那个观点有没有证明?是不是也是无意义的?


11 楼 ray_linn 2007-07-12  
Trustno1 写道
ray_linn 写道
从代码长度来说明一种语言的优劣毫无意义
 

====>>>>>

ray_linn 写道
文章中并没有说明,所以这文章有何意义??


????????




没啥好?????


你的第一个引用:这个例子本身就是比较偏向FP的例子,如果是我说的Object系列化成XML (偏向C#),那lisp肯定占不了优势,语言都是有它的使用范围,代码长度说明不了什么---》这文章无意义。


第二个引用:假使真的要比较长度,那就不要用到内置函数和宏,从原生语言开始比起吧,文章根本无法证明这点---》这文章无意义。
10 楼 Trustno1 2007-07-12  
ray_linn 写道
从代码长度来说明一种语言的优劣毫无意义
 

====>>>>>

ray_linn 写道
文章中并没有说明,所以这文章有何意义??


????????


相关推荐

    神奇的DOS程序.rar

    在IT领域,DOS(Disk Operating System)是一个古老但至关重要的操作系统,它是个人计算机早期广泛使用的命令行界面。"神奇的DOS程序.rar"这个压缩包文件,显然包含了一些能够带给我们惊喜和回忆的DOS应用程序。让...

    神奇的圆柏作文.doc

    这篇作文的标题"神奇的圆柏"显然讲述的是一棵具有特殊意义和特征的古老圆柏树。圆柏,又称桧柏,是柏科圆柏属的一种常绿乔木,常见于中国的许多地方,因其耐寒、耐旱、寿命长而受到人们的敬仰。在本文中,作者描述的...

    中华文明的神奇力量.docx

    中华文明,作为世界上最古老的文明之一,拥有着无尽的神奇力量。这种力量体现在人们生活中的一种核心价值观,那就是“回家过年”。这个习俗,跨越了几千年的历史,承载着中华民族的精神内核,是中华文化独特魅力的...

    幻方算法 神奇的幻方

    幻方,又称“魔方”或“纵横图”,是一种古老的数学游戏,起源于中国的洛书,距今已有数千年的历史。这种游戏的核心是将一系列数字按照特定规则填入一个正方形格子中,使得每行、每列以及对角线上的数字之和都相等。...

    小学数学数学故事一个古老的数学游戏

    当你松开腰带,神奇的事情发生了——无论观众如何尝试,都无法像你一样让铅笔被腰带牢牢套住,铅笔总是会在腰带拉直后滑到外面去。这就是这个游戏的神秘之处,也是其吸引人的地方。 揭秘这个游戏的关键在于拓扑学的...

    由孙子神奇妙算诱导出的密码门限方案.pdf

    它为我们提供了一种独特的视角,帮助我们在不断演变的网络威胁环境中,运用古老的智慧来构建和维护更加坚固的安全防线。通过阅读这本书,读者不仅可以学习到密码学的基本原理,还能掌握一套实战性强、富有创新的安全...

    小学数学四年级神奇的计算工具PPT教案.pptx

    在小学数学四年级的教学中,神奇的计算工具是孩子们学习数学运算的重要辅助手段。这个主题主要介绍了计算工具的发展历程,从古老的中国算筹到现代的电子计算器,旨在帮助学生理解计算工具的重要性,并学会正确使用...

    关于圣诞节圣诞老人的神奇传说.doc

    关于圣诞节和圣诞老人的神奇传说,这是一个深深植根于西方文化中的传统,承载着欢乐、爱与给予的精神。圣诞老人的形象源于多个历史人物和神话故事的融合,他的故事跨越了千年的时空,从古老的北欧神话到现代的节日...

    中医-砭石的神奇养生功效.doc

    【中医-砭石的神奇养生功效】 中医理论中,砭石是一种古老的医疗工具,源于石器时代,被誉为中医六大医术之一。它以其独特的物理性质对人体产生诸多益处,包括按摩、热疗、生物学作用以及其他多种健康效益。下面将...

    神奇的数字能量学.doc

    8. **注意事项**:尽管数字能量学提供了理解生活的新视角,但其科学性仍有争议。在运用数字能量学时,应保持理性,避免盲目迷信,同时结合实际生活经验进行判断。 通过以上解析,我们可以理解数字能量学不仅是古代...

    神奇汉字起源——字之初本为画.ppt

    【神奇汉字起源——字之初本为画】 汉字,这一古老且独特的文字系统,其起源充满了神秘与智慧。古人通过各种方式记录生活,其中最原始的形式就是“画”,即以图画来表达意思。印度前总理尼赫鲁曾对其女儿讲述汉字的...

    幻方 C++

    "幻方 C++" 是一个涉及编程语言C++与古典数学概念的主题,主要探讨如何用C++实现一种古老的数学游戏或挑战,即构建幻方。幻方是一种将数字填入正方形格子中,使得每行、每列以及对角线上的数字之和都相等的数阵。在...

    神奇的七巧板教案.doc

    1. **七巧板教学**:七巧板是一种古老的智力玩具,由七个不同的形状组成,可用于拼接各种图形。在这个教案中,它被用来培养学生的观察力、动手能力和创新思维。 2. **活动目的**:通过七巧板的教学,目标是让学生...

    2019_2020学年高中语文第三课神奇的汉字2规矩方圆__汉字的简化和规范练习含解析新人教版选修语言文字应用

    汉字,作为世界上最古老的文字之一,其发展历程充满了神奇和智慧。2019-2020学年高中语文第三课探讨了汉字的简化和规范这一重要主题。汉字的简化与规范是中国汉字文化发展的重要里程碑,旨在提高书写效率,便于大众...

    人民版政治八年级(下)第八课《黄土的厚重》第1课时-《神奇的西部》[2].ppt

    - 元谋人距今约170万年,是中国境内发现的最古老的古人类化石。 - 这些发现表明,西部地区不仅是中华文明的重要发源地,也是人类文明早期发展的重要区域。 ### 4. 教育目标 - **知识与技能**: - 通过本课程的...

    新人教统编版五四制五年级下册语文 习作:神奇的探险之旅教学反思.docx

    《神奇的探险之旅》这篇习作是针对五年级下册语文教学的重要组成部分,旨在培养学生的想象力和创造力,同时锻炼他们的叙事技巧。在这个教学过程中,教师需要关注以下几个关键知识点: 1. **情境创设**:首先,教师...

    一个古老的编程游戏:Python-Challenge全通攻略.docx

    玩家需要通过解决一系列谜题来解锁新的关卡,这些谜题通常涉及到编程知识,尽管游戏名为Python Challenge,但实际上并不仅限于使用Python语言解答。 #### 二、关卡解析 ##### 第0关 - **提示**: “a猜238,说是38...

    神奇的七巧板flash动画

    这款课件利用了传统的中国益智玩具——七巧板,将古老的智慧与现代的数字技术相结合,创造出一种寓教于乐的学习体验。 七巧板,又称为“唐图”,是中国古代流传下来的一种智力游戏,由七个不同形状的平面木块组成:...

    william-morris_神奇的水岛:威廉·莫里斯(William Morris)撰写的《神奇岛之水》的标准电子书版本的Epub来源

    《神奇的水岛》是英国著名设计师、诗人和作家威廉·莫里斯(William Morris)的一部文学作品。...同时,这也展示了技术如何与艺术和文化相结合,使古老的作品以新的形式呈现,让更多人能够方便地接触和欣赏。

    IE6网页神奇BUG

    IE6作为一个古老的浏览器,因其不兼容现代Web标准和大量的bug而臭名昭著。在标题中提到的“IE6网页神奇BUG”,可能涉及到了特定情况下IE6不显示网页内容的问题,而这种情况在IE7中不存在。问题描述中提到了一个有趣...

Global site tag (gtag.js) - Google Analytics