欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

極致之美——百行代碼實現(xiàn)全新智能語言第5/6頁

 更新時間:2007年03月14日 00:00:00   作者:  

復制代碼 代碼如下:

為了學習,測試上面的ListScript,我寫了一個命令環(huán)境

<script>
NIL = [];

Array.prototype.toEvalString = function()
{
if(this.length <= 0) return "NIL";
var str = "";
for (var i = 0; i < this.length; i++)
{
  if(this instanceof Array)
   str += "," + this.toEvalString();
  else str += "," + this;
}
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 = run(code); //遞歸向下讀取
    if(code instanceof Function)  //解析表達式
    {
     if(code.length <= 0) //無參函數(shù)可省略[]直接以函數(shù)名稱調用
     {
      code = code.call(null);
     }
     else if(i == 0)  //調用帶參數(shù)的函數(shù)[funcall,args...]
     {
      return code.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();


/////////////////
quote = _ = function(args)
{
if(arguments.length < 1)
  return [];
else if(arguments.length >= 1)
{
  return arguments[0];
}
};

//[atom,x]返回原子true如果x的值是一個原子或是空表,否則返回[]. 在Lisp中我們按慣例用原子true表示真, 而用空表表示假.
atom = function(arg)
{
var tmp = LispScript.Run(arg); //先對參數(shù)求值

if(!(tmp instanceof Array) || tmp.length <= 0)
  return true;
else
  return [];
};

//[eq,x,y]返回t如果x和y的值是同一個原子或都是空表, 否則返回[].
equal = eq = function(arg1, arg2)
{
var tmp1 = LispScript.Run(arg1);
var tmp2 = LispScript.Run(arg2);   //先對參數(shù)求值

if(!(tmp1 instanceof Array) && !(tmp2 instanceof Array) && 
  tmp1.toString() == tmp2.toString() || 
  (tmp1 instanceof Function) && (tmp2 instanceof Function) && tmp1.toString() == tmp2.toString() ||
  (tmp1 instanceof Array) && (tmp2 instanceof Array) && (tmp1.length == 0) && (tmp2.length == 0))
  return true;
else
  return [];
};

//[car,x]期望x的值是一個表并且返回x的第一個元素.
car = function(arg)
{
var tmp = LispScript.Run(arg);  //先對參數(shù)求值

if(tmp instanceof Array && tmp.length > 0)
  return tmp[0];
else
  return [];
};

//[cdr,x]期望x的值是一個表并且返回x的第一個元素之后的所有元素.
cdr = function(arg)
{
var tmp = LispScript.Run(arg);  //先對參數(shù)求值

if(tmp instanceof Array && tmp.length > 0)
  return tmp.slice(1);
else
  return []; 
};

//[cons,x,y]期望y的值是一個表并且返回一個新表,它的第一個元素是x的值, 后面跟著y的值的各個元素.
cons = function(arg1, arg2)
{
var tmp1 = LispScript.Run(arg1);
var tmp2 = LispScript.Run(arg2);   //先對參數(shù)求值

if(tmp2 instanceof Array)
{
  var list = new Array();
  list.push(tmp1);
  return list.concat(tmp2);
}
else
  return [];
};

/*
[cond [...] ...[...]] 的求值規(guī)則如下. p表達式依次求值直到有一個返回t. 如果能找到這樣的p表達式,相應的e表達式的值作為整個cond表達式的返回值.

*/
cond = function(args)
{
for (var i = 0; i < arguments.length; i++)
{
  if(arguments instanceof Array)
  {
   var cond = LispScript.Run(arguments[0]);  //先對參數(shù)求值
   //alert(cond);
   if(cond == true && arguments[1] != null)
    return LispScript.Run(arguments[1]);
  }
}
return [];
};

//則稱為函數(shù)調用.它的值計算如下.每一個表達式先求值,然后e再求值.在e的求值過程中,每個出現(xiàn)在e中的的值是相應的在最近一次的函數(shù)調用中的值.
lambda = function(args, code)
{
if(code instanceof Array)
{
  var fun = new Function(args, 
   "for(var i = 0; i < arguments.length; i++) arguments = LispScript.Run(arguments);return LispScript.Run("+code.toEvalString()+");");

  var globalFuncName = __funList.pop();

  fun._funName = globalFuncName;

  if(globalFuncName != null)
   self[globalFuncName] = fun;

  return fun;
}

return [];
};

</script>
<script>
        var prompt = '>';
        function initPrompt()
        {
                if(cmd.value == '')
                        cmd.value = prompt;
        }
        function runLastCmd()
        {
                if(window.event.keyCode == 13)
                {
                        window.event.returnValue = false;

                        var idx = cmd.value.lastIndexOf('\n') + 1;
                        idx += prompt.length;

                        var strCmd = cmd.value.substr(idx);
                        var output = '';
                        try
                        {
                                var lisp = eval(strCmd);
                                if(lisp instanceof Array)
                                {
                                         output = LispScript.Run(lisp);
                                }
                                else
                                {
                                        output = '未知命令';
                                }
                        }
                        catch(e)
                        {
                                output = '語法錯誤';
                        }
                        if(output instanceof Array)
                        {
                                output = '[' + output + ']';
                        }
                        cmd.value += '\n' + output + '\n' + prompt;
                }

        }
</script>
<textarea id=cmd style="width:600px;height:600px" onkeydown="runLastCmd()" onclick="initPrompt()">
</textarea>

相關文章

  • JS如何輸出26個英文字符

    JS如何輸出26個英文字符

    這篇文章主要介紹了JS如何輸出26個英文字符問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 小程序實現(xiàn)搜索框

    小程序實現(xiàn)搜索框

    搜索框無論是在電商網(wǎng)站還是小程序中都很常見,這篇文章主要就為大家詳細介紹了小程序如何實現(xiàn)搜索框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Javascript閉包演示代碼小結

    Javascript閉包演示代碼小結

    有個網(wǎng)友問了個問題,如下的html,為什么點擊所有的段落p輸出都是5,而不是alert出對應的0,1,2,3,4。
    2011-03-03
  • 判定對象是否為window的js代碼

    判定對象是否為window的js代碼

    這是一個非常有趣的題目。我們先從Object.prototype.toString入手,看能否解決它。
    2010-02-02
  • JS設計模式之數(shù)據(jù)訪問對象模式的實例講解

    JS設計模式之數(shù)據(jù)訪問對象模式的實例講解

    下面小編就為大家?guī)硪黄狫S設計模式之數(shù)據(jù)訪問對象模式的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 瀏覽器復制插件zeroclipboard使用指南

    瀏覽器復制插件zeroclipboard使用指南

    ZeroClipboard 是國外大神開發(fā)的一個用于剪貼板復制的 JS 插件,它是基于 Flash 來實現(xiàn)跨瀏覽器的復制功能的。當我們使用 ZeroClipboard 的時候,它會悄悄隱藏一個小小的 Flash 影片(swf),不會對我們的用戶界面造成影響。我們只需要借助它實現(xiàn)復制功能就行了。
    2016-03-03
  • Javascript 實現(xiàn)微信分享(QQ、朋友圈、分享給朋友)

    Javascript 實現(xiàn)微信分享(QQ、朋友圈、分享給朋友)

    這篇文章主要介紹了Javascript 實現(xiàn)微信分享(QQ、朋友圈、分享給朋友)的相關資料,需要的朋友可以參考下
    2016-10-10
  • JavaScript實現(xiàn)左右滾動電影畫布

    JavaScript實現(xiàn)左右滾動電影畫布

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)左右滾動電影畫布,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 使用透明效果來自定義文件上傳按鈕控件樣式

    使用透明效果來自定義文件上傳按鈕控件樣式

    處于安全上的考慮,input[type="file"] 的文件選擇按鈕樣式并不能隨意修改(不過可以修改input 的透明度),可能會跟設計師的設計格格不入,這時可以使用透明效果來自定義上傳按鈕
    2012-12-12
  • JavaScript判斷瀏覽器類型的方法

    JavaScript判斷瀏覽器類型的方法

    這篇文章主要介紹了JavaScript判斷瀏覽器類型的方法,可實現(xiàn)針對IE、火狐、谷歌等瀏覽器的判斷,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02

最新評論