lambdaway
::
kernel
6
|
list
|
login
|
load
|
|
_h1 [[concepts]] | kernel _p The {b act I} in the page [[concepts]], supposed to be at the λ-calculus level, introduces a few lambda expressions, like {pre ((lambda (:a :b) My name is :b, :a :b.) James Bond) -> {eval ((lambda (:a :b) My name is :b, :a :b.) James Bond)} or ((lambda (:c) (:c (lambda (:a :b) :a))) ((lambda (:a :b :c) (:c :a :b)) James Bond)) -> {eval ((lambda (:c) (:c (lambda (:a :b) :a))) ((lambda (:a :b :c) (:c :a :b)) James Bond))} } _p The first one is preferably splitted like this {pre (def HI (lambda (:a :b) My name is :b, :a :b.)) -> {eval (def HI (lambda (:a :b) My name is :b, :a :b.))} (HI James Bond) -> {eval (HI James Bond)} (HI Antoine de Saint Exupery) -> {eval (HI Antoine de Saint Exupery)} } _p and the second one like this {pre (def PAIR (lambda (:a :b :c) (:c :a :b))) -> {eval (def PAIR (lambda (:a :b :c) (:c :a :b)))} (def LEFT (lambda (:c) (:c (lambda (:a :b) :a)))) -> {eval (def LEFT (lambda (:c) (:c (lambda (:a :b) :a))))} (def RIGHT (lambda (:c) (:c (lambda (:a :b) :b)))) -> {eval (def RIGHT (lambda (:c) (:c (lambda (:a :b) :b))))} (def JB (PAIR James Bond)) -> {eval (def JB (PAIR James Bond))} (LEFT (JB)) -> {eval (LEFT (JB))} (RIGHT (JB)) -> {eval (RIGHT (JB))} } _h2 here is the JS code _p Evaluations are made thanks to this minimal javascript code {pre °° var KERNEL = (function() { var regexp = /\(([^\s()]*)(?:[\s]*)([^()]*)\)/g, DICT = {}, LAMB_num = 0; var evaluate = function(s) { s = eval_specials(s,'lambda',eval_lambda); s = eval_specials(s,'def',eval_def,true); s = eval_forms(s); return s }; var eval_forms = function(s) { while (s !== (s = s.replace(regexp, eval_form))); return s; }; var eval_form = function() { var f = arguments[1] || "", r = arguments[2] || ""; return DICT.hasOwnProperty(f) ? DICT[f].apply(null, [r]) : "«‚" + f + " " + r + "»"; }; var eval_specials = function(s,symbol,eval_symbol,flag) { while (s !== (s = form_replace(s,symbol,eval_symbol,flag))) ; return s; }; var eval_lambda = function(s) { var index = s.indexOf(")"), argStr = s.substring(1, index), args = argStr === "" ? [] : argStr.split(" "), body = s.substring(index + 2), name = "_LAMB_" + LAMB_num++; body = eval_specials(body,'lambda',eval_lambda); DICT[name] = function() { var valStr = arguments[0], vals = valStr === "" ? [] : valStr.split(" "), bod = body; if (vals.length < args.length) { // 1) partial call for (var i = 0; i < vals.length; i++) bod = bod.replace(RegExp(args[i], "g"), vals[i]); var _args_ = args.slice(vals.length) .join(" "); bod = eval_lambda("(" + _args_ + ") " + bod); } else if (vals.length === args.length) { // 2) total call for (var i=0; i < args.length; i++) bod = bod.replace( RegExp(args[i], "g"), vals[i] ); } else { // 3) extra values are gathered in the last one var _vals_ = vals.slice(0,args.length); _vals_[args.length-1] = vals.slice(args.length-1,vals.length) .join(' '); for (var i=0; i < args.length; i++) bod = bod.replace( RegExp(args[i], "g"), _vals_[i] ); } return eval_forms(bod); }; return name; }; var eval_def = function(s, flag) { s = eval_specials(s,'def',eval_def,false); var index = s.search(/\s/); var name = s.substring(0, index).trim(); var body = s.substring(index).trim(); if (body.substring(0, 6) === "_LAMB_") { DICT[name] = DICT[body]; } else { body = eval_forms(body); DICT[name] = function() { return body; }; } return flag ? name : ""; }; var form_replace = function(str, symbol, func, flag) { symbol = "(" + symbol + " "; var s = catch_form(symbol, str); return s === "none" ? str : str.replace(symbol + s + ")", func(s, flag)); }; var catch_form = function(symbol, str) { var start = str.indexOf(symbol); if (start == -1) return "none"; var d1 = symbol.length, nb = 1, index = start; while (nb > 0) { index++; if (str.charAt(index) == "(") nb++; else if (str.charAt(index) == ")") nb--; } return str.substring(start + d1, index); }; return { evaluate:evaluate } })(); // end of KERNEL // interface with lambdatalk: LAMBDATALK.DICT['eval'] = function() { var args = arguments[0].trim(); return KERNEL.evaluate( args ) }; °°} _p This code is extracted from the [[lambdatalk's JS code|meca/JS.js]], reduced to the evaluation of nested forms {b (a (b (c ... word)))} and two special forms, {b lambda & def}, working in a dictionary initially empty. Note that to avoid conflicts in this page, round braces replace the standard curly braces used in lambdatalk. _p {i am | 2023/02/16} _h2 le même compressé avec [[https://jscompress.com/|https://jscompress.com/]] {prewrap °° var KERNEL=function(){var r=/\(([^\s()]*)(?:[\s]*)([^()]*)\)/g,a={},t=0,g=function(n){for(;n!==(n=n.replace(r,e)););return n},e=function(){var n=arguments[1]||"",r=arguments[2]||"";return a.hasOwnProperty(n)?a[n].apply(null,[r]):"«‚"+n+" "+r+"»"},f=function(n,r,e,t){for(;n!==(n=u(n,r,e,t)););return n},s=function(n){var r=n.indexOf(")"),e=n.substring(1,r),i=""===e?[]:e.split(" "),l=n.substring(r+2),r="_LAMB_"+t++,l=f(l,"lambda",s);return a[r]=function(){var n=arguments[0],r=""===n?[]:n.split(" "),e=l;if(r.length< i.length){for(var t=0;t< r.length;t++)e=e.replace(RegExp(i[t],"g"),r[t]);n=i.slice(r.length).join(" "),e=s("("+n+") "+e)}else if(r.length===i.length)for(t=0;t< i.length;t++)e=e.replace(RegExp(i[t],"g"),r[t]);else{var u=r.slice(0,i.length);u[i.length-1]=r.slice(i.length-1,r.length).join(" ");for(t=0;t< i.length;t++)e=e.replace(RegExp(i[t],"g"),u[t])}return g(e)},r},i=function(n,r){var e=(n=f(n,"def",i,!1)).search(/\s/),t=n.substring(0,e).trim(),u=n.substring(e).trim();return"_LAMB_"===u.substring(0,6)?a[t]=a[u]:(u=g(u),a[t]=function(){return u}),r?t:""},u=function(n,r,e,t){var u=l(r="("+r+" ",n);return"none"===u?n:n.replace(r+u+")",e(u,t))},l=function(n,r){var e=r.indexOf(n);if(-1==e)return"none";for(var n=n.length,t=1,u=e;0< t;)u++,"("==r.charAt(u)?t++:")"==r.charAt(u)&&t--;return r.substring(e+n,u)};return{evaluate:function(n){return n=f(n,"lambda",s),n=f(n,"def",i,!0),n=g(n)}}}();LAMBDATALK.DICT.eval=function(){var n=arguments[0].trim();return KERNEL.evaluate(n)}; °°} {script var KERNEL = (function() { var regexp = /\(([^\s()]*)(?:[\s]*)([^()]*)\)/g, DICT = {}, LAMB_num = 0; var evaluate = function(s) { s = eval_specials(s,'lambda',eval_lambda); s = eval_specials(s,'def',eval_def,true); s = eval_forms(s); return s }; var eval_forms = function(s) { while (s !== (s = s.replace(regexp, eval_form))); return s; }; var eval_form = function() { var f = arguments[1] || "", r = arguments[2] || ""; return DICT.hasOwnProperty(f) ? DICT[f].apply(null, [r]) : "«‚" + f + " " + r + "»"; }; var eval_specials = function(s,symbol,eval_symbol,flag) { while (s !== (s = form_replace(s, symbol, eval_symbol, flag))) ; return s; }; var eval_lambda = function(s) { var index = s.indexOf(")"), argStr = s.substring(1, index), args = argStr === "" ? [] : argStr.split(" "), body = s.substring(index + 2), name = "_LAMB_" + LAMB_num++; body = eval_specials(body,'lambda',eval_lambda); DICT[name] = function() { var valStr = arguments[0], vals = valStr === "" ? [] : valStr.split(" "), bod = body; if (vals.length < args.length) { // 1) partial call for (var i = 0; i < vals.length; i++) bod = bod.replace(RegExp(args[i], "g"), vals[i]); var _args_ = args.slice(vals.length).join(" "); bod = eval_lambda("(" + _args_ + ") " + bod); } else if (vals.length === args.length) { // 2) total call for (var i=0; i < args.length; i++) bod = bod.replace( RegExp(args[i], "g"), vals[i] ); } else { // 3) extra are gathered in the last one var _vals_ = vals.slice(0,args.length); _vals_[args.length-1] = vals.slice(args.length-1,vals.length).join(' '); for (var i=0; i < args.length; i++) bod = bod.replace( RegExp(args[i], "g"), _vals_[i] ); } return eval_forms(bod); }; return name; }; var eval_def = function(s, flag) { s = eval_specials(s,'def',eval_def,false); var index = s.search(/\s/); var name = s.substring(0, index).trim(); var body = s.substring(index).trim(); if (body.substring(0, 6) === "_LAMB_") { DICT[name] = DICT[body]; } else { body = eval_forms(body); DICT[name] = function() { return body; }; } return flag ? name : ""; }; var form_replace = function(str, symbol, func, flag) { symbol = "(" + symbol + " "; var s = catch_form(symbol, str); return s === "none" ? str : str.replace(symbol + s + ")", func(s, flag)); }; var catch_form = function(symbol, str) { var start = str.indexOf(symbol); if (start == -1) return "none"; var d1 = symbol.length, nb = 1, index = start; while (nb > 0) { index++; if (str.charAt(index) == "(") nb++; else if (str.charAt(index) == ")") nb--; } return str.substring(start + d1, index); }; return { evaluate: evaluate, DICT:DICT }; })(); // end of KERNEL LAMBDATALK.DICT['eval'] = function() { // ((lambda (:a :b) :b :a) james bond) var args = arguments[0].trim(); return KERNEL.evaluate( args ) }; }
lambdaway v.20211111