搜索:
首页 >> JavaScript >> Js高级编程 >> 极致之美——百行代码实现全新智能语言Lisp

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

2010-7-13 作者:月影 来源:51js 投递文章

首先要解释一下:


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

正如标题所描述的,下文是关于用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),以及一个存放函数名称的堆栈组成。

1   2  3  4  5  6  7 下一页 尾 页
Tags:Lisp  javascript 
相关文章
手机版 Js高级编程 Asp之家 Aspxhome.com
闽ICP备06017341号