JavaScript具有類(lèi)似Lambda表達(dá)式編程能力的代碼(改進(jìn)版)
eval(function () {
var s = '', ww = [v] > (s += v);
var ws = [n] > ww(' <A href="#">(' + n + ')</A> ');
pnView3(14, [n] > ww(' [' + n + '] '),
1, 37,
ws, [] > ww(' ... '),
2, 1
);
document.write(s);
} .lamda0());
不過(guò),由于運(yùn)算符優(yōu)先級(jí)的關(guān)系,比較、門(mén)、賦值等運(yùn)算符仍然不能直接寫(xiě)在(偽)Lambda表達(dá)式中。
也就是說(shuō)
function(a, b){ a == b }
仍然需要寫(xiě)成
[a, b] > (a == b)
另外,選擇的pattern本身是具有實(shí)際效果的——當(dāng)把一個(gè)數(shù)組和另一樣?xùn)|西進(jìn)行比較的時(shí)候,腳本引擎會(huì)先嘗試把兩邊都轉(zhuǎn)化成數(shù)值,如果不成功就轉(zhuǎn)化成字符串再比較。
不過(guò)我想正常情況下應(yīng)該很少有人會(huì)拿數(shù)組跟別的東西這么比——所以甚至不需要主動(dòng)去避免,只要用不到(偽)Lambda表達(dá)式的時(shí)候不特意去這樣用就沒(méi)問(wèn)題了。
新的實(shí)現(xiàn)代碼如下:
/*!
L-amda "a-Lambda", a module provides Alternate "Lambda" style programming ability for JavaScript.
Created By NanaLich. 2010-09-10
This module is published under WTFPL v2, so you just DO WHAT THE Fxxx YOU WANT TO with it.
*/
!function () {
function attachEntry(o, a, m) {
var i, j, n;
o = [].concat(o);
while (i = o.shift()) {
for (j in a) {
if (!i[n = a[j]]) i[n] = m;
}
}
}
var xx = /"(?:\\[\s\S]|[^\x22])*"|'(?:\\[\s\S]|[^\x27])*'|([^\s\w]\s*)\[(\s*|\s*[A-Z$_][\w$]*\s*(?:,\s*[A-Z$_][\w$]*\s*)*)\]\s*(>)\s*(\(?)/gi;
var xy = /[\n\r),;\]}]|$/.source;
function rxClone(rx) {
return new RegExp(rx.source, (rx.global ? 'g' : '') + (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : ''));
}
attachEntry(RegExp, ['clone'], rxClone);
attachEntry(RegExp.prototype, ['clone'], function () { return rxClone(this); });
function translateLambda(s) {
var m, l = 0, r = '', x = xx.clone(); // 由于firefox、safari等瀏覽器對(duì)全局匹配正則表達(dá)式有過(guò)度的優(yōu)化,所以這里采用一種迂回的辦法創(chuàng)建不重復(fù)的正則表達(dá)式實(shí)例
while (m = x.exec(s)) {
var h = m[0];
switch (h.charAt(0)) { // 判斷期待的語(yǔ)法成分
case '$': // 函數(shù)傳參
case ')':
case ']':
case '"': // 匹配到了字符串
case "'":
continue; // 以上皆跳過(guò)
}
var p, q, t, k = m[4].length, y = new RegExp(k ? '\\)' : xy, 'g');
r += s.substring(l, p = m.index); // 在結(jié)果字符串上附加之前余留的內(nèi)容
y.lastIndex = l = p + h.length; // 從偽運(yùn)算符之后開(kāi)始尋找右括號(hào)或者其它符號(hào)
while (q = y.exec(s)) {
q = q.index;
try {
t = 'return(' + s.substring(l, q) + ');';
new Function(t); // 語(yǔ)法測(cè)試
r += m[1] + 'function(' + m[2] + '){ ' + translateLambda(t) + ' }'; // 翻譯里面的內(nèi)容
x.lastIndex = l = q + k; // 下一次查找從當(dāng)前邊界之后開(kāi)始
break;
} catch (ex) { }
}
if (!q) l = p; // 說(shuō)明找不到右括號(hào)或者有效的代碼,直接附加所有匹配的內(nèi)容
}
try {
r += s.substr(l);
new Function(r); // 語(yǔ)法測(cè)試
return r;
} catch (ex) { // 失敗,返回原文
return s;
}
};
var lamdaAliases = ["translateLambda", "lambda", "lamda"];
attachEntry(String, lamdaAliases, translateLambda);
attachEntry(String.prototype, lamdaAliases, function () { return translateLambda(this); });
var funPrototype = Function.prototype;
attachEntry(Function, lamdaAliases, function (func) { return translateLambda('0,' + func); });
attachEntry(funPrototype, lamdaAliases, function () { return translateLambda('0,' + this); });
var lamda0aliases = ['lambdaInit', 'lambda0', 'lamda0'];
attachEntry(Function, lamda0aliases, function (func) { return translateLambda('!' + func + '()'); });
attachEntry(funPrototype, lamda0aliases, function () { return translateLambda('!' + this + '()'); });
} ();
這次為函數(shù)增加了專(zhuān)門(mén)的方法,去掉了之前蹩足的判斷、也增加了新方法稍微簡(jiǎn)化調(diào)用過(guò)程;
修正了有額外空格時(shí)無(wú)法判斷期望語(yǔ)法成分的BUG。
另外由于Codeplex再次抽瘋,這次還是沒(méi)有下載。
相關(guān)文章
HTML+JavaScript模擬實(shí)現(xiàn)簡(jiǎn)單的時(shí)鐘效果
在這篇文章中,主要將向大家展示如何使用?HTML、CSS?和?JavaScript代碼制作模擬時(shí)鐘,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08js中常用的4種模糊查詢(xún)?cè)斀?includes()、indexOf()、search()、match())
這篇文章主要給大家介紹了關(guān)于js中常用的4種模糊查詢(xún)(includes()、indexOf()、search()、match())的相關(guān)資料,搜索可以使我們更快的找到某一個(gè)關(guān)鍵詞或者某一個(gè)商品,所以模糊查詢(xún)和下拉匹配也成了前端必備的一個(gè)小技能,需要的朋友可以參考下2023-11-11js實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)簡(jiǎn)單實(shí)例
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)簡(jiǎn)單實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01JavaScript實(shí)現(xiàn)自動(dòng)消除按鈕功能的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)自動(dòng)消除按鈕功能的方法,涉及javascript針對(duì)頁(yè)面元素屬性操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08基于滾動(dòng)條位置判斷的簡(jiǎn)單實(shí)例
下面小編就為大家分享一篇基于滾動(dòng)條位置判斷的簡(jiǎn)單實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12兩種JS實(shí)現(xiàn)屏蔽鼠標(biāo)右鍵的方法
這篇文章主要介紹了兩種JS實(shí)現(xiàn)屏蔽鼠標(biāo)右鍵的方法,瀏覽者在訪問(wèn)你網(wǎng)頁(yè)的時(shí)候就不能點(diǎn)擊右鍵,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08Javascript 寫(xiě)的簡(jiǎn)單進(jìn)度條控件
2008-01-01每天一篇javascript學(xué)習(xí)小結(jié)(Boolean對(duì)象)
這篇文章主要介紹了javascript中的Boolean對(duì)象知識(shí)點(diǎn),對(duì)Boolean對(duì)象的基本使用方法進(jìn)行解釋?zhuān)欢魏茉敿?xì)的代碼介紹,感興趣的小伙伴們可以參考一下2015-11-11