极致之美——百行代码实现全新智能语言第1/

时间: 作者:例化

  

[极致之美,百行代码实现全新智能语言]极致之美——百行代码实现全新智能语言第1/6页

  首先要解释一下:  
“极致之美”不是说月儿的这篇文章,因为本人还没有自大到这种程度:P,它形容的是Lisp和javascript结合的优美形态。

  
本来以下内容是要在无优首发的,但是不巧完成文章的当天忽然发现无优“弹”了,直到上周末才恢复=.=,由于不能等那么久,所以就先放到月儿在CSDN上的博客里去了。

  
正如标题所描述的,下文是关于用javascript实现类Lisp语言的技巧,然而重点不在于如何实现一门编程语言,而是在于通过思考和实现过程展示javascript的简洁灵活和Lisp的优美。

  
或许这里接触Lisp的人不多,因此不少人一定会对以下的内容或形式感到奇怪,如果你完全没有接触过它,不必过分惊讶,Lisp的确与以前你见过得所有编程语言不同,因为,呃,它是Lisp,独一无二的Lisp,一段优雅、简洁、完整、独立的奇妙思想,也许你会觉得它很难懂,但是一旦你懂了,你会喜欢上它的。

  
好了,下面开始我们的LispScript之旅~  
最近在网上偶然看到一篇文章,说javascript = C+Lisp,于是思考这样的问题,既然javascript包含着部分Lisp的血统,那么用javascript来实现一个类似于Lisp的人工智能脚本又会是什么样子?

  
LISt Processing语系作为一种“函数式”语系,自从诞生之日起便以其简单优美的风格和简洁高效的结构征服了许许多多的研究者和爱好者。

  
目前这种古老的语言和文法仍然被许许多多的人使用着并热爱着,而且在人工智能等领域发挥着非常巨大的作用。

  
我认为,javascript的灵活加上Lisp的简洁,应该能够创造出一种非常优美的语言,不过这种语言是什么样子的呢?相信大家也很想知道,那么下面我们一起来研究一下这个非常吸引人的问题。

  
(在仔细阅读下面的内容之前,建议大家先倒杯热茶,坐下来平静一下自己的心情,深呼吸一下,集中起精神来,因为下面的过程将是有趣而又颇耗脑细胞的...^^)  
在进入Lisp王国之前,让我们先来做一些javascrip的准备工作...请仔细阅读下面的代码  
NIL = [];  
Array.prototype.toEvalString = function()  
{  
if(this.length <= 0) return "NIL";  
var str = "";  
for (var i = 0; i < this.length; i++)  
{  
if(this[i] instanceof Array)  
str += "," + this[i].toEvalString();  
else str += "," + this[i];  
}  
return "[" + str.slice(1) + "]";  
};  
(function(){  
LispScript = {  
Run : run  
};  
function run(code)  
{  
if(code instanceof Array)  
{  
var elements = new Array();  
for (var i = 0; i < code.length; i++)  
{  
code[i] = run(code[i]); //递归向下读取  
if(code[i] instanceof Function) //解析表达式  
{  
if(code[i].length <= 0) //无参函数可省略[]直接以函数名称调用  
{  
code[i] = code[i].call(null);  
}  
else if(i == 0) //调用带参数的函数[funcall,args...]  
{  
return code[i].apply(null, code.slice(1));  
}  
}  
}  
return code;  
}  
return Element(code);  
};  
})();  
function Assert(msg, cond)  
{  
if(cond)  
return true;  
else  
{  
alert(msg);  
throw new Error(msg);  
}  
};  
function Element(arg)  
{  
if(arg == null)  
return [];  
else if(arg instanceof Function && arg.length <= 0)  
return arg.call(null);  
else  
return arg;  
};  
__funList = new Array();  
  
以上这段简简单单不过数十行的javascript代码由三个辅助函数、一个主体对象、一个常量NIL(后面我们会知道它表示一个空表或者逻辑false),以及一个存放函数名称的堆栈组成。

  
LispScript静态对象构成了LispScript解析器的主体,它只有一个Run方法,该方法用向下递归的方式解析传递进来的LispScript代码,代码的类型——相信细心的读者已经发现了——直接用的是javascript的数组,也就是一系列“[”、“]”和分隔符“,”构成的序列。

  
用javascript天然的数组特性,使得我们的解析器可以设计得十分简洁——不用去拆分和解析每一个token,于是一段简短到不到50行的代码惊人地实现了整个LispScript解析器的核心! (责任编辑:admin)

推荐图片Related

相关文章Related

查看更多热门新闻


首页 | js代码 | jQuery特效 | 其他代码 | 关于我们

Copyright © 2010-2019 菲娱国际平台 版权所有

系统要求:本站自适应各终端浏览器分辨率

请使用Google、Firefox、IE9、百度浏览器登录网站

网站地图 | RSS订阅 | 菲娱国际平台