Shirayuki

Shirayuki language implement

  1. // ==UserScript==
  2. // @name Shirayuki
  3. // @namespace
  4. // @version 1.13
  5. // @description Shirayuki language implement
  6. // @author Rika
  7. // @match *://*.zhihu.com/*
  8. // @grant none
  9. // @require https://code.jquery.com/jquery-latest.js
  10. // @namespace https://gf.qytechs.cn/users/165948
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. function interpreter(code_console){
  15.  
  16. this.code_console = code_console;
  17. this.halt = false;
  18. var self = this;
  19.  
  20. function trampoline(f){
  21. var func = f;
  22. while (typeof func === 'function') {
  23. func = func();
  24. }
  25. return func;
  26. }
  27. function trampoline_exec(f){
  28. var count = 0;
  29. while(count < (1 << 13) && typeof f === 'function') {
  30. count++;
  31. f = f();
  32. }
  33. if (typeof f === 'function' && !self.halt) {
  34. setTimeout(trampoline_exec.bind(null, f), 0);
  35. }
  36. }
  37. function console_read(x){
  38. self.code_console.input(x);
  39. }
  40. function console_write(x){
  41. self.code_console.output(x);
  42. }
  43. function console_suspend(x){
  44. self.code_console.suspend(x);
  45. }
  46. function console_clear(){
  47. self.code_console.clear();
  48. }
  49. function console_sleep(x,time){
  50. self.code_console.sleep(x,time);
  51. }
  52. function toBoolean(x){
  53. return Boolean(x)&&x!=false;
  54. }
  55. function isBoolean(x){
  56. return typeof x === 'boolean';
  57. }
  58. function isArray(x){
  59. return Object.prototype.toString.call(x) === '[object Array]';
  60. }
  61. function isNumber(x){
  62. return !isNaN(x) && !isArray(x) &&x!=null;
  63. }
  64. function isString(x){
  65. return typeof x === 'string' || x instanceof String;
  66. }
  67. function isFunction(x){
  68. return typeof x === "function";
  69. }
  70. function isEmpty(obj){
  71. return jQuery.isEmptyObject(obj);
  72. }
  73. function nonEmpty(obj){
  74. return !isEmpty(obj);
  75. }
  76. function set(x){
  77. var ret={};
  78. x.forEach(function(item,index){ret[item]=index;});
  79. return ret;
  80. }
  81. function extend(obj, src){
  82. for (var key in src) {
  83. if (src.hasOwnProperty(key) && !obj.hasOwnProperty(key)) obj[key] = src[key];
  84. }
  85. return obj;
  86. }
  87. function map_cps(f,x,cont){
  88. if(isEmpty(x)){
  89. return cont.bind(null,[]);
  90. }
  91. else if(x.length==1){
  92. return f.bind(null,x[0], function(y){
  93. return cont.bind(null,[y]);
  94. });
  95. }
  96. else{
  97. return map_cps.bind(null,f,x.slice(0, x.length-1),function(y){
  98. return f.bind(null, x[x.length-1], function(z){
  99. y.push(z);
  100. return cont.bind(null,y);
  101. });
  102. });
  103. }
  104. }
  105. function filter_cps(f,x,cont){
  106. if(isEmpty(x)){
  107. return cont.bind(null,[]);
  108. }
  109. else if(x.length==1){
  110. return f.bind(null, x[0], function(y){
  111. if(y){
  112. return cont.bind(null,[x[0]]);
  113. }
  114. else{
  115. return cont.bind(null,[]);
  116. }
  117. });
  118. }
  119. else{
  120. return filter_cps.bind(null,f,x.slice(1),function(y){
  121. return f.bind(null, x[0], function(z){
  122. if(z){
  123. y.unshift(x[0]);
  124. }
  125. return cont.bind(null,y);
  126. });
  127. });
  128. }
  129. }
  130. function reduce_cps(f,x,cont){
  131. if(isEmpty(x)){
  132. return cont.bind(null,[]);
  133. }
  134. else if(x.length==1){
  135. return cont.bind(null,x[0]);
  136. }
  137. else if(x.length==2){
  138. return f.bind(null,x[0],x[1],cont);
  139. }
  140. else{
  141. return reduce_cps.bind(null,f,x.slice(1),function(y){
  142. return f.bind(null,x[0], y, function(z){
  143. return cont.bind(null,z);
  144. });
  145. });
  146. }
  147. }
  148. function argument_number(n) {return n>1 ? n + " arguments" : n + " argument";}
  149. function do_raise_syntax(msg){throw {name:'Error',message:'Syntax Error: '+msg+'.'}}
  150. function do_raise(msg){throw {name:'Error',message:'Running Error: '+msg+'.'}}
  151. var wapper=function(_f){
  152. return function(){
  153. return _f.apply(null, [wapper(_f)].concat(Array.prototype.slice.call(arguments)));
  154. }
  155. }
  156. var preprocessor_x=wapper(
  157. function(self,__Str,_n,_m,_k){
  158. if(_n === undefined) {
  159. _n = 0;
  160. }
  161. if(_m === undefined) {
  162. _m = 0;
  163. }
  164. if(_k === undefined) {
  165. _k = 0;
  166. }
  167. return (!__Str && (_n==0 && _m==0 && _k==0)) ? '' :
  168. (!__Str) ?
  169. (
  170. (_n!=0) ? do_raise_syntax("unmatched parentheses '"+(_n>0?'(':')')+"'") :
  171. (_m!=0) ? do_raise_syntax("unmatched parentheses '"+(_m>0?'{':'}')+"'") :
  172. do_raise_syntax("unmatched parentheses '"+(_k>0?'[':']')+"'")
  173. ) :
  174. (__Str[0]=='\n' && _n==0) ? '\n'+self(__Str.slice(1), _n) :
  175. (__Str[0]=='\n' && _n!=0) ? self(__Str.slice(1), _n) :
  176. (__Str[0].match(/[\w\d\+\-\*\/\%\.\(\)\^\!\<\>\=\:\,\t\|\{\}\[\]\\\~\ ]/)) ? __Str[0]+self(__Str.slice(1), _n+(__Str[0]=='(')-(__Str[0]==')'), _m+(__Str[0]=='{')-(__Str[0]=='}'), _k+(__Str[0]=='[')-(__Str[0]==']')) :
  177. do_raise_syntax("unexpect symbol '"+__Str[0]+"'");
  178. });
  179. var preprocessor=function(__Str){
  180. return preprocessor_x(__Str.replace(/\/\/.*/g,'').replace(/[ \f\r\t\v]+/g,' ').split('\n').filter(function(x){return Boolean(x)}).join('\n'));
  181. }
  182. var lexer=function(__Str){
  183. return (preprocessor(__Str).split(/(def!|\-\>|[<>=]{2}|\!\=|_(?=\s|\{|\()|\\(?:\(|\{)|(?:\)|\})\\|[\>\<\=\+\-\*\/\%\(\)\^\!\:\,\n\|\t\{\}\[\]\~\ ])/g).filter(function(c){return Boolean(c) && !(c in set([' ','\t']))}).map(
  184. function(s){
  185. return (!isNaN(s) && s!='\n') ? Number(s) :
  186. (s=='<>') ? '!=' :
  187. (s.indexOf('.')==-1 || s=='=<' || s=='=>' || s=='><') ? s :
  188. do_raise_syntax("unexpect symbol '"+s+"'");
  189. }));
  190. }
  191. var parser_unit=wapper(
  192. function(self,__List,__Level,__Escape){
  193. var topLevel = 11;
  194. if(__Level === undefined) {
  195. __Level = topLevel;
  196. }
  197. if(__Escape === undefined) {
  198. __Escape = false;
  199. }
  200. return (__Level==0) ? (
  201. (nonEmpty(__List) && (__List[0]=='(' || __List[0]=='{')) ? (
  202. (function(_t){
  203. return (_t.length>2 || _t[1][0]=='}') ? [['()', (_t.length>2 || _t[0]!=null) ? _t.slice(0,-1) : []], _t[_t.length-1].slice(1)] : [_t[0],_t[1].slice(1)];
  204. })(
  205. wapper(
  206. function(self, rf, _t0){
  207. return (nonEmpty(_t0[1]) && _t0[1][0]==',') ? (function(_tx){return [_t0[0]].concat(self(rf, _tx));})(rf(_t0[1].slice(1),topLevel,__Escape)): _t0;
  208. }
  209. )(self, self(__List.slice(1),topLevel,__Escape))
  210. )
  211. ) :
  212. (nonEmpty(__List) && (__List[0]=='\\(' || __List[0]=='\\{')) ? (
  213. __Escape? (
  214. (function(_t0){
  215. return (isEmpty(_t0[1]) || (__List[0]=='\\(' && _t0[1][0]!=')\\') || (__List[0]=='\\{' && _t0[1][0]!='}\\')) ?
  216. do_raise_syntax("expect symbol '"+(__List[0]=='\\('?')\\':'}\\')+"', given: '"+_t0[1][0]+"'") : [[__List[0]+_t0[1][0],_t0[0]],_t0[1].slice(1)];
  217. }
  218. )(self(__List.slice(1),topLevel,false))) :
  219. do_raise_syntax("unexpect symbol '"+__List[0]+"'")
  220. ):
  221. (nonEmpty(__List) && (__List[0]=='[')) ? (
  222. (function(_t0){
  223. return (isEmpty(_t0[1]) || _t0[1][0]!=']') ? do_raise_syntax("expect symbol ']', given: '"+_t0[1][0]+"'") : [['[]',_t0[0]],_t0[1].slice(1)];
  224. }
  225. )(self(__List.slice(1),topLevel,true))
  226. ) :
  227. (nonEmpty(__List) && (__List[0]=='~')) ? (
  228. (function(_t){
  229. return nonEmpty(_t) ? (
  230. (function(_r){ return [[__List[0],_r[0]], _r[1]]; })(self(__List.slice(1),3,__Escape))
  231. ) : do_raise_syntax("expect identifier, given: End of line")
  232. })(__List.slice(1))
  233. ) :
  234. (nonEmpty(__List) && (isString(__List[0]) && __List[0]=='None')) ? (
  235. [[__List[0]], __List.slice(1)]
  236. ) :
  237. (nonEmpty(__List) && (!isString(__List[0]) || !__List[0].match(/^(\-\>|\\(?:\(|\{)|(?:\)|\})\\|[<>=]{2}|[\>\<\=\,\+\-\*\/\%\(\)\^\!\|\{\}\[\]\_\:\~])$/))) ? (
  238. [__List[0], __List.slice(1)]
  239. ) :
  240. [null, __List]
  241. ) :
  242. (__Level==1) ? (
  243. (nonEmpty(__List) && __List[0] in set(['lambda','def','def!'])) ? (
  244. (__List[0] in set(['def','def!']) && __Escape) ? do_raise_syntax("macro definitions are not allowed") :
  245. (function(_t){
  246. return (nonEmpty(_t) && _t[0]==':') ? (
  247. (function(sf,s0,s1,s2,t){
  248. return sf(s2(s1(s0(t))));
  249. })
  250. ((function(_tf){
  251. return [[((__List[0] in set(['def','def!']))&&_tf[0])?__List[0]+'_const':__List[0]].concat(_tf.slice(1,-1)),_tf[_tf.length-1]];
  252. }),
  253. (function(_t0){
  254. return (_t0.length>1 && _t0[0]!='\\(' && _t0[0]!='\\{' && _t0[1] in set(['=','('])) ? (
  255. (!(_t0[0] in set(['None','lambda','def','def!','delay','callcc','eval','curry']))&&isString(_t0[0])&&_t0[0].match(/^[A-Za-z_][A-Za-z0-9_]*$/)) ?
  256. ([_t0[0],_t0.slice(1),_t0[1]=='=']) :
  257. do_raise_syntax("invaild "+((__List[0]=='lambda')?"function":"macro")+" name '"+_t0[0]+"'")
  258. ) :
  259. ((nonEmpty(_t0) && (_t0[0]=='\\(' || _t0[0]=='\\{')) ? (
  260. (function(_tx){
  261. return (nonEmpty(_tx[1]) && _tx[1][0] in set(['=','('])) ?
  262. [_tx[0],_tx[1],_t0[1][0]=='='] :
  263. ['',_t0,false];
  264. })(self(_t0,0,__Escape))
  265. ):
  266. ['',_t0,false]);
  267. }),
  268. (function(_t1){
  269. return (!(__List[0]=='def' && isEmpty(_t1[0]))) ?
  270. _t1 :
  271. do_raise_syntax("anonymous macro");
  272. }),
  273. (function(_t2){
  274. return (function(_tc){
  275. return [_t2[2],_t2[0],_tc[0]].concat(
  276. (_t2[1][0]=='(' && nonEmpty(_tc) && _tc[1][0]==')' && (_tc[1].length>1 && _tc[1][1] in set(['=','->']))) ? (self(_tc[1].slice(2),topLevel,__Escape)) :
  277. (_t2[1][0]=='(' && (isEmpty(_tc[1]) || _tc[1][0]!=')')) ? do_raise_syntax("expect symbol ')'") :
  278. (_t2[1][0]!='(' && nonEmpty(_tc[1]) && (_tc[1][0] in set(['=','->']))) ? self(_tc[1].slice(1),topLevel,__Escape) :
  279. do_raise_syntax("expect symbol '=' or '->', given: '"+(nonEmpty(_tc[1])&&_tc[1][0]?_tc[1][0]:'')+"'")
  280. );
  281. })((!(nonEmpty(_t2[1]) && _t2[1][0]=='=')) ? (
  282. (function(_ta){
  283. return [_ta[0].length==1 && _ta[0][0]==null? []: _ta[0],_ta[1]];
  284. })(wapper(
  285. function(self, rf, _ta){
  286. return nonEmpty(_ta) ? (
  287. (function(_tx){
  288. return (nonEmpty(_tx[1]) && _tx[1][0]==',') ? (function(ty){return [[_tx[0]].concat(ty[0]),ty[1]]; })(self(rf,_tx[1].slice(1))):[[_tx[0]],_tx[1]];
  289. })(rf(_ta,3,__Escape))
  290. ) :
  291. (isEmpty(_ta) || _ta[0] in set(['->','=',')'])) ? [[],_ta] :
  292. do_raise_syntax("unexpect symbol '"+_ta[0]+"'");
  293. })(self, _t2[1].slice(nonEmpty(_t2[1]) && _t2[1][0]=='('))
  294. )) :
  295. [[], _t2[1]]
  296. );
  297. }),_t.slice(1))
  298. ) :
  299. do_raise_syntax("expect symbol ':', given: '"+_t[0]+"'");
  300. })(__List.slice(1))
  301. ) :
  302. self(__List, __Level-1, __Escape)
  303. ) :
  304. (__Level==2) ? (
  305. (nonEmpty(__List) && (__List[0] in set(['delay','callcc','eval','curry']))) ? (
  306. (function(_t,_f){
  307. return (nonEmpty(_t) && _t[0] =='(') ?
  308. (function(_t0){
  309. return (isEmpty(_t0[1]) || _t0[1][0]!=')') ?
  310. do_raise_syntax("expect symbol ')', given: '"+_t0[1][0]+"'") :
  311. [_t0[0],_t0[1].slice(1)];
  312. }
  313. )(_f(_t.slice(1),true)) :
  314. _f(_t,false);
  315. })(__List.slice(1),function(_t,_mk){
  316. return (function(_t0){
  317. return [[__List[0],_t0[0]],_t0[1]];
  318. })(self(_t, _mk?topLevel:3, __Escape))
  319. })) :
  320. self(__List, __Level-1,__Escape)
  321. ) :
  322. (__Level==3) ? (
  323. wapper(
  324. function(self, rf, _t){
  325. return (nonEmpty(_t[1]) && _t[1][0]=='(') ? (
  326. (function(_t0){
  327. return self(rf, [['<-',_t[0],_t0[0]],_t0[1]]);
  328. })((function(_t){return [['()',(_t.length>2 || _t[0]!=null) ? _t.slice(0,-1) : []],_t[_t.length-1].slice(1)];})(
  329. wapper(
  330. function(self, rf, _t0){
  331. return (_t0[1] && _t0[1][0]==',') ? (function(_tx){return [_t0[0]].concat(self(rf, _tx));})(rf(_t0[1].slice(1),topLevel,__Escape)) : _t0;
  332. })(rf, rf(_t[1].slice(1),topLevel,__Escape))
  333. ))
  334. ) :
  335. (nonEmpty(_t[1]) && _t[1][0]=='{') ? do_raise_syntax("unexpect symbol '{'") :
  336. (nonEmpty(_t[1]) && !_t[1][0].toString().match(/(\-\>|\\(?:\(|\{)|(?:\)|\})\\|[<>=]{2}|[\>\<\=\,\+\-\*\/\%\(\)\^\!\|\:\{\}\[\]\_\n\~])/)) ? (
  337. (function(_t0){
  338. //return self(rf, [['*',_t[0],_t0[0]],_t0[1]]);
  339. do_raise_syntax("unexpect symbol '"+_t[1][0]+"'");
  340. })(rf(_t[1], 4, __Escape))
  341. ) :
  342. _t;
  343. })(self, self(__List, __Level-1, __Escape))
  344. ) :
  345. (__Level==4) ? (
  346. (nonEmpty(__List) && __List[0]=='|') ? (
  347. (function(_t0){
  348. return [['|',_t0.slice(0,-2)],_t0[_t0.length-1]];
  349. })(wapper(
  350. function(self, rf, _t){
  351. return (nonEmpty(_t) && _t[0]=='|') ? (
  352. (function(_tx){
  353. return (nonEmpty(_tx[1]) && _tx[1][0]==':') ? (
  354. (function(_ty){
  355. return [[_tx[0], _ty[0]]].concat(self(rf, _ty[1]));
  356. })(rf(_tx[1].slice(1),topLevel,__Escape))
  357. ) :
  358. do_raise_syntax("expect symbol ':'");
  359. })(rf(_t.slice(1),topLevel,__Escape))
  360. ) :
  361. [[], _t];
  362. })(self, __List))
  363. ) :
  364. self(__List, __Level-1, __Escape)
  365. ) :
  366. (__Level>4 && __Level<12) ? (
  367. wapper(
  368. function(self, rf, _t){
  369. return (_t[1] && _t[1][0] in [set(['->']),set(['_']),set(['!']),set(['^']),set(['*','/','%']),set(['+','-']),set(['=','!=','<','>','<=','>='])][__Level-5]) ? (
  370. (function(x){
  371. return (function(_t0){
  372. return x ? ((nonEmpty(_t0[1]) && _t0[1][0]=='}') ?
  373. self(rf, [[_t[1][0],_t[0],_t0[0]],_t0[1].slice(1)]) :
  374. do_raise_syntax("expect symbol '}'")) :
  375. self(rf, [[_t[1][0],_t[0],_t0[0]],_t0[1]]);
  376. })(rf(_t[1].slice(1+x), x?11:__Level-1, __Escape));
  377. })(((__Level==6 || __Level==8) && _t[1].length>1 && _t[1][1]=='{'))
  378. ) :
  379. _t;
  380. })(self, self(__List, __Level-1, __Escape))
  381. ) :
  382. (self(__List, __Level-1, __Escape)
  383. );
  384. });
  385. var parser=wapper(
  386. function(self, __List){
  387. return ((function(rf, _t){
  388. return (isEmpty(_t[1])||_t[1][0]=='\n') ?
  389. [_t[0]].concat((nonEmpty(_t[1])) ? rf(_t[1].slice(1)) : []) :
  390. do_raise_syntax("Unexpected end of line");
  391. }
  392. )(self, parser_unit(__List)));
  393. });
  394. var merge_dict=function(x,y){
  395. return extend(x,y);
  396. }
  397. var builtin_func_signature=function(f){
  398. var signature={
  399. 'apply': ['lambda','apply',['f','x']],
  400. 'isFunction': ['lambda','isFunction',['x']],
  401. 'isList': ['lambda','isList',['x']],
  402. 'isNumber': ['lambda','isNumber',['x']],
  403. 'isNone': ['lambda','isNone',['x']],
  404. 'isAst': ['lambda','isAst',['x']],
  405. 'int': ['lambda','int',['x']],
  406. 'float': ['lambda','float',['x']],
  407. 'len': ['lambda','len',['x']],
  408. 'map': ['lambda','map',['f','x']],
  409. 'filter': ['lambda','filter',['f','x']],
  410. 'reduce': ['lambda','reduce',['f','x']],
  411. 'ceil': ['lambda','ceil',['x']],
  412. 'floor': ['lambda','floor',['x']],
  413. 'boolean': ['lambda','boolean',['x']],
  414. 'abs': ['lambda','abs',['x']],
  415. 'sin': ['lambda','sin',['x']],
  416. 'cos': ['lambda','cos',['x']],
  417. 'tan': ['lambda','tan',['x']],
  418. 'ln': ['lambda','ln',['x']],
  419. 'exp': ['lambda','exp',['x']],
  420. 'pi': ['lambda','pi',[]],
  421. 'e': ['lambda','e',[]],
  422. 'random': ['lambda','random',[]],
  423. 'and': ['lambda','and',['x','y']],
  424. 'or': ['lambda','or',['x','y']],
  425. 'not': ['lambda','or',['x']],
  426. 'input': ['lambda','input',[]],
  427. 'output': ['lambda','output',['x']],
  428. 'suspend': ['lambda','suspend',['f']],
  429. 'clear': ['lambda','suspend',[]],
  430. 'halt': ['lambda','halt',[]],
  431. };
  432. return signature[f];
  433. };
  434. var global_symtable=function(_t){
  435. var numeric_func=function(f,name){
  436. return function(x,cont){
  437. if(!isNaN(x)){
  438. return cont.bind(null,f(x));
  439. }
  440. else{
  441. do_raise("call lambda <"+name+"> with not isnumeric argument");
  442. }
  443. }
  444. }
  445. var builtin=function(f,name,args,decay){
  446. if(decay === undefined) {
  447. decay = true;
  448. }
  449. return val_func(builtin_func(f,name,args,decay));
  450. }
  451. var builtin_func_list={
  452. 'apply': builtin(function(f,x,cont){
  453. if(isFunction(f)&&f(2)!='Ast'&&f(2)!='free_identifier'){
  454. if(isArray(x)){
  455. return f().bind(null,x,cont);
  456. }
  457. else{
  458. return f().bind(null,[val_func(x)],cont);
  459. }
  460. }
  461. else{
  462. return result_of.bind(null, val_func(f), function(v){
  463. do_raise("calling a not callable object "+v);
  464. });
  465. }
  466. },'apply',['f','x']),
  467. 'isFunction': builtin(function(x,cont){
  468. if(isFunction(x)&&x(2)!='Ast'&&x(2)!='free_identifier'){
  469. return cont.bind(null,true);
  470. }
  471. else{
  472. return cont.bind(null,false);
  473. }
  474. },'isFunction',['x']),
  475. 'isList': builtin(function(x,cont){
  476. if(isArray(x)){
  477. return cont.bind(null,true);
  478. }
  479. else{
  480. return cont.bind(null,false);
  481. }
  482. },'isList',['x']),
  483. 'isNumber': builtin(function(x,cont){
  484. if(isNumber(x)){
  485. return cont.bind(null,true);
  486. }
  487. else{
  488. return cont.bind(null,false);
  489. }
  490. },'isNumber',['x']),
  491. 'isNone': builtin(function(x,cont){
  492. if(x==null){
  493. return cont.bind(null,true);
  494. }
  495. else{
  496. return cont.bind(null,false);
  497. }
  498. },'isNone',['x']),
  499. 'isAst': builtin(function(x,cont){
  500. if(isFunction(x)&&x(2)=='Ast'){
  501. return cont.bind(null,true);
  502. }
  503. else{
  504. return cont.bind(null,false);
  505. }
  506. },'isAst',['x']),
  507. 'int': builtin(numeric_func(function(x){return Math.floor(x);},'int'),'int',['x']),
  508. 'float': builtin(numeric_func(function(x){return x;},'float'),'float',['x']),
  509. 'boolean': builtin(function(x,cont){return cont.bind(null,toBoolean(x));},'boolean',['x']),
  510. 'len': builtin(function(x,cont){
  511. if(isArray(x)){
  512. return cont.bind(null,x.length);
  513. }
  514. else{
  515. do_raise("call lambda <len> with not vector argument");
  516. }
  517. },'len',['x']),
  518. 'map': builtin(function(f,x,cont){
  519. if(isArray(x)){
  520. return map_cps.bind(null,function(y,cont){
  521. return f().bind(null,[y],cont);
  522. },
  523. x,cont);
  524. }
  525. else{
  526. do_raise("call lambda <map> with not vector argument");
  527. }
  528. },'map',['f','x']),
  529. 'filter': builtin(function(f,x,cont){
  530. if(isArray(x)){
  531. return filter_cps.bind(null,function(y,cont){
  532. return f().bind(null,[y],function(v){
  533. return v().bind(null,null,function(cond){
  534. return cont.bind(null,Boolean(cond) && !(isArray(cond) && isEmpty(cond)));
  535. });
  536. });
  537. },
  538. x,cont);
  539. }
  540. else{
  541. do_raise("call lambda <filter> with not vector argument");
  542. }
  543. },'filter',['f','x']),
  544. 'reduce': builtin(function(f,x,cont){
  545. if(isArray(x)){
  546. if(nonEmpty(x)){
  547. return reduce_cps.bind(null,function(a,b,cont){
  548. return f().bind(null,[a,b],cont);
  549. },
  550. x,cont);
  551. }
  552. else{
  553. return cont.bind(null,[]);
  554. }
  555. }
  556. else{
  557. do_raise("call lambda <reduce> with not vector argument");
  558. }
  559. },'reduce',['f','x']),
  560. 'ceil': builtin(numeric_func(function(x){return Math.ceil(x);},'ceil'),['x']),
  561. 'floor': builtin(numeric_func(function(x){return Math.floor(x);},'floor'),'floor',['x']),
  562. 'abs': builtin(numeric_func(function(x){return Math.abs(x);},'abs'),'abs',['x']),
  563. 'sin': builtin(numeric_func(function(x){return Math.sin(x);},'sin'),'sin',['x']),
  564. 'cos': builtin(numeric_func(function(x){return Math.cos(x);},'cos'),'cos',['x']),
  565. 'tan': builtin(numeric_func(function(x){return Math.tan(x);},'tan'),'tan',['x']),
  566. 'ln': builtin(numeric_func(function(x){return Math.log(x);},'ln'),'ln',['x']),
  567. 'exp': builtin(numeric_func(function(x){return Math.exp(x);},'exp'),'exp',['x']),
  568. 'pi': builtin(function(cont){return cont.bind(null,Math.PI);},'pi',[]),
  569. 'e': builtin(function(cont){return cont.bind(null,Math.E);},'e',[]),
  570. 'random': builtin(function(cont){return cont.bind(null,Math.random());},'random',[]),
  571. 'and': builtin(function(x,y,cont){
  572. return x().bind(null,null,function(a){
  573. return !toBoolean(a)?
  574. cont.bind(null,val_func(false)) :
  575. y().bind(null,null,function(b){
  576. return !toBoolean(b)?
  577. cont.bind(null,val_func(false)) :
  578. cont.bind(null,val_func(true));
  579. });
  580. });
  581. },'and',['x','y'],false),
  582. 'or': builtin(function(x,y,cont){
  583. return x().bind(null,null,function(a){
  584. return toBoolean(a)?
  585. cont.bind(null,val_func(true)) :
  586. y().bind(null,null,function(b){
  587. return toBoolean(b)?
  588. cont.bind(null,val_func(true)) :
  589. cont.bind(null,val_func(false));
  590. });
  591. });
  592. },'or',['x','y'],false),
  593. 'not': builtin(function(x,cont){return cont(!toBoolean(x));},'or',['x']),
  594. 'input': builtin(function(cont){
  595. console_read(function(code){
  596. trampoline_exec(evaluate(parser(lexer(code))[0],{},{},function(x){
  597. trampoline_exec(x().bind(null,null,cont));
  598. }));
  599. });
  600. },'input',[]),
  601. 'output': builtin(function(x,cont){
  602. return result_of.bind(null, x, function(v){
  603. console_write(v);
  604. console_sleep(function(){
  605. trampoline_exec(cont.bind(null,x));
  606. }, 10);
  607. });
  608. },'output',['x'], false),
  609. 'suspend': builtin(function(x,cont){
  610. console_suspend(function(){
  611. trampoline_exec(cont.bind(null,x));
  612. });
  613. },'suspend',['f'], false),
  614. 'clear': builtin(function(cont){
  615. console_clear();
  616. return cont(null);
  617. },'clear',[]),
  618. 'halt': builtin(function(cont){
  619. return null;
  620. },'halt',[], false),
  621. };
  622. var ret={};
  623. _t.forEach(function(item,index){
  624. if(isArray(item) && nonEmpty(item) && item[0]=='lambda'){
  625. if(!(item[1] in ret)){
  626. ret[item[1]]=[item[0],item[1],[],[]];
  627. }
  628. ret[item[1]][2].push(item[2]);
  629. ret[item[1]][3].push(item[3]);
  630. if(ret[item[1]][2][0].length!=item[2].length){
  631. do_raise_syntax("define lambda<"+(item[1] ? item[1] : 'unnamed')+"> with unmatched arguments,\n given:"+
  632. '('+ret[item[1]][2][0].map(function(x){ return AstToString(x).replace(/\n$/,''); }).join(',')+') and '+
  633. '('+item[2].map(function(x){ return AstToString(x).replace(/\n$/,''); }).join(',')+')');
  634. }
  635. }
  636. });
  637. for (var key in ret) {
  638. ret[key]=val_func(func(ret[key][0],ret[key][1],ret[key][2],ret[key][3], {}, ret, evaluate));
  639. }
  640. merge_dict(ret, builtin_func_list);
  641. merge_dict(ret, {'true':val_func(true),'false':val_func(false)});
  642. return ret;
  643. }
  644. var macro_symtable=function(_t,_gsym){
  645. if(_gsym === undefined) {
  646. _gsym = {};
  647. }
  648. var ret={}, temp={};
  649. _t.forEach(function(item,index){
  650. if(isArray(item) && nonEmpty(item) && item[0] in set(['def','def_const','def!','def!_const'])){
  651. if(!(item[1] in temp)){
  652. temp[item[1]]=[item[0],item[1],[],[]];
  653. }
  654. temp[item[1]][2].push(item[2]);
  655. temp[item[1]][3].push(item[3]);
  656. if(temp[item[1]][2][0].length!=item[2].length){
  657. do_raise_syntax("define macro<"+(item[1] ? item[1] : 'unnamed')+"> with unmatched arguments,\n given:"+
  658. '('+temp[item[1]][2][0].map(function(x){ return AstToString(x).replace(/\n$/,''); }).join(',')+') and '+
  659. '('+item[2].map(function(x){ return AstToString(x).replace(/\n$/,''); }).join(',')+')');
  660. }
  661. }
  662. });
  663. for (var key in temp) {
  664. temp[key]=val_func(func(temp[key][0],temp[key][1],temp[key][2],temp[key][3], {}, temp, evaluate, true));
  665. ret[key]=temp[key];
  666. }
  667. merge_dict(temp, _gsym);
  668. return ret;
  669. }
  670. var macro_expansion=function(Ast, cont){
  671. var gsym=global_symtable(Ast);
  672. var msym=macro_symtable(Ast,gsym);
  673.  
  674. var KFFD=(function(_t, _msym, cont){
  675. var id_set={};
  676. var rename_set={};
  677. var S=function(index, _e){
  678. return (function(_t){
  679. if(nonEmpty(_t)){
  680. if(!(_t in id_set)){
  681. id_set[_t]={};
  682. }
  683. id_set[_t][index]=true;
  684. if(_e){
  685. return ['#', _t, index].concat(_e);
  686. }
  687. else{
  688. return ['#', _t, index];
  689. }
  690. }
  691. else{
  692. return _t;
  693. }
  694. });
  695. }
  696. var T=function(_t, s){
  697. if(isArray(_t)){
  698. if(nonEmpty(_t)){
  699. if(_t[0] in set(['->','<-','!=','<=','>=','<','>','=','+','-','*','/','%','^','!','_'])){
  700. return [_t[0], T(_t[1],s), T(_t[2],s)];
  701. }
  702. else if(_t[0]=='()'){
  703. return [_t[0],_t[1].map(function(x){ return T(x,s); })];
  704. }
  705. else if(_t[0] in set(['[]','\\()\\','\\{}\\','~','delay','callcc','eval','curry'])){
  706. return [_t[0], T(_t[1],s)];
  707. }
  708. else if(_t[0]=='|'){
  709. return [_t[0],_t[1].map(function(x){ return [T(x[0],s),T(x[1],s)]; })];
  710. }
  711. else if(_t[0]=='None'){
  712. return _t;
  713. }
  714. else if(_t[0]=='lambda'){
  715. return [_t[0], T(_t[1],s), _t[2].map(function(x){ return T(x,s); }), T(_t[3],s)];
  716. }
  717. else if(_t[0] in set(['def','def_const','def!','def!_const'])){
  718. return null;
  719. }
  720. else if(_t[0]=='#'){
  721. return _t;
  722. }
  723. }
  724. else{
  725. return null;
  726. }
  727. }
  728. else{
  729. if(isString(_t) && !(_t in _msym)){
  730. return s(_t);
  731. }
  732. else{
  733. return _t;
  734. }
  735. }
  736. }
  737. var E=function(_t, index, cont){
  738. var E_impl=function(_t, index, env, bound, match, cont){
  739. if(isArray(_t)){
  740. if(nonEmpty(_t)){
  741. if(_t[0] in set(['->','!=','<=','>=','<','>','=','+','-','*','/','%','^','!','_'])){
  742. return E_impl.bind(null,_t[1], index, env, bound, 0, function(x){
  743. return E_impl.bind(null,_t[2], index, env, bound, 0, function(y){
  744. return cont.bind(null,[_t[0],x,y]);
  745. });
  746. });
  747. }
  748. else if(_t[0]=='<-'){
  749. return E_impl.bind(null,_t[1], index, env, bound, match, function(x){
  750. return E_impl.bind(null,_t[2], index, env, bound, match, function(y){
  751. if(isString(x) && x in _msym){
  752. var dirty=(_msym[x](-1)[0].indexOf('!')!=-1);
  753. return _msym[x]().bind(null,null,function(f){
  754. return f().bind(null,y[1].map(function(k){ return val_func(ast_func(k)); }),function(v0){
  755. return v0().bind(null,null, function(v){
  756. if(!isFunction(v)) v=val_func(v);
  757. if(dirty){
  758. return E_impl.bind(null, T(v(-1), function(_t){ return _t in bound? S(index-1)(_t):S(index-1,env)(_t); }), index, env, bound, match, function(n){
  759. return cont.bind(null,n);
  760. });
  761. }
  762. else{
  763. return E_impl.bind(null, T(v(-1), S(index,v(-3))), index+1, v(-3), {}, match, function(n){
  764. return cont.bind(null,n);
  765. });
  766. }
  767. });
  768. });
  769. });
  770. }
  771. return cont.bind(null,[_t[0],x,y]);
  772. });
  773. });
  774. }
  775. else if(_t[0]=='()'){
  776. return map_cps.bind(null,function(x,cont){
  777. return E_impl.bind(null,x, index, env, bound, match, cont);
  778. },
  779. _t[1],
  780. function(x){
  781. return cont.bind(null,['()',x]);
  782. });
  783. }
  784. else if(_t[0] in set(['[]','\\()\\','\\{}\\','delay','callcc','eval','curry'])){
  785. return E_impl.bind(null,_t[1], index, env, bound, match+(match&&(_t[0]=='[]'||(-(_t[0] in set(['\\()\\','\\{}\\']))))), function(x){
  786. return cont.bind(null,[_t[0],x]);
  787. });
  788. }
  789. else if(_t[0]=='~'){
  790. return E_impl.bind(null,_t[1], index, env, bound, match, function(x){
  791. if(isString(x) || x==null ||
  792. (isArray(x)&&nonEmpty(x)&&x[0] in set(['#','\\()\\','\\{}\\']))){
  793. if (isString(x) && nonEmpty(x)){
  794. bound[x]=true;
  795. }
  796. else if(isArray(x) && x[0]=='#' && isString(x[1]) && nonEmpty(x[1])){
  797. bound[x[1]]=true;
  798. }
  799. return cont.bind(null,[_t[0],x]);
  800. }
  801. else{
  802. do_raise_syntax("expect identifier, given: "+AstToString(x).replace(/\n$/,''));
  803. }
  804. });
  805. }
  806. if(_t[0]=='->'){
  807. return E_impl.bind(null,_t[1], index, env, bound, match, function(x){
  808. if(nonEmpty(_t[2]) && _t[2][0]=='|'){
  809. return E_impl.bind(null,_t[2], index, env, bound, 1, function(y){
  810. return cont.bind(null,[_t[0],x,y]);
  811. });
  812. }
  813. else{
  814. return E_impl.bind(null,_t[2], index, env, bound, match, function(y){
  815. return cont.bind(null,[_t[0],x,y]);
  816. });
  817. }
  818. });
  819. }
  820. else if(_t[0]=='|'){
  821. return map_cps.bind(null,function(x,cont){
  822. var sub=bound;
  823. if(match==1){
  824. sub={};
  825. for (var key in bound) {
  826. sub[key]=bound[key];
  827. }
  828. }
  829. return E_impl.bind(null, x[0], index, env, sub, match, function(y){
  830. return E_impl.bind(null, x[1], index, env, sub, 0, function(z){
  831. return cont.bind(null,[y,z]);
  832. });
  833. });
  834. },
  835. _t[1],
  836. function(x){
  837. return cont.bind(null,['|',x]);
  838. });
  839. }
  840. else if(_t[0]=='None'){
  841. return cont.bind(null,_t);
  842. }
  843. else if(_t[0]=='lambda'){
  844. var b={};
  845. return E_impl.bind(null,_t[1], index, env, bound, match, function(x){
  846. if(!(x==null || isString(x) || (isArray(x)&&nonEmpty(x)&&x[0] in set(['#','~','\\{}\\','\\()\\'])))){
  847. do_raise_syntax("invaild function name: "+AstToString(x).replace(/\n$/,''));
  848. }
  849. return E_impl.bind(null,['()',_t[2]], index, env, b, 1, function(y){
  850. y[1].forEach(function(item,index){
  851. if(isString(item) && nonEmpty(item)){
  852. b[item]=true;
  853. }
  854. else if(isArray(item)&&nonEmpty(item)&&item[0]=='#'){
  855. b[item[1]]=true;
  856. }
  857. else if(!(isArray(item)&&nonEmpty(item)&&item[0] in set (['#','~','lambda','[]','()','\\{}\\','\\()\\']) ||
  858. isNumber(item) || item==null)){
  859. do_raise_syntax("invaild function argument: "+AstToString(item).replace(/\n$/,''));
  860. }
  861. });
  862. return E_impl.bind(null,_t[3], index, env, b, match, function(z){
  863. return cont.bind(null,[_t[0],x==null?'':x,y[1],z]);
  864. });
  865. });
  866. });
  867. }
  868. else if(_t[0] in set(['def','def_const','def!','def!_const'])){
  869. return cont.bind(null,null);
  870. }
  871. else if(_t[0]=='#'){
  872. return cont.bind(null,_t);
  873. }
  874. }
  875. else{
  876. return cont.bind(null,null);
  877. }
  878. }
  879. else{
  880. if(isString(_t) && _t in _msym && _msym[_t](-1)[0] in set(['def_const','def!_const'])){
  881. var dirty=(_msym[_t](-1)[0].indexOf('!')!=-1);
  882. return _msym[_t]().bind(null,null,function(f){
  883. return f().bind(null,[],function(v0){
  884. return v0().bind(null,null, function(v){
  885. if(!isFunction(v)) v=val_func(v);
  886. if(dirty){
  887. return E_impl.bind(null, T(v(-1), function(_t){ return _t in bound? S(index-1)(_t) : S(index-1,env)(_t); }), index, env, bound, match, function(n){
  888. return cont.bind(null,n);
  889. });
  890. }
  891. else{
  892. return E_impl.bind(null, T(v(-1), S(index,v(-3))), index+1, v(-3), {}, match, function(n){
  893. return cont.bind(null,n);
  894. });
  895. }
  896. });
  897. });
  898. });
  899. }
  900. else{
  901. return cont.bind(null,_t);
  902. }
  903. }
  904. }
  905. return E_impl.bind(null,_t,index,undefined,{},0,cont);
  906. }
  907. var A=function(_t){
  908. if(isArray(_t)){
  909. if(nonEmpty(_t)){
  910. if(_t[0] in set(['->','<-','!=','<=','>=','<','>','=','+','-','*','/','%','^','!','_'])){
  911. return [_t[0], A(_t[1]), A(_t[2])];
  912. }
  913. else if(_t[0]=='()'){
  914. return [_t[0],_t[1].map(function(x){ return A(x); })];
  915. }
  916. else if(_t[0] in set(['[]','\\()\\','\\{}\\','delay','callcc','eval','curry'])){
  917. return [_t[0], A(_t[1])];
  918. }
  919. else if(_t[0]=='~'){
  920. if(isArray(_t[1]) && nonEmpty(_t[1]) && _t[1][0]=='#'){
  921. if(Object.keys(id_set[_t[1][1]]).length>1){
  922. var name=_t[1][1];
  923. var i=0;
  924. while(name+'_'+i in id_set) ++i;
  925. name=name+'_'+i;
  926. id_set[name]={};
  927. id_set[name][_t[1][2]]=true;
  928. rename_set[_t[1][1]+'#'+_t[1][2]]=name;
  929. }
  930. else{
  931. rename_set[_t[1][1]+'#'+_t[1][2]]=_t[1][1];
  932. }
  933. }
  934. return [_t[0], A(_t[1])];
  935. }
  936. else if(_t[0]=='|'){
  937. return [_t[0],_t[1].map(function(x){ return [A(x[0]),A(x[1])]; })];
  938. }
  939. else if(_t[0]=='None'){
  940. return ['None'];
  941. }
  942. else if(_t[0]=='lambda'){
  943. var args=_t[2]
  944. .map(function(x){ return A(x); })
  945. .map(function(x){
  946. if(isArray(x) && x[0]=='#'){
  947. if(Object.keys(id_set[x[1]]).length>1){
  948. var name=x[1];
  949. var i=0;
  950. while(name+'_'+i in id_set) ++i;
  951. name=name+'_'+i;
  952. id_set[name]={};
  953. id_set[name][x[2]]=true;
  954. rename_set[x[1]+'#'+x[2]]=name;
  955. return name;
  956. }
  957. else{
  958. rename_set[x[1]+'#'+x[2]]=x[1];
  959. return x[1];
  960. }
  961. }
  962. else{
  963. return x;
  964. }
  965. });
  966. return [_t[0], A(_t[1]), args, A(_t[3])];
  967. }
  968. else if(_t[0] in set(['def','def_const','def!','def!_const'])){
  969. return null;
  970. }
  971. else if(_t[0]=='#'){
  972. if(_t[2]==0){
  973. return _t[1];
  974. }
  975. else{
  976. return ((_t[1]+'#'+_t[2]) in rename_set ? rename_set[(_t[1]+'#'+_t[2])] : _t);
  977. }
  978. }
  979. }
  980. else{
  981. return null;
  982. }
  983. }
  984. else{
  985. return _t;
  986. }
  987. }
  988. var U=function(_t){
  989. if(isArray(_t)){
  990. if(nonEmpty(_t)){
  991. if(_t[0] in set(['->','<-','!=','<=','>=','<','>','=','+','-','*','/','%','^','!','_'])){
  992. return [_t[0], U(_t[1]), U(_t[2])];
  993. }
  994. else if(_t[0]=='()'){
  995. return [_t[0],_t[1].map(function(x){ return U(x); })];
  996. }
  997. else if(_t[0] in set(['[]','\\()\\','\\{}\\','~','delay','callcc','eval','curry'])){
  998. return [_t[0], U(_t[1])];
  999. }
  1000. else if(_t[0]=='|'){
  1001. return [_t[0],_t[1].map(function(x){ return [U(x[0]),U(x[1])]; })];
  1002. }
  1003. else if(_t[0]=='None'){
  1004. return ['None'];
  1005. }
  1006. else if(_t[0]=='lambda'){
  1007. var f=_t[1]==null ? '' :
  1008. isArray(_t[1]) && nonEmpty(_t[1]) && _t[1][0]=='#' ? _t[1][1] :
  1009. _t[1];
  1010. return [_t[0], f, _t[2].map(function(x){ return U(x); }), U(_t[3])];
  1011. }
  1012. else if(_t[0] in set(['def','def_const','def!','def!_const'])){
  1013. return null;
  1014. }
  1015. else if(_t[0]=='#'){
  1016. if(_t.length==3){
  1017. return _t[1];
  1018. }
  1019. else{
  1020. return _t;
  1021. }
  1022. }
  1023. }
  1024. else{
  1025. return null;
  1026. }
  1027. }
  1028. else{
  1029. return _t;
  1030. }
  1031. }
  1032.  
  1033. return E.bind(null,T(_t,S(0)),1,function(x){
  1034. return cont.bind(null, U(A(x)));
  1035. });
  1036. });
  1037.  
  1038. var expansion=(function(_t, _msym, cont){
  1039. return map_cps.bind(null,function(x,cont){
  1040. return KFFD.bind(null, x, _msym, cont);
  1041. },
  1042. _t,
  1043. function(x){
  1044. return cont.bind(null,x.filter(function(v){
  1045. return (isArray(v) && nonEmpty(v)) || v!=null;
  1046. }));
  1047. });
  1048. });
  1049.  
  1050. return (expansion.bind(null, Ast, msym, function(x){
  1051. return cont.bind(null,x);
  1052. }));
  1053. }
  1054. var environment=function(_env, _symtable){
  1055. return function(_syb){
  1056. return (_syb in _env) ? _env[_syb] :
  1057. (_syb in _symtable) ? _symtable[_syb] :
  1058. do_raise("undefine symbol: "+_syb);
  1059. };
  1060. }
  1061. var ast_func=function(_ast, _env, _gsym){
  1062. var code=AstToString(_ast).replace(/\n$/,'');
  1063. if(code.indexOf('\n')==-1){
  1064. code='['+code+']';
  1065. }
  1066. else{
  1067. code='[\n'+indent(code)+'\n]';
  1068. }
  1069. return function(i){
  1070. if(i === undefined) {
  1071. i = 0;
  1072. }
  1073. switch(i){
  1074. case -3:
  1075. return [_env, _gsym];
  1076. case -1:
  1077. return _ast;
  1078. case 0:
  1079. do_raise("invaild evaluate on Ast: "+code);
  1080. case 1:
  1081. return function(){
  1082. return code;
  1083. }
  1084. case 2:
  1085. return 'Ast';
  1086. }
  1087. }
  1088. }
  1089. var builtin_func=function(f, name, args, decay){
  1090. if(decay === undefined) {
  1091. decay = true;
  1092. }
  1093. return function(i){
  1094. if(i === undefined) {
  1095. i = 0;
  1096. }
  1097. switch(i){
  1098. case -2:
  1099. return args.length;
  1100. case -1:
  1101. return name;
  1102. case 0:
  1103. return function(_args, cont){
  1104. if(_args.length==args.length){
  1105. if(!decay){
  1106. return f.bind.apply(f, [null].concat(_args).concat([function(x){
  1107. return cont.bind(null,x);
  1108. }]));
  1109. }
  1110. else{
  1111. return map_cps.bind(null, function(x,cont){
  1112. return x().bind(null,null,cont);
  1113. },
  1114. _args,
  1115. function(x){
  1116. return f.bind.apply(f, [null].concat(x).concat([function(y){
  1117. return cont.bind(null,val_func(y));
  1118. }]));
  1119. });
  1120. }
  1121. }
  1122. else{
  1123. do_raise("call lambda<"+name+"> with unmatched arguments,\nexpect: "+argument_number(args.length)+" ("+
  1124. args.join(',')+'),\ngiven: '+
  1125. argument_number(_args.length)
  1126. );
  1127. }
  1128. };
  1129. case 1:
  1130. return function(cont){
  1131. return cont.bind(null, ('lambda<'+name+'('+args.join(', ')+')>'));
  1132. }
  1133. case 2:
  1134. return 'lambda_builtin';
  1135. }
  1136. }
  1137. }
  1138. var continuation_func=function(cont){
  1139. return function(i){
  1140. if(i === undefined) {
  1141. i = 0;
  1142. }
  1143. switch(i){
  1144. case -2:
  1145. return 1;
  1146. case -1:
  1147. do_raise("No explicit Ast of continuation function");
  1148. case 0:
  1149. return function(_args, _cont){
  1150. if(_args.length==1){
  1151. return cont.bind(null, _args[0]);
  1152. }
  1153. else{
  1154. do_raise('call lambda<<continuation>> with unmatched arguments,\nexpect: 1 argument (return_value),\ngiven: '+
  1155. argument_number(_args.length)
  1156. );
  1157. }
  1158. };
  1159. case 1:
  1160. return function(cont){
  1161. return cont.bind('lambda<<continuation>>');
  1162. }
  1163. case 2:
  1164. return 'lambda_continuation';
  1165. }
  1166. }
  1167. }
  1168. var func=function(_type, _name, _args, _body, _env, _gsym, _eval, _macro){
  1169. var decay=_args.length==1 &&
  1170. Object.keys(set(_args[0].filter(isString))).length==_args[0].length;
  1171. if(_macro === undefined) {
  1172. _macro = false;
  1173. }
  1174. return function(i){
  1175. if(i === undefined) {
  1176. i = 0;
  1177. }
  1178. switch(i){
  1179. case -2:
  1180. return _args[0].length;
  1181. case -1:
  1182. return (function(){
  1183. if(_args.length==1){
  1184. return [_type,_name,_args[0],_body[0]];
  1185. }
  1186. else{
  1187. var atom=_args[0].length==1;
  1188. var args=[], body=[];
  1189. for(var i in _args[0])
  1190. args.push('arg_'+i);
  1191. for(var i in _args)
  1192. body.push([atom?(function(x){ return isString(x)? ['~',x]:x; })(_args[i][0]):['()',_args[i].map(function(x){ return isString(x)? ['~',x]:x; })],_body[i]]);
  1193. body=['->',atom?args[0]:['()',args],['|',body]];
  1194. return [_type,_name,args,body];
  1195. }
  1196. })();
  1197. case 0:
  1198. return function(_args0, cont){
  1199. var atom=_args[0].length==1;
  1200. var err = function(){
  1201. if(_args.length==1){
  1202. do_raise("call "+(_macro?"macro":"lambda")+"<"+((_name) ? _name : 'unnamed')+"> with unmatched arguments,\nexpect: "+ argument_number(_args.length) +"("+
  1203. _args[0].map(function(x){ return AstToString(x).replace(/\n$/,''); }).join(',')+'),\ngiven: '+
  1204. argument_number(_args0.length)
  1205. );
  1206. }
  1207. else{
  1208. do_raise("call "+(_macro?"macro":"lambda")+"<"+((_name) ? _name : 'unnamed')+"> with unmatched arguments,\nexpect one of: "+
  1209. _args.map(function(x){return '('+x.map(function(y){ return AstToString(y).replace(/\n$/,''); }).join(',')+')'; }).join(', ')
  1210. );
  1211. }
  1212. }
  1213. var L = function(i,cont){
  1214. return _eval.bind(null,
  1215. atom?(function(x){ return isString(x)? ['~',x,-1]:x; })(_args[i][0]):['()',_args[i].map(function(x){ return isString(x)? ['~',x,-1]:x; })],
  1216. _env, _gsym,
  1217. function(args){
  1218. return unify.bind(null,atom?_args0[0]:val_func(_args0),args,function(u){
  1219. if(u[0]){
  1220. return _eval.bind(null, _body[i], merge_dict(u[1], _env), _gsym, cont);
  1221. }
  1222. else if(i+1<_args.length){
  1223. return L.bind(null,i+1,cont);
  1224. }
  1225. else{
  1226. err();
  1227. }
  1228. });
  1229. });
  1230. }
  1231. if(_args0.length==_args[0].length){
  1232. if(decay){
  1233. var _new_env={};
  1234. _args[0].forEach(function(item,index){
  1235. _new_env[item]=_args0[index];
  1236. });
  1237. var ret;
  1238. return _eval.bind(null, _body[0], merge_dict(_new_env, _env), _gsym, cont);
  1239. }
  1240. else{
  1241. return L.bind(null,0,cont);
  1242. }
  1243. }
  1244. else{
  1245. err();
  1246. }
  1247. };
  1248. case 1:
  1249. return function(cont){
  1250. if(_args.length==1){
  1251. return cont.bind(null, ((_macro?"macro":"lambda")+'<'+
  1252. (nonEmpty(_name) ? _name : 'unnamed')+
  1253. '('+_args[0].map(function(x){
  1254. return AstToString(x).replace(/\n$/,'');
  1255. }).join(', ')+')>'));
  1256. }
  1257. else{
  1258. var args=[];
  1259. for(var i in _args[0])
  1260. args.push('arg_'+i);
  1261. return cont.bind(null, ((_macro?"macro":"lambda")+'<'+(nonEmpty(_name) ? _name : 'unnamed')+'('+args.join(', ')+')>'));
  1262. }
  1263. }
  1264. case 2:
  1265. return (_macro?"macro":"lambda");
  1266. }
  1267. }
  1268. }
  1269. var delay_func=function(_body, _env, _gsym, _eval, value){
  1270. return function(i){
  1271. if(i === undefined) {
  1272. i = 0;
  1273. }
  1274. if(i==-1){
  1275. return _body;
  1276. }
  1277. else if(i==-2){
  1278. return (isArray(_body) && nonEmpty(_body) && _body[0]=='lambda') ? _body[2].length : undefined;
  1279. }
  1280. else if(i==3){
  1281. return 'delay_expr';
  1282. }
  1283. else{
  1284. if(typeof(value) == 'undefined'){
  1285. return function(){
  1286. var args=Array.prototype.slice.call(arguments);
  1287. return _eval.bind(null, _body, _env, _gsym, function(x){
  1288. value=x;
  1289. var r=x(i);
  1290. return r.bind.apply(r,[null].concat(Array.prototype.slice.call(args)));
  1291. });
  1292. }
  1293. }
  1294. else{
  1295. return value(i);
  1296. }
  1297. }
  1298. }
  1299. }
  1300. var val_func=function(_val){
  1301. return function(i){
  1302. if(i === undefined) {
  1303. i = 0;
  1304. }
  1305. switch(i){
  1306. case -1:
  1307. return (wapper(function(self,_v){
  1308. if(isFunction(_v)){
  1309. return _v(-1);
  1310. }
  1311. else if(isArray(_v)){
  1312. return ['()',_v.map(function(x){
  1313. return self(x);
  1314. })];
  1315. }
  1316. else if(_v==null){
  1317. return 'None';
  1318. }
  1319. return _v;
  1320. })(_val));
  1321. case 0:
  1322. return function(_args, cont){
  1323. return cont.bind(null,_val);
  1324. };
  1325. case 1:
  1326. return function(cont){
  1327. if(isFunction(_val)){
  1328. return _val(1).bind(null, cont);
  1329. }
  1330. else if(isArray(_val)){
  1331. return map_cps.bind(null, result_of, _val, function(v){
  1332. return cont.bind(null, '('+v.toString()+')');
  1333. });
  1334. }
  1335. else if(_val==null){
  1336. return cont.bind(null, 'None');
  1337. }
  1338. return cont.bind(null, _val.toString());
  1339. }
  1340. case 2:
  1341. return 'value';
  1342. }
  1343. }
  1344. }
  1345. var free_identifier_func=function(id){
  1346. return function(i){
  1347. if(i === undefined) {
  1348. i = 0;
  1349. }
  1350. switch(i){
  1351. case -1:
  1352. return ['~',id,1];
  1353. case 0:
  1354. return function(_args, cont){
  1355. return cont.bind(null,null);
  1356. };
  1357. case 1:
  1358. return (function(cont){ return cont.bind(null, 'None'); });
  1359. case 2:
  1360. return 'free_identifier';
  1361. case 3:
  1362. return id;
  1363. }
  1364. }
  1365. }
  1366. var func_combinator=function(x, y, op, op_ch){
  1367. var getFunc=function(v){
  1368. if(v(2)=='lambda_continuation'){
  1369. return ['lambda','continuation',['retValue']];
  1370. }
  1371. if(v(2)=='lambda_builtin'){
  1372. return builtin_func_signature(v(-1));
  1373. }
  1374. else{
  1375. return v(-1);
  1376. }
  1377. };
  1378. var fx=getFunc(x);
  1379. var fy=getFunc(y);
  1380. var args_length=0;
  1381. if(x(2)!='value'&&y(2)!='value'){
  1382. if(fx[2].length!=fy[2].length){
  1383. do_raise("combine lambda<"+((fx[1]) ? fx[1] : 'unnamed')+"> with lambda<"+((fy[1]) ? fy[1] : 'unnamed')+"> unmatched arguments,\n arguments of "+
  1384. "lambda<"+((fx[1]) ? fx[1] : 'unnamed')+">: ("+fx[2].join(',')+"),\n arguments of "+
  1385. "lambda<"+((fy[1]) ? fy[1] : 'unnamed')+">: ("+fy[2].join(',')+")"
  1386. );
  1387. }
  1388. args_length=fx[2].length;
  1389. }
  1390. return function(i){
  1391. if(i === undefined) {
  1392. i = 0;
  1393. }
  1394. switch(i){
  1395. case -2:
  1396. return args_length;
  1397. case -1:
  1398. return (function(){
  1399. var n,m=0;
  1400. var args=[];
  1401. var fx_name='',fy_name='';
  1402. var call_x,call_y;
  1403. if(x(2)!='value'){
  1404. n=fx[2].length;
  1405. fx_name=fx[1];
  1406. }
  1407. if(y(2)!='value'){
  1408. n=fy[2].length;
  1409. fy_name=fy[1];
  1410. }
  1411. for (var i = 0; i<n; i++) {
  1412. while(('arg_'+m)==fx_name||('arg_'+m)==fy_name){
  1413. m++;
  1414. }
  1415. args.push('arg_'+m);
  1416. m++;
  1417. }
  1418. if(x(2)!='value') call_x=['<-',x(-1),['()',args]];
  1419. else call_x=x(-1);
  1420. if(y(2)!='value') call_y=['<-',y(-1),['()',args]];
  1421. else call_y=y(-1);
  1422. return ['lambda','',args,[op_ch,call_x,call_y]];
  1423. })();
  1424. case 0:
  1425. return function(_args, cont){
  1426. return x().bind(null,_args, function(x){
  1427. return y().bind(null,_args, function(y){
  1428. return op.bind(null,x,y,cont);
  1429. });
  1430. });
  1431. };
  1432. case 1:
  1433. return function(cont){
  1434. return result_of.bind(null, x, function(v1){
  1435. result_of.bind(null, y, function(v2){
  1436. return cont.bind(null, 'lambda<'+v1+op_ch+v2+'>');
  1437. });
  1438. });
  1439. }
  1440. case 2:
  1441. return 'lambda_combinator';
  1442. }
  1443. }
  1444. }
  1445. var curry_func=function(f){
  1446. if(!isFunction(f) || f(2)=='Ast' || f(2)=='free_identifier'){
  1447. do_raise("currying a not callable object ");
  1448. }
  1449. else if(f(2)=='lambda_continuation'){
  1450. return f;
  1451. }
  1452. else if(f(-2)==1){
  1453. return f;
  1454. }
  1455. var args_length=f(-2);
  1456. return wapper(function(self,i,args,index){
  1457. if(args === undefined) {
  1458. args = [];
  1459. }
  1460. if(index === undefined) {
  1461. index = 0;
  1462. }
  1463. if(i === undefined) {
  1464. i = 0;
  1465. }
  1466. switch(i){
  1467. case -2:
  1468. return 1;
  1469. case -1:
  1470. return ((function(){
  1471. var L=function(i){
  1472. if(i+1<args_length){
  1473. return ['lambda','',['arg_'+i],L(i+1)];
  1474. }
  1475. else{
  1476. var _args=[];
  1477. for (var _i = index; _i < args_length; ++_i) {
  1478. _args.push('arg_'+i);
  1479. }
  1480. return ['lambda','',['arg_'+i],['<-',f(-1),['()',args.map(function(x){ return x(-1); }).concat(_args)]]];
  1481. }
  1482. }
  1483. return L(index);
  1484. })());
  1485. case 0:
  1486. return function(_args, cont){
  1487. if(_args.length==1 && index+1<args_length){
  1488. return cont.bind(null, val_func(function(i){
  1489. return self(i,args.concat([_args[0]]),index+1);
  1490. }));
  1491. }
  1492. else if(_args.length==1 && index+1==args_length){
  1493. return f().bind(null,args.concat([_args[0]]),cont);
  1494. }
  1495. else{
  1496. do_raise('call currying '+f(1)()+' with unmatched arguments,\n expect: 1 argument (arg_'+index+'), given: '+
  1497. argument_number(_args.length)
  1498. );
  1499. }
  1500. };
  1501. case 1:
  1502. return (function(cont){ return f(1).bind(null, function(v){return cont.bind(null, 'currying '+v);}); });
  1503. case 2:
  1504. return 'lambda_curry';
  1505. }
  1506. });
  1507. }
  1508. var op_args=function(f){
  1509. return function(x){
  1510. if(isFunction(x)&&x(2)=='free_identifier')
  1511. return f.bind(null,null);
  1512. else if(isFunction(x)&&x(2)=='Ast')
  1513. do_raise("invaild evaluate on Ast: "+x(1)());
  1514. else
  1515. return f.bind(null,x);
  1516. }
  1517. }
  1518. var op_gen=function(op, op_ch){
  1519. return wapper(function(self,x,y,cont){
  1520. return x().bind(null,null,op_args(function(a){
  1521. return y().bind(null,null,op_args(function(b){
  1522. if(!isFunction(a)&&!isFunction(b)){
  1523. return op.bind(null,a,b,function(x){
  1524. return cont.bind(null,val_func(x));
  1525. });
  1526. }
  1527. else{
  1528. return cont.bind(null,val_func(func_combinator((isFunction(a)?a:val_func(x)),(isFunction(b)?b:val_func(y)),self,op_ch)));
  1529. }
  1530. }));
  1531. }));
  1532. });
  1533. }
  1534. var op_check=function(f){
  1535. return function(x,y,cont){
  1536. if(!isArray(x)&&!isArray(y)){
  1537. return f.bind(null,x,y,cont);
  1538. }
  1539. else{
  1540. do_raise("invaild operatation on vector");
  1541. }
  1542. };
  1543. }
  1544. var combinator=function(_sym){
  1545. return {
  1546. '<-':function(x,y,cont){
  1547. return x().bind(null,null,function(f){
  1548. if(isFunction(f) && f(2)!='value'){
  1549. return y().bind(null,null,function(_args){
  1550. return f().bind(null,_args,cont);
  1551. });
  1552. }
  1553. else{
  1554. return result_of.bind(null, x, function(v){
  1555. do_raise("calling a not callable object "+v);
  1556. });
  1557. }
  1558. });
  1559. },
  1560. '<=':op_gen(op_check(function(a,b,cont){return cont.bind(null,a<=b);}),'<='),
  1561. '>=':op_gen(op_check(function(a,b,cont){return cont.bind(null,a>=b);}),'>='),
  1562. '<':op_gen(op_check(function(a,b,cont){return cont.bind(null,a<b);}),'<'),
  1563. '>':op_gen(op_check(function(a,b,cont){return cont.bind(null,a>b);}),'>'),
  1564. '!=':op_gen(op_check(function(a,b,cont){return cont.bind(null,a!=b);}),'!='),
  1565. '=':op_gen(op_check(function(a,b,cont){return cont.bind(null,a==b);}),'='),
  1566. '+':op_gen(function(a,b,cont){
  1567. if(!isArray(a)&&!isArray(b)){
  1568. return cont.bind(null,a+b);
  1569. }
  1570. else{
  1571. var x=isArray(a) ? a : [val_func(a)];
  1572. var y=isArray(b) ? b : [val_func(b)];
  1573. return cont.bind(null,x.concat(y));
  1574. }
  1575. },'+'),
  1576. '-':op_gen(function(a,b,cont){
  1577. if(!isArray(a)&&!isArray(b)){
  1578. return cont.bind(null,a-b);
  1579. }
  1580. else if(isArray(a)&&!isArray(b)){
  1581. return cont.bind(null,a.slice(0,-1));
  1582. }
  1583. else if(!isArray(a)&&isArray(b)){
  1584. return cont.bind(null,b.slice(1));
  1585. }
  1586. else if(isArray(a)&&isArray(b)){
  1587. if(a.length<=b.length){
  1588. return cont.bind(null,[]);
  1589. }
  1590. else{
  1591. return cont.bind(null,a.slice(0,-b.length));
  1592. }
  1593. }
  1594. },'-'),
  1595. '*':op_gen(op_check(function(a,b,cont){return cont.bind(null,a*b);}),'*'),
  1596. '/':op_gen(op_check(function(a,b,cont){return cont.bind(null,a/b);}),'/'),
  1597. '%':op_gen(op_check(function(a,b,cont){return cont.bind(null,a%b);}),'%'),
  1598. '^':op_gen(op_check(function(a,b,cont){return cont.bind(null,Math.pow(a,b));}),'^'),
  1599. '_':op_gen(function(a,b,cont){
  1600. if(isArray(a)&&!isArray(b)){
  1601. if(Number.isInteger(b)){
  1602. if(b<=a.length&&b>0){
  1603. return a[b-1]().bind(null,null,function(r){
  1604. return cont.bind(null,r);
  1605. });
  1606. }
  1607. else{
  1608. do_raise("index of vector out of range");
  1609. }
  1610. }
  1611. else{
  1612. do_raise("invaild index of vector");
  1613. }
  1614. }
  1615. else{
  1616. do_raise("invaild operatation on vector");
  1617. }
  1618. },'_'),
  1619. '!':op_gen(op_check(function(a,b,cont){
  1620. var i=(b==null)?0:b;
  1621. if(b<0){
  1622. return cont.bind(null,0);
  1623. }
  1624. else{
  1625. var ret=1;
  1626. var x=a;
  1627. while(x>b){
  1628. ret*=x--;
  1629. }
  1630. return cont.bind(null,ret);
  1631. }
  1632. }),'!'),
  1633. }[_sym];
  1634. }
  1635. var unify=function(n,m,cont){
  1636. var valE={};
  1637. var equivalent_value=function(val,cont,fail){
  1638. var visited_flag={};
  1639. var ev_impl=function(v,cont){
  1640. if(isFunction(v) && v(2)=='free_identifier'){
  1641. v=v(3);
  1642. }
  1643. if(v in visited_flag){
  1644. return fail;
  1645. }
  1646. visited_flag[v]=true;
  1647. var x=v;
  1648. while(x in valE){
  1649. x=valE[x];
  1650. }
  1651. if(isArray(x) && nonEmpty(x) && x[0]=='Ast'){
  1652. delete visited_flag[v];
  1653. return cont.bind(null,ast_func(x[1]));
  1654. }
  1655. else if(isArray(x)){
  1656. return map_cps.bind(null,function(x0,cont){
  1657. return x0().bind(null,null,function(x1){
  1658. return ev_impl.bind(null,x1,function(x2){
  1659. return cont.bind(null,val_func(x2));
  1660. });
  1661. });
  1662. },
  1663. x,
  1664. function(x){
  1665. delete visited_flag[v];
  1666. return cont.bind(null,x);
  1667. });
  1668. }
  1669. else if(isString(x)){
  1670. delete visited_flag[v];
  1671. valE[x]=null;
  1672. return cont.bind(null,null);
  1673. }
  1674. else{
  1675. delete visited_flag[v];
  1676. return cont.bind(null,x);
  1677. }
  1678. }
  1679. return ev_impl.bind(null,val,cont);
  1680. }
  1681. var unify_impl=function(_n,_m,cont){
  1682. var Alpha=function(x,y,u){
  1683. if(u === undefined) {
  1684. u = false;
  1685. }
  1686. var alpha_impl=function(x,y,rename,last_rename,match){
  1687. if(u){
  1688. var ex=x,ey=y;
  1689. if(isArray(x) && x.length==3 && x[0]=='~' && x[2]>0){
  1690. ex=isString(x[1])?'~'+x[1]:'~';
  1691. while(ex in valE) ex=valE[x];
  1692. }
  1693. if(isArray(y) && y.length==3 && y[0]=='~' && y[2]>0){
  1694. ey=isString(y[1])?'~'+y[1]:'~';
  1695. while(ey in valE) ey=valE[y];
  1696. }
  1697. if(ex=='~' || ey=='~' || (isString(ex) && nonEmpty(ex) && ex[0]=='~' && ex==ey)){
  1698. return true;
  1699. }
  1700. else if(isString(ex) && nonEmpty(ex) && ex[0]=='~'){
  1701. if(isString(ey) && nonEmpty(ey) && ey[0]=='~'){
  1702. valE[ex]=ey;
  1703. }
  1704. else{
  1705. valE[ex]=ast_func(ey);
  1706. }
  1707. return true;
  1708. }
  1709. else if(isString(ey) && nonEmpty(ey) && ey[0]=='~'){
  1710. valE[ey]=ast_func(ex);
  1711. return true;
  1712. }
  1713. else if(isArray(ex) && nonEmpty(ex) && ex[0]=='Ast'){
  1714. ex=ex[1];
  1715. }
  1716. else if(isArray(ey) && nonEmpty(ey) && ey[0]=='Ast'){
  1717. ey=ey[1];
  1718. }
  1719. x=ex; y=ey;
  1720. }
  1721. if(isArray(x) && isArray(y)){
  1722. if(nonEmpty(x) && nonEmpty(y) && x[0]==y[0]){
  1723. if(x[0] in set(['<-','!=','<=','>=','<','>','=','+','-','*','/','^','!','_'])){
  1724. return alpha_impl(x[1],y[1],rename,last_rename,false) && alpha_impl(x[2],y[2],rename,last_rename,false);
  1725. }
  1726. else if(x[0]=='()'){
  1727. if(x[1].length==y[1].length){
  1728. for(var i in x[1]){
  1729. if(!alpha_impl(x[1][i],y[1][i],rename,last_rename,match))
  1730. return false;
  1731. }
  1732. return true;
  1733. }
  1734. else if(u && x[1].length==y[1].length+1 && x[1][x[1].length-1][0]=='~' && x[1][x[1].length-1][2]==2){
  1735. if(alpha_impl(x[1][x[1].length-1],['()',[]],rename,last_rename,match)){
  1736. for(var i in y[1]){
  1737. if(!alpha_impl(x[1][i],y[1][i],rename,last_rename,match))
  1738. return false;
  1739. }
  1740. return true;
  1741. }
  1742. else{
  1743. return false;
  1744. }
  1745. }
  1746. else if(u && y[1].length==x[1].length+1 && y[1][y[1].length-1][0]=='~' && y[1][y[1].length-1][2]==2){
  1747. if(alpha_impl(['()',[]],y[1][y[1].length-1],rename,last_rename,match)){
  1748. for(var i in x[1]){
  1749. if(!alpha_impl(x[1][i],y[1][i],rename,last_rename,match))
  1750. return false;
  1751. }
  1752. return true;
  1753. }
  1754. else{
  1755. return false;
  1756. }
  1757. }
  1758. else if(u && nonEmpty(y[1]) && x[1].length>y[1].length){
  1759. var last=y[1][y[1].length-1];
  1760. if(isArray(last) && nonEmpty(last) && last[0]=='~' && last[2]==2 &&
  1761. alpha_impl(['()',x[1].slice(y[1].length-1,x[1].length)],last,rename,last_rename,match)){
  1762. for(var i=0; i<y[1].length-1; ++i){
  1763. if(!alpha_impl(x[1][i],y[1][i],rename,last_rename,match))
  1764. return false;
  1765. }
  1766. return true;
  1767. }
  1768. else{
  1769. return false;
  1770. }
  1771. }
  1772. else if(u && nonEmpty(x[1]) && x[1].length<y[1].length){
  1773. var last=x[1][x[1].length-1];
  1774. if(isArray(last) && nonEmpty(last) && last[0]=='~' && last[2]==2 &&
  1775. alpha_impl(last,['()',y[1].slice(x[1].length-1,y[1].length)],rename,last_rename,match)){
  1776. for(var i=0; i<x[1].length-1; ++i){
  1777. if(!alpha_impl(x[1][i],y[1][i],rename,last_rename,match))
  1778. return false;
  1779. }
  1780. return true;
  1781. }
  1782. else{
  1783. return false;
  1784. }
  1785. }
  1786. else{
  1787. return false;
  1788. }
  1789. }
  1790. else if(x[0] in set(['#','\\()\\','\\{}\\','delay','callcc','eval','curry'])){
  1791. return alpha_impl(x[1],y[1],rename,last_rename,match);
  1792. }
  1793. else if(x[0]=='[]'){
  1794. return alpha_impl(x[1],y[1],[{},{}],rename,match);
  1795. }
  1796. else if(x[0] in set(['\\()\\','\\{}\\'])){
  1797. return alpha_impl(x[1],y[1],last_rename,[{},{}],match);
  1798. }
  1799. else if(x[0]=='->'){
  1800. if(isArray(x[2]) && isArray(y[2])){
  1801. if(nonEmpty(x[2]) && nonEmpty(y[2]) && x[2][0]==y[2][0] && x[2][0]=='|'){
  1802. return alpha_impl(x[1],y[1],rename,last_rename,match) && alpha_impl(x[2],y[2],rename,last_rename,true);
  1803. }
  1804. }
  1805. return alpha_impl(x[1],y[1],rename,last_rename,match) && alpha_impl(x[2],y[2],rename,last_rename,match);
  1806. }
  1807. else if(x[0]=='~'){
  1808. if(match){
  1809. if(x[1]==y[1]){
  1810. return true;
  1811. }
  1812. else if(x[1]!=y[1] && !(x[1] in rename[0]) && !(y[1] in rename[1])){
  1813. rename[0][y[1]]=x[1];
  1814. rename[1][x[1]]=y[1];
  1815. return true;
  1816. }
  1817. else{
  1818. return false;
  1819. }
  1820. }
  1821. else{
  1822. return alpha_impl(x[1],y[1],rename,last_rename,match);
  1823. }
  1824. }
  1825. else if(x[0]=='|'){
  1826. if(x[1].length==y[1].length){
  1827. for(var i in x[1]){
  1828. if(match){
  1829. var n=[{},{}];
  1830. for (var key in rename[0]) {
  1831. n[0][key]=rename[0][key];
  1832. }
  1833. for (var key in rename[1]) {
  1834. n[1][key]=rename[1][key];
  1835. }
  1836. if(!(alpha_impl(x[1][i][0],y[1][i][0],n,last_rename,match)&&alpha_impl(x[1][i][1],y[1][i][1],n,last_rename,false)))
  1837. return false;
  1838. }
  1839. else{
  1840. if(!(alpha_impl(x[1][i][0],y[1][i][0],rename,last_rename,match)&&alpha_impl(x[1][i][1],y[1][i][1],rename,last_rename,false)))
  1841. return false;
  1842. }
  1843. }
  1844. return true;
  1845. }
  1846. else{
  1847. return false;
  1848. }
  1849. }
  1850. else if(x[0]=='None'){
  1851. return true;
  1852. }
  1853. else if(x[0]=='lambda'){
  1854. var alpha_function=function(x,y){
  1855. var n=[{},{}];
  1856. for (var key in rename[0]) {
  1857. n[0][key]=rename[0][key];
  1858. }
  1859. for (var key in rename[1]) {
  1860. n[1][key]=rename[1][key];
  1861. }
  1862. for (var i in y[2]){
  1863. if(isString(y[2][i]) && isString(x[2][i]) && y[2][i]!=x[2][i]){
  1864. n[0][y[2][i]]=x[2][i];
  1865. n[1][x[2][i]]=y[2][i];
  1866. }
  1867. else if(isArray(y[2][i]) && isArray(x[2][i]) && y[2][i][0]==x[2][i][0] && y[2][i][0] in set(['[]','()'])){
  1868. if(!alpha_impl(x[2][i],y[2][i],n,last_rename,true)){
  1869. return false;
  1870. }
  1871. }
  1872. }
  1873. alpha_impl(x[1],y[1],[{},{}],last_rename,match);
  1874. for (var i in y[2]){
  1875. if(!alpha_impl(x[2][i],y[2][i],n,last_rename,match)){
  1876. return false;
  1877. }
  1878. }
  1879. return alpha_impl(x[3],y[3],n,last_rename,match);
  1880. }
  1881. if(x[2].length==y[2].length){
  1882. return alpha_function(x,y);
  1883. }
  1884. else if(u && x[2].length==y[2].length+1 && x[2][x[2].length-1][0]=='~' && x[2][x[2].length-1][2]==2){
  1885. if(alpha_impl(x[2][x[2].length-1,['()',[]]],rename,last_rename,match)){
  1886. return alpha_function([x[0],x[1],x[2].slice(0,-1),x[3]],y);
  1887. }
  1888. else{
  1889. return false;
  1890. }
  1891. }
  1892. else if(u && y[2].length==x[2].length+1 && y[2][y[2].length-1][0]=='~' && y[2][y[2].length-1][2]==2){
  1893. if(alpha_impl(['()',[]],y[2][y[2].length-1],rename,last_rename,match)){
  1894. return alpha_function(x,[y[0],y[1],y[2].slice(0,-1),y[3]]);
  1895. }
  1896. else{
  1897. return false;
  1898. }
  1899. alpha_impl(x[1],y[1],[{},{}],last_rename,match);
  1900. alpha_impl(['()',[]],y[2][0],rename,last_rename,match)
  1901. return alpha_impl(x[3],y[3],rename,last_rename,match);
  1902. }
  1903. else if(u && nonEmpty(y[2]) && x[2].length>y[2].length){
  1904. var last=y[2][y[2].length-1];
  1905. if(isArray(last) && nonEmpty(last) && last[0]=='~' && last[2]==2 &&
  1906. alpha_impl(['()',x[2].slice(y[2].length-1,x[2].length)],last,rename,last_rename,match)){
  1907. return alpha_function([x[0],x[1],x[2].slice(0,y[2].length-1),x[3]],[y[0],y[1],y[2].slice(0,-1),y[3]]);
  1908. }
  1909. else{
  1910. return false;
  1911. }
  1912. }
  1913. else if(u && nonEmpty(x[2]) && x[2].length<y[2].length){
  1914. var last=x[2][x[2].length-1];
  1915. if(isArray(last) && nonEmpty(last) && last[0]=='~' && last[2]==2 &&
  1916. alpha_impl(['()',y[2].slice(x[2].length-1,y[2].length)],last,rename,last_rename,match)){
  1917. return alpha_function([x[0],x[1],x[2].slice(0,-1),x[3]],[y[0],y[1],y[2].slice(0,x[2].length-1),y[3]]);
  1918. }
  1919. else{
  1920. return false;
  1921. }
  1922. }
  1923. else{
  1924. return false;
  1925. }
  1926. }
  1927. else if(x[0] in set(['def','def_const','def!','def!_const'])){
  1928. return false;
  1929. }
  1930. }
  1931. else if(isEmpty(x) && isEmpty(y)){
  1932. return true;
  1933. }
  1934. else{
  1935. return false;
  1936. }
  1937. }
  1938. else if(!isArray(x) && !isArray(y)){
  1939. if((y in rename[0])){
  1940. y=rename[0][y];
  1941. }
  1942. else if(!(y in rename[0]) && (y in rename[1])){
  1943. return false;
  1944. }
  1945. return x===y;
  1946. }
  1947. else{
  1948. return false;
  1949. }
  1950. }
  1951. return alpha_impl(x,y,[{},{}],[{},{}],false);
  1952. }
  1953. var U=function(x,y,cont){
  1954. while(x in valE) x=valE[x];
  1955. while(y in valE) y=valE[y];
  1956. if(x==y){
  1957. return cont.bind(null,true);
  1958. }
  1959. else if(isArray(x) && isArray(y)){
  1960. if(nonEmpty(x) && x[0]=='Ast' && nonEmpty(y) && y[0]=='Ast'){
  1961. return cont.bind(null,Alpha(x[1],y[1],true));
  1962. }
  1963. else if((nonEmpty(x) && x[0]=='Ast') || (nonEmpty(y) && y[0]=='Ast')){
  1964. return cont.bind(null,false);
  1965. }
  1966. else{
  1967. if(x.length!=y.length){
  1968. return cont.bind(null,false);
  1969. }
  1970. else{
  1971. var L=function(i,cont){
  1972. if(i<x.length){
  1973. return unify_impl.bind(null,x[i],y[i],function(v){
  1974. if(v){
  1975. return L.bind(null,i+1,cont);
  1976. }
  1977. else{
  1978. return cont.bind(null,false);
  1979. }
  1980. });
  1981. }
  1982. else{
  1983. return cont.bind(null,true);
  1984. }
  1985. }
  1986. return L.bind(null,0,cont);
  1987. }
  1988. }
  1989. }
  1990. else if(isFunction(x) && isFunction(y) &&
  1991. x(2)!='lambda_continuation' && x(2)!='lambda_continuation'){
  1992. return cont.bind(null,Alpha(x(-1),y(-1)));
  1993. }
  1994. else if(isString(x)){
  1995. valE[x]=y;
  1996. return cont.bind(null,true);
  1997. }
  1998. else if(isString(y)){
  1999. valE[y]=x;
  2000. return cont.bind(null,true);
  2001. }
  2002. else if((isBoolean(x)||isBoolean(y)) && toBoolean(x)==toBoolean(y)){
  2003. return cont.bind(null,true);
  2004. }
  2005. else{
  2006. return cont.bind(null,false);
  2007. }
  2008. }
  2009.  
  2010. if((_n(3)=='delay_expr' && _m(3)!='delay_expr') ||
  2011. (_n(3)!='delay_expr' && _m(3)=='delay_expr')){
  2012. if(_m(3)=='delay_expr'){
  2013. var _t=_n;_n=_m;_m=_t;
  2014. }
  2015. return _m().bind(null,null,function(vy){
  2016. if(isFunction(vy) && vy(2)=='free_identifier'){
  2017. valE['~'+vy(3)]=_n;
  2018. return cont.bind(null,true);
  2019. }
  2020. else if(isFunction(vy) && vy(2)=='Ast'){
  2021. vy=['Ast',vy(-1)];
  2022. }
  2023. return _n().bind(null,null,function(vx){
  2024. if(isFunction(vx) && vx(2) in set(['free_identifier','Ast'])){
  2025. vx=vx(2)=='Ast'?['Ast',vx(-1)]:'~'+vx(3);
  2026. }
  2027. return U.bind(null,vx,vy,cont);
  2028. });
  2029. });
  2030. }
  2031. else{
  2032. return _n().bind(null,null,function(vx){
  2033. return _m().bind(null,null,function(vy){
  2034. if(isFunction(vx) && vx(2) in set(['free_identifier','Ast'])){
  2035. vx=vx(2)=='Ast'?['Ast',vx(-1)]:'~'+vx(3);
  2036. }
  2037. if(isFunction(vy) && vy(2) in set(['free_identifier','Ast'])){
  2038. vy=vy(2)=='Ast'?['Ast',vy(-1)]:'~'+vy(3);
  2039. }
  2040. return U.bind(null,vx,vy,cont);
  2041. });
  2042. });
  2043. }
  2044. }
  2045.  
  2046. return unify_impl.bind(null,n,m,function(r){
  2047. if(r){
  2048. var nv={};
  2049. var keys=Object.keys(valE);
  2050. var L=function(i,cont0){
  2051. if(i<keys.length){
  2052. return equivalent_value.bind(null,valE[keys[i]],function(x){
  2053. nv[keys[i].replace(/^~/,'')]=isFunction(x)&&x(3)=='delay_expr'?x:val_func(x);
  2054. return L.bind(null,i+1,cont0);
  2055. },function(){
  2056. return cont.bind(null,[false,{}]);
  2057. });
  2058. }
  2059. else{
  2060. return cont0.bind(null);
  2061. }
  2062. }
  2063. return L.bind(null,0,function(){
  2064. return cont.bind(null,[r,nv]);
  2065. });
  2066. }
  2067. else{
  2068. return cont.bind(null,[false,{}]);
  2069. }
  2070. });
  2071. }
  2072. var evaluate_ast_expr=function(_t, _eval, _env, _gsym, cont){
  2073. if(isArray(_t)){
  2074. if(nonEmpty(_t)){
  2075. if(_t[0] in set(['->','!=','<=','>=','<','>','=','+','-','*','/','%','^','!','<-','_'])){
  2076. return evaluate_ast_expr.bind(null,_t[1], _eval, _env, _gsym, function(x){
  2077. return evaluate_ast_expr.bind(null,_t[2], _eval, _env, _gsym, function(y){
  2078. return cont.bind(null,[_t[0],x,y]);
  2079. });
  2080. });
  2081. }
  2082. else if(_t[0]=='\\()\\'){
  2083. return _eval.bind(null,_t[1], _env, _gsym, function(x){
  2084. var r=x(-1);
  2085. if(isArray(r) && nonEmpty(r) && r[0]=='()'){
  2086. r.push(true);
  2087. }
  2088. else if(isArray(r) && nonEmpty(r) && r[0]=='~'){
  2089. r[2]=2;
  2090. }
  2091. return cont.bind(null,r);
  2092. });
  2093. }
  2094. else if(_t[0]=='\\{}\\'){
  2095. return _eval.bind(null,_t[1], _env, _gsym, function(x){
  2096. return cont.bind(null,x(-1));
  2097. });
  2098. }
  2099. else if(_t[0]=='()'){
  2100. return map_cps.bind(null,function(x,cont){
  2101. return evaluate_ast_expr.bind(null,x, _eval, _env, _gsym, cont);
  2102. },
  2103. _t[1],
  2104. function(x){
  2105. var ret=[];
  2106. x.forEach(function(item,index){
  2107. if(isArray(item) && item.length==3 && item[0]=='()' && item[2]){
  2108. ret=ret.concat(item[1]);
  2109. }
  2110. else{
  2111. ret.push(item);
  2112. }
  2113. });
  2114. return cont.bind(null,['()',ret]);
  2115. });
  2116. }
  2117. else if(_t[0]=='[]'){
  2118. return cont.bind(null,_t);
  2119. }
  2120. else if(_t[0]=='#'){
  2121. return cont.bind(null,_t);
  2122. }
  2123. else if(_t[0]=='~'){
  2124. return evaluate_ast_expr.bind(null, _t[1], _eval, _env, _gsym, function(x){
  2125. if(isString(x) || x==null ||
  2126. (isArray(x)&&nonEmpty(x)&&x[0]=='#')){
  2127. return cont.bind(null,['~',x]);
  2128. }
  2129. else{
  2130. do_raise("expect identifier, given: "+AstToString(x).replace(/\n$/,''));
  2131. }
  2132. });
  2133. }
  2134. else if(_t[0] in set(['delay','callcc','eval','curry'])){
  2135. return evaluate_ast_expr.bind(null,_t[1], _eval, _env, _gsym, function(x){
  2136. return cont.bind(null,[_t[0],x]);
  2137. });
  2138. }
  2139. else if(_t[0]=='|'){
  2140. return map_cps.bind(null,function(x,cont){
  2141. return evaluate_ast_expr.bind(null, x[0], _eval, _env, _gsym, function(y){
  2142. return evaluate_ast_expr.bind(null, x[1], _eval, _env, _gsym, function(z){
  2143. return cont.bind(null,[y,z]);
  2144. });
  2145. });
  2146. },
  2147. _t[1],
  2148. function(x){
  2149. return cont.bind(null,['|',x]);
  2150. });
  2151. }
  2152. else if(_t[0]=='None'){
  2153. return cont.bind(null,_t);
  2154. }
  2155. else if(_t[0]=='lambda'){
  2156. var err=function(t,msg){
  2157. var errcode=AstToString(t).replace(/\n$/,'');
  2158. errcode=errcode.indexOf('\n')==-1?errcode:'\n'+indent(errcode);
  2159. do_raise(msg+errcode);
  2160. }
  2161. return evaluate_ast_expr.bind(null, _t[1], _eval, _env, _gsym, function(y){
  2162. if(!(isString(y)||(isArray(y) && (y[0]=='~' || y[0]=='#')))) err(y,"invaild function name: ");
  2163. if(_t[2].length==1 && _t[2][0][0]=='\\()\\'){
  2164. return evaluate_ast_expr.bind(null, _t[2][0], _eval, _env, _gsym, function(z){
  2165. if(isArray(z) && z[0]=='()'){
  2166. z[1].forEach(function(item,index){
  2167. if(!(isString(item)||(isArray(item) && (item[0] in set (['#','~','lambda','[]','()'])))||
  2168. isNumber(item) || item==null)){
  2169. err(_t[2][0],"invaild function argument: ");
  2170. }
  2171. });
  2172. z=z[1];
  2173. return evaluate_ast_expr.bind(null, _t[3], _eval, _env, _gsym, function(v){
  2174. return cont.bind(null,['lambda',y,z,v]);
  2175. });
  2176. }
  2177. else if((isString(z) && z=='None') || z==null || (isArray(z) && z[0]=='None')){
  2178. return evaluate_ast_expr.bind(null, _t[3], _eval, _env, _gsym, function(v){
  2179. return cont.bind(null,['lambda',y,[],v]);
  2180. });
  2181. }
  2182. else if(isString(z)||(isArray(z) && (z[0] in set (['#','~','lambda','[]','()'])))||
  2183. isNumber(z) || z==null){
  2184. z=[z];
  2185. return evaluate_ast_expr.bind(null, _t[3], _eval, _env, _gsym, function(v){
  2186. return cont.bind(null,['lambda',y,z,v]);
  2187. });
  2188. }
  2189. else{
  2190. err(_t[2][0][1],"invaild function argument: ");
  2191. }
  2192. });
  2193. }
  2194. else{
  2195. return map_cps.bind(null,function(x,cont){
  2196. return evaluate_ast_expr.bind(null, x, _eval, _env, _gsym, function(x0){
  2197. if(!isString(x0) &&
  2198. !(isNumber(x0) || x0==null) &&
  2199. !(isArray(x0) && nonEmpty(x0) && x0[0] in set (['#','~','lambda','[]','()'])) &&
  2200. !(isArray(x0) && x0.length==3 && x0[0]=='()' && x0[2]))
  2201. err(x0,"invaild function argument: ");
  2202. return cont.bind(null,x0);
  2203. });
  2204. },
  2205. _t[2],
  2206. function(z){
  2207. var args=[];
  2208. z.forEach(function(item,index){
  2209. if(isArray(item) && item.length==3 && item[0]=='()' && item[2]){
  2210. item[1].forEach(function(item0,index0){
  2211. if(!isString(item0) &&
  2212. !(isArray(item0) && nonEmpty(item0) && item0[0] in set (['#','~','lambda','[]','()'])) &&
  2213. !(isNumber(item) || item==null)){
  2214. err(item0,"invaild function argument: ");
  2215. }
  2216. });
  2217. args=args.concat(item[1]);
  2218. }
  2219. else{
  2220. args.push(item);
  2221. }
  2222. });
  2223. return evaluate_ast_expr.bind(null, _t[3], _eval, _env, _gsym, function(v){
  2224. return cont.bind(null,['lambda',y,args,v]);
  2225. });
  2226. });
  2227. }
  2228. });
  2229. }
  2230. }
  2231. else{
  2232. return cont.bind(null,null);
  2233. }
  2234. }
  2235. else{
  2236. return cont.bind(null,_t);
  2237. }
  2238. }
  2239. var evaluate_match_expr=function(_t, _eval, _env, _gsym, cont){
  2240. return _eval.bind(null,_t[1], _env, _gsym, function(value){
  2241. if(isArray(_t[2]) && isEmpty(_t[2])){
  2242. return cont.bind(null,val_func(null));
  2243. }
  2244. else{
  2245. if(isArray(_t[2]) && nonEmpty(_t[2]) && _t[2][0]=='|'){
  2246. var match_expr_impl=(function(_expr, _eval, _env, _gsym, cont){
  2247. if(isEmpty(_expr)){
  2248. return cont.bind(null,val_func(null));
  2249. }
  2250. else if(_expr.length==1){
  2251. if(_expr[0][0]==null){
  2252. return _eval.bind(null,_expr[0][1], _env, _gsym, function(x){
  2253. return x().bind(null,null,function(y){
  2254. return cont.bind(null,val_func(y));
  2255. });
  2256. });
  2257. }
  2258. else{
  2259. return _eval.bind(null,_expr[0][0], _env, _gsym, function(x){
  2260. return unify.bind(null, value, x, function(u){
  2261. if(u[0]){
  2262. var e=u[1];
  2263. merge_dict(e, _env);
  2264. return _eval.bind(null, _expr[0][1], e, _gsym, function(y){
  2265. return y().bind(null,null,function(z){
  2266. return cont.bind(null,val_func(z));
  2267. });
  2268. });
  2269. }
  2270. else{
  2271. return cont.bind(null,val_func(null));
  2272. }
  2273. });
  2274. });
  2275. }
  2276. }
  2277. else{
  2278. return _eval.bind(null, _expr[0][0], _env, _gsym, function(x){
  2279. return unify.bind(null, value, x, function(u){
  2280. if(u[0]){
  2281. var e=u[1];
  2282. merge_dict(e, _env);
  2283. return _eval.bind(null,_expr[0][1], e, _gsym, function(y){
  2284. return y().bind(null,null,function(z){
  2285. return cont.bind(null,val_func(z));
  2286. });
  2287. });
  2288. }
  2289. else{
  2290. return match_expr_impl.bind(null,_expr.slice(1),_eval,_env,_gsym,cont);
  2291. }
  2292. });
  2293. });
  2294. }
  2295. });
  2296. return match_expr_impl.bind(null,_t[2][1],_eval,_env,_gsym,cont);
  2297. }
  2298. else{
  2299. return _eval.bind(null, _t[2], _env, _gsym, cont);
  2300. }
  2301. }
  2302. });
  2303. }
  2304. var evaluate=function(_t, _env, _gsym, cont){
  2305. if(isArray(_t)){
  2306. if(nonEmpty(_t)){
  2307. if(_t[0] in set(['!=','<=','>=','<','>','=','+','-','*','/','%','^','!','<-','_'])){
  2308. return evaluate.bind(null,_t[1], _env, _gsym, function(x){
  2309. return evaluate.bind(null,_t[2], _env, _gsym, function(y){
  2310. return combinator(_t[0]).bind(null,x,y,cont);
  2311. });
  2312. });
  2313. }
  2314. else if(_t[0]=='()'){
  2315. return map_cps.bind(null,function(x,cont){
  2316. return evaluate.bind(null,x,_env,_gsym,cont);
  2317. },
  2318. _t[1],
  2319. function(x){
  2320. return cont.bind(null,val_func(x));
  2321. });
  2322. }
  2323. else if(_t[0]=='[]'){
  2324. return evaluate_ast_expr.bind(null,_t[1], evaluate, _env, _gsym, function(x){
  2325. return cont.bind(null,val_func(ast_func(x, _env, _gsym)));
  2326. });
  2327. }
  2328. else if(_t[0]=='|'){
  2329. return evaluate.bind(null,['->',true,_t], _env, _gsym, cont);
  2330. }
  2331. else if(_t[0]=='->'){
  2332. return evaluate_match_expr.bind(null,_t, evaluate, _env, _gsym, cont);
  2333. }
  2334. else if(_t[0]=='~'){
  2335. if(isString(_t[1]) && (_t[1] in _env || _t[1] in _gsym) && _t[2]!=-1){
  2336. return cont.bind(null,environment(_env, _gsym)(_t[1]));
  2337. }
  2338. else{
  2339. return cont.bind(null,val_func(free_identifier_func(_t[1])));
  2340. }
  2341. }
  2342. else if(_t[0]=='#'){
  2343. if(_t.length==5){
  2344. return cont.bind(null,environment(_t[3], _t[4])(_t[1]));
  2345. }
  2346. else{
  2347. return cont.bind(null,environment(_env, _gsym)(_t[1]));
  2348. }
  2349. }
  2350. else if(_t[0]=='None'){
  2351. return cont.bind(null,val_func(null));
  2352. }
  2353. else if(_t[0]=='lambda'){
  2354. return cont.bind(null,val_func(func(
  2355. _t[0],
  2356. isArray(_t[1]) && _t[1][0]=='~' ?
  2357. _t[1][1] :
  2358. isString(_t[1]) ? _t[1] :
  2359. do_raise("invaild function name: "+AstToString(_t[1]).replace(/\n$/,'')),
  2360. [_t[2].map(function(arg){
  2361. return (isArray(arg) && arg[0]=='~' ?
  2362. arg[1] :
  2363. isNumber(arg) || arg==null || isString(arg) && nonEmpty(arg) ? arg :
  2364. isArray(arg) && nonEmpty(arg) && arg[0] in set (['#','~','lambda','[]','()']) ? arg :
  2365. do_raise("invaild function argument: "+AstToString(arg).replace(/\n$/,'')));
  2366. })],
  2367. [_t[3]],
  2368. _env, _gsym, evaluate)));
  2369. }
  2370. else if(_t[0]=='delay'){
  2371. return cont.bind(null,delay_func(_t[1], _env, _gsym, evaluate));
  2372. }
  2373. else if(_t[0]=='callcc'){
  2374. return evaluate.bind(null,_t[1], _env, _gsym, function(f){
  2375. return f().bind(null,null,function(func){
  2376. if(isFunction(func) && func(2)!='value'){
  2377. return func().bind(null,[val_func(continuation_func(cont))],cont);
  2378. }
  2379. else{
  2380. return result_of.bind(null, f, function(v){
  2381. do_raise("calling a not callable object "+v);
  2382. });
  2383. }
  2384. });
  2385. });
  2386. }
  2387. else if(_t[0]=='eval'){
  2388. return evaluate.bind(null, _t[1], _env, _gsym, function(x){
  2389. return x().bind(null,null,function(v){
  2390. if(v(2)!='Ast'){
  2391. return cont.bind(null,x);
  2392. }
  2393. else{
  2394. return evaluate.bind(null, v(-1), _env, _gsym, function(v0){
  2395. return cont.bind(null,v0);
  2396. });
  2397. }
  2398. });
  2399. });
  2400. }
  2401. else if(_t[0]=='curry'){
  2402. return evaluate.bind(null,_t[1], _env, _gsym, function(x){
  2403. return x().bind(null,null,function(v){
  2404. return cont.bind(null,val_func(curry_func(v)));
  2405. });
  2406. });
  2407. }
  2408. else if(_t[0] in set(['def','def_const','def!','def!_const'])){
  2409. do_raise("invaild evaluate on macro <"+_t[1]+">");
  2410. }
  2411. }
  2412. else{
  2413. return cont.bind(null,val_func(null));
  2414. }
  2415. }
  2416. else{
  2417. if(!isNaN(_t)){
  2418. return cont.bind(null,val_func(_t));
  2419. }
  2420. else if(isString(_t)){
  2421. return cont.bind(null,environment(_env, _gsym)(_t));
  2422. }
  2423. else{
  2424. return cont.bind(null,val_func(null));
  2425. }
  2426. }
  2427. }
  2428. var indent=function(code){
  2429. return code.replace(/\n(?!$)/g,'\n\t').replace(/^(?!\n)/g,'\t');
  2430. }
  2431. var AstToString=function(Ast){
  2432. var remove_parentheses=function(str){
  2433. var pStack=[], pPair=[];
  2434. var lflag=true,rflag=true;
  2435. var remove_set={};
  2436. var ret='';
  2437. for(var i in str){
  2438. if(str[i]=='('){
  2439. if(nonEmpty(pStack)){
  2440. pStack[pStack.length-1][1]=lflag;
  2441. }
  2442. pStack.push([i,false]);
  2443. lflag=true; rflag=false;
  2444. }
  2445. if(str[i]==')'){
  2446. var p=pStack.pop();
  2447. if(p[1]&&rflag){
  2448. pPair.push([p[0],i]);
  2449. }
  2450. rflag=true; lflag=false;
  2451. }
  2452. if(!(str[i] in set ([' ','\n','(',')']))){
  2453. lflag=false; rflag=false;
  2454. }
  2455. }
  2456. for(var i in pPair){
  2457. remove_set[pPair[i][0]]=true;
  2458. remove_set[pPair[i][1]]=true;
  2459. }
  2460. for(var i in str){
  2461. if(!(i in remove_set)){
  2462. ret+=str[i];
  2463. }
  2464. }
  2465. return ret;
  2466. }
  2467. var AstToString_impl=function(_t){
  2468. if(isArray(_t)){
  2469. if(nonEmpty(_t)){
  2470. if(_t[0] in set(['!=','<=','>=','<','>','=','+','-','*','/','!'])){
  2471. return '('+AstToString_impl(_t[1])+_t[0]+AstToString_impl(_t[2])+')';
  2472. }
  2473. if(_t[0] in set(['^','_'])){
  2474. return AstToString_impl(_t[1])+_t[0]+'{'+AstToString_impl(_t[2])+'}';
  2475. }
  2476. else if(_t[0]=='<-'){
  2477. var f=AstToString_impl(_t[1]);
  2478. var p=f.match(/(\-\>|[<>=]{2}|\!\=|_(?=\s|\{|\()|[\>\<\=\+\-\*\/\(\)\^\!\:\,\n\|\t\{\}\[\]\ ])/g);
  2479. return (p?'(':'')+f+(p?')':'')+AstToString_impl(_t[2]).replace(/^{/g,'(').replace(/}$/g,')');
  2480. }
  2481. else if(_t[0]=='->'){
  2482. var s1=AstToString_impl(_t[1]);
  2483. var s2=AstToString_impl(_t[2]);
  2484. if(s2.indexOf('\n')==-1 && s2.length<48)
  2485. return '('+s1+_t[0]+s2+')';
  2486. else
  2487. return '('+s1+_t[0]+indent(s2)+')';
  2488. }
  2489. else if(_t[0]=='()'){
  2490. var LB=_t[1].length>1?'(':'{';
  2491. var RB=_t[1].length>1?')':'}';
  2492. var ret=LB+(_t[1].map(function(x){
  2493. return AstToString_impl(x);
  2494. })).join(',')+RB;
  2495. if(ret.indexOf('\n')==-1 || ret.length<48){
  2496. return ret;
  2497. }
  2498. else{
  2499. return LB+'\n'+indent((_t[1].map(function(x){
  2500. return AstToString_impl(x);
  2501. })).join(',\n'))+'\n'+RB;
  2502. }
  2503. }
  2504. else if(_t[0]=='[]'){
  2505. var LB='[';
  2506. var RB=']';
  2507. var code=AstToString_impl(_t[1]);
  2508. var ret=LB+code+RB;
  2509. if(ret.indexOf('\n')==-1 || ret.length<48){
  2510. return ret;
  2511. }
  2512. else{
  2513. return LB+'\n'+indent(code)+'\n'+RB;
  2514. }
  2515. }
  2516. else if(_t[0] in set(['\\()\\','\\{}\\'])){
  2517. var LB=_t[0].slice(0,2);
  2518. var RB=_t[0].slice(2);
  2519. var code=AstToString_impl(_t[1]);
  2520. var ret=LB+code+RB;
  2521. if(ret.indexOf('\n')==-1 || ret.length<48){
  2522. return ret;
  2523. }
  2524. else{
  2525. return LB+'\n'+indent(code)+'\n'+RB;
  2526. }
  2527. }
  2528. else if(_t[0]=='#'){
  2529. //return _t[1]+':'+_t[2];
  2530. return _t[1];
  2531. }
  2532. else if(_t[0]=='~'){
  2533. return '~'+AstToString_impl(_t[1]);
  2534. }
  2535. else if(_t[0]=='|'){
  2536. var temp='\n';
  2537. for (var i in _t[1]){
  2538. var cond=AstToString_impl(_t[1][i][0]);
  2539. var expr=AstToString_impl(_t[1][i][1]);
  2540. if(nonEmpty(expr) && expr[0]=='(' && expr[expr.length-1]==')')
  2541. expr=expr.slice(1,-1);
  2542. if(expr.indexOf('\n')==-1){
  2543. temp+='| '+cond+': ('+expr+')\n';
  2544. }
  2545. else{
  2546. temp+='| '+cond+': ('+indent(expr)+')\n';
  2547. }
  2548. }
  2549. return temp;
  2550. }
  2551. else if(_t[0]=='None'){
  2552. return 'None';
  2553. }
  2554. else if(_t[0]=='lambda' || _t[0] in set(['def','def_const','def!','def!_const'])){
  2555. var type=_t[0].replace(/_const$/,'');
  2556. var temp='';
  2557. var body=AstToString_impl(_t[3]);
  2558. var indent_body=(body.indexOf('|')!=-1 || body.indexOf(type)!=-1) || body.length>24;
  2559. temp+='('+type+':';
  2560. if(_t[1]==''){
  2561. temp+=_t[2].map(function(x){ return AstToString_impl(x); }).join(',').replace(/(\\\([\S\s]*?\)\\|\\\{[\S\s]*?\}\\)|~/g,'$1');
  2562. temp+='->';
  2563. }
  2564. else{
  2565. var func=AstToString_impl(_t[1]);
  2566. var args=_t[2].map(function(x){ return AstToString_impl(x); }).join(',').replace(/(\\\([\S\s]*?\)\\|\\\{[\S\s]*?\}\\)|~/g,'$1');
  2567. var title;
  2568. if(args.length<=36){
  2569. title=func+'('+args+')';
  2570. }
  2571. else{
  2572. title=func+'(\n'+indent(_t[2].join(',\n'))+'\n)';
  2573. }
  2574. if(indent_body&&title.length>8){
  2575. temp+='\n\t';
  2576. body=indent(body);
  2577. }
  2578. temp+=title+'=';
  2579. }
  2580. if(indent_body){
  2581. temp+='\n';
  2582. temp+=indent(body)+'\n)';
  2583. }
  2584. else{
  2585. temp+=body+')';
  2586. }
  2587. return temp;
  2588. }
  2589. else if(_t[0]=='delay'){
  2590. return 'delay('+AstToString_impl(_t[1])+')';
  2591. }
  2592. else if(_t[0]=='callcc'){
  2593. return 'callcc('+AstToString_impl(_t[1])+')';
  2594. }
  2595. else if(_t[0]=='eval'){
  2596. return 'eval('+AstToString_impl(_t[1])+')';
  2597. }
  2598. else if(_t[0]=='curry'){
  2599. return 'curry('+AstToString_impl(_t[1])+')';
  2600. }
  2601. }
  2602. return '';
  2603. }
  2604. else{
  2605. if(!isNaN(_t)){
  2606. if(_t!=null){
  2607. return _t.toString();
  2608. }
  2609. else{
  2610. return '';
  2611. }
  2612. }
  2613. else if(isString(_t)){
  2614. return _t;
  2615. }
  2616. else{
  2617. return '';
  2618. }
  2619. }
  2620. }
  2621. return remove_parentheses(AstToString_impl(Ast)).
  2622. replace(/\n\t+\n/g,'\n').
  2623. replace(/\n+/g,'\n')+'\n';
  2624. }
  2625. var result_of=function(x, cont){
  2626. return x(1).bind(null, cont);
  2627. }
  2628. this.execute=function(__Str, cont){
  2629. self.halt=false;
  2630. trampoline_exec(macro_expansion.bind(null,parser(lexer(__Str)),function(Ast){
  2631. var t=global_symtable(Ast);
  2632. return cont.bind(null, function(f, args, cont){
  2633. if(f in t){
  2634. trampoline_exec(t[f]()(null, function(f){
  2635. return f().bind(null, args, function(ret){return result_of.bind(null, ret, cont);});
  2636. }));
  2637. }
  2638. else{
  2639. cont('None');
  2640. }
  2641. });
  2642. }));
  2643. }
  2644.  
  2645. this.terminate=function()
  2646. {
  2647. this.halt=true;
  2648. }
  2649.  
  2650. }
  2651.  
  2652. var addGlobalStyle = (function(css) {
  2653. var head, style;
  2654. head = document.getElementsByTagName('head')[0];
  2655. if (!head) { return; }
  2656. style = document.createElement('style');
  2657. style.type = 'text/css';
  2658. style.innerHTML = css;
  2659. head.appendChild(style);
  2660. });
  2661.  
  2662. function code_console(e, code)
  2663. {
  2664. this.element = e;
  2665. this.continuation;
  2666. this.inSuspend=false;
  2667. this.inRuning=false;
  2668. this.interp = new interpreter(this);
  2669. this.disabled_input = true;
  2670.  
  2671. var self = this;
  2672.  
  2673. this.error=function(msg){
  2674. self.inRuning=false;
  2675. self.interp.terminate();
  2676. var history=self.element.find(".output span");
  2677. if(history.length>=100){
  2678. history.first().next().remove();
  2679. history.first().remove();
  2680. }
  2681. var command=$('<span class="error"></span>');
  2682. command.text(msg);
  2683. var output=self.element.find(".output");
  2684. output.append(command);
  2685. output.append('<br>');
  2686. output.animate({scrollTop: output.prop("scrollHeight")});
  2687. }
  2688.  
  2689. this.output=function(str){
  2690. var history=self.element.find(".output span");
  2691. if(history.length>=100){
  2692. history.first().next().remove();
  2693. history.first().remove();
  2694. }
  2695. var command=$('<span class="result"></span>');
  2696. command.html('&gt;&gt;&gt; '+highlight(str));
  2697. var output=self.element.find(".output");
  2698. output.append(command);
  2699. output.append('<br>');
  2700. output.animate({scrollTop: output.prop("scrollHeight")});
  2701. }
  2702.  
  2703. this.input=function(cont){
  2704. self.element.find("textarea").removeClass('disabled');
  2705. self.disabled_input = false;
  2706. self.continuation=cont;
  2707. }
  2708.  
  2709. this.suspend=function(cont){
  2710. self.element.find("textarea").removeClass('disabled');
  2711. self.disabled_input = false;
  2712. self.element.find("textarea").attr("placeholder","Resume to run? [Y/N]");
  2713. self.inSuspend=true;
  2714. self.continuation=cont;
  2715. }
  2716.  
  2717. this.clear=function(cont){
  2718. self.element.find("pre.output").empty();
  2719. }
  2720.  
  2721. this.sleep=function(cont, time){
  2722. setTimeout(function(){
  2723. try {
  2724. cont();
  2725. }
  2726. catch(err) {
  2727. if(err.name!='Error'){
  2728. err.message='Error: '+err.message;
  2729. }
  2730. self.error(err.message);
  2731. }
  2732. }, time);
  2733. }
  2734.  
  2735. this.halt=function(cont){
  2736. self.inRuning=false;
  2737. self.interp.terminate();
  2738. }
  2739.  
  2740. this.element.find("textarea").keydown(function(e) {
  2741. if(self.disabled_input){
  2742. e.preventDefault();
  2743. return;
  2744. }
  2745. var code = e.keyCode ? e.keyCode : e.which;
  2746. if (code == 13) { // Enter keycode
  2747. e.preventDefault();
  2748. if(self.inSuspend){
  2749. var input=$(this).val().replace(/\n|\r\n/g,'').trim();
  2750. $(this).val('');
  2751. if(input.toUpperCase()=='Y'){
  2752. $(this).attr("placeholder","");
  2753. $(this).addClass('disabled');
  2754. self.disabled_input=true;
  2755. self.inSuspend=false;
  2756. try {
  2757. self.continuation();
  2758. }
  2759. catch(err) {
  2760. if(err.name!='Error'){
  2761. err.message='Error: '+err.message;
  2762. }
  2763. error(err.message);
  2764. }
  2765. }
  2766. else if(input.toUpperCase()=='N'){
  2767. $(this).attr("placeholder","");
  2768. $(this).prop('disabled', true);
  2769. self.inSuspend=false;
  2770. }
  2771. }
  2772. else if ($(this).val().trim().length > 0) {
  2773. var input=$(this).val().trim();
  2774. var command=$('<span class="command"></span>');
  2775. command.html(highlight(input));
  2776. var output=self.element.find(".output");
  2777. output.append(command);
  2778. output.append('<br>');
  2779. $(this).addClass('disabled');
  2780. $(this).val('');
  2781. self.disabled_input=true;
  2782. output.animate({scrollTop: output.prop("scrollHeight")});
  2783. try {
  2784. self.continuation(input);
  2785. }
  2786. catch(err) {
  2787. if(err.name!='Error'){
  2788. err.message='Error: '+err.message;
  2789. }
  2790. self.error(err.message);
  2791. }
  2792. }
  2793. }
  2794. });
  2795.  
  2796. var description = code.match(/(?:\/\/ [^\n]*\n)+(?:\/\/ ==description==\n)((?:\/\/ [^\n]*\n)*)(?:\/\/ ==description==\n)/);
  2797. if(description)
  2798. {
  2799. var output=self.element.find(".output");
  2800. description = description[1].replace(/^\/\/ /mg,"")
  2801. .replace(/\n$/, "")
  2802. .split("\n");
  2803. description.forEach(function(d){
  2804. var command=$('<span class="description"></span>');
  2805. command.text(d);
  2806. output.append(command);
  2807. output.append('<br>');
  2808. });
  2809. output.append('<br>');
  2810. }
  2811.  
  2812. if(!self.inRuning) {
  2813. if (code.length > 0) {
  2814. //self.interp.execute(code,function(exce){
  2815. // exce('f',[],self.output);
  2816. //});
  2817. try {
  2818. self.element.find(".run span").text("Runing");
  2819. self.element.find("textarea").attr("placeholder","");
  2820. self.element.find("textarea").addClass('disabled');
  2821. self.element.find("textarea").val('');
  2822. self.disabled_input=true;
  2823. self.inSuspend=false;
  2824. self.inRuning=true;
  2825. self.interp.execute(code,function(exce){
  2826. exce('f',[],function(x){
  2827. self.inRuning=false;
  2828. self.output(x);
  2829. });
  2830. });
  2831. }
  2832. catch(err) {
  2833. if(err.name!='Error'){
  2834. err.message='Error: '+err.message;
  2835. }
  2836. self.error(err.message);
  2837. }
  2838. }
  2839. }
  2840.  
  2841. }
  2842.  
  2843. function uuidv4() {
  2844. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  2845. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  2846. return v.toString(16);
  2847. });
  2848. }
  2849.  
  2850. var code_console_list = {};
  2851.  
  2852. function create_console(e) {
  2853. if(e.innerText.match(/^\/\/ Shirayuki script\n/)) {
  2854. e.setAttribute("style", "display:none;");
  2855. var con = document.createElement("DIV");
  2856. con.className = "console";
  2857. con.id = uuidv4();
  2858. con.innerHTML = `<pre class="output"></pre><div class="input" style='height: 23px;'><textarea rows="1"></textarea></div><div class="shadow"></div>`;
  2859. e.parentNode.insertBefore(con, e.nextSibling);
  2860. e.parentNode.classList.add("console_container");
  2861. code_console_list[con.id] = new code_console($(con), e.innerText);
  2862. }
  2863. }
  2864.  
  2865. [...document.getElementsByTagName("code")].forEach(create_console);
  2866.  
  2867. var mb = new MutationObserver(function (mutations) {
  2868. try {
  2869. mutations.forEach(mutation => {
  2870. if (mutation.addedNodes) {
  2871. mutation.addedNodes.forEach(node => {
  2872. if(node.nodeType === Node.ELEMENT_NODE) {
  2873. var code = node.getElementsByTagName("code");
  2874. if(code && code.length) {
  2875. [...code].forEach(e => {
  2876. create_console(e);
  2877. });
  2878. }
  2879. }
  2880. });
  2881. }
  2882.  
  2883. if (mutation.removedNodes) {
  2884. mutation.removedNodes.forEach(node => {
  2885. if(node.nodeType === Node.ELEMENT_NODE) {
  2886. var code_console = node.querySelectorAll("div.console");
  2887. if(code_console && code_console.length) {
  2888. [...code_console].forEach(e => {
  2889. if(e.id && e.id in code_console_list) {
  2890. code_console_list[e.id].halt();
  2891. delete code_console_list[e.id];
  2892. }
  2893. });
  2894. }
  2895. }
  2896. });
  2897. }
  2898. });
  2899. } catch(e) {
  2900. console.log(e);
  2901. }
  2902. });
  2903.  
  2904. function escapeHtml(string) {
  2905. var entityMap = {
  2906. " ": "&nbsp;",
  2907. "&": "&amp;",
  2908. "<": "&lt;",
  2909. ">": "&gt;",
  2910. '"': '&quot;',
  2911. "'": '&#39;',
  2912. "/": '&#x2F;'
  2913. };
  2914. return String(string).replace(/[&<>"'\/ ]/g, function (s) {
  2915. return entityMap[s];
  2916. });
  2917. }
  2918.  
  2919. function highlight(src){
  2920. var length=src.length;
  2921.  
  2922. var bIndex=0;
  2923. var bStack=[];
  2924. var sbIndex=0;
  2925. var sbStack=[];
  2926. var cbIndex=0;
  2927. var cbStack=[];
  2928. var escapeStack=[];
  2929. var matchStack=[];
  2930.  
  2931. var status=[
  2932. function(x){
  2933. if(x.length==0){
  2934. return ['',''];
  2935. }
  2936. var t=x.match(/^\/\/[^\n]*/);
  2937. if(t){
  2938. return ['<span class="comment">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2939. }
  2940. t=x.match(/^\b(?:def!|(?:lambda|def)\b)/);
  2941. if(t){
  2942. cur=1;
  2943. return ['<span class="keyword">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2944. }
  2945. t=x.match(/^\b(?:delay|callcc|eval|curry)\b/);
  2946. if(t){
  2947. return ['<span class="keyword">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2948. }
  2949. t=x.match(/^\b(?:(?:-)?[0-9.]+|None|false|true)\b/);
  2950. if(t){
  2951. return ['<span class="number">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2952. }
  2953. t=x.match(/^\b(?:[A-Za-z0-9]|_(?!\{|\(|\s))+/);
  2954. if(t){
  2955. return ['<span name="__'+t[0]+'" class="identifier">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2956. }
  2957. t=x.match(/^(?:[<>=]{2}|\!\=|[\<\>\=\+\-\*\/\%\^\!\_])/);
  2958. if(t){
  2959. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2960. }
  2961. t=x.match(/^(?:\\(?:\{|\())/);
  2962. if(t){
  2963. escapeStack.push(cur);
  2964. cur=0;
  2965. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2966. }
  2967. t=x.match(/^(?:(?:\}|\))\\)/);
  2968. if(t){
  2969. if(escapeStack.length>0){
  2970. cur=escapeStack.pop();
  2971. }
  2972. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2973. }
  2974. t=x.match(/^\|/);
  2975. if(t){
  2976. cur=3;
  2977. return [t[0],x.slice(t[0].length)];
  2978. }
  2979. t=x.match(/^\(/);
  2980. if(t){
  2981. bStack.push(bIndex);
  2982. return ['<span name="_B_'+(bIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2983. }
  2984. t=x.match(/^\)/);
  2985. if(t){
  2986. if(matchStack.length>0 && bStack.length==matchStack[matchStack.length-1][0]){
  2987. cur=matchStack.pop()[1];
  2988. }
  2989. var index;
  2990. if(bStack.length>0){
  2991. index=bStack.pop();
  2992. }
  2993. else{
  2994. index=-1;
  2995. }
  2996. return ['<span name="_B_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  2997. }
  2998. t=x.match(/^\[/);
  2999. if(t){
  3000. sbStack.push(sbIndex);
  3001. escapeStack.push(cur);
  3002. cur=0;
  3003. return ['<span name="_SB_'+(sbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3004. }
  3005. t=x.match(/^\]/);
  3006. if(t){
  3007. var index;
  3008. if(sbStack.length>0){
  3009. index=sbStack.pop();
  3010. }
  3011. else{
  3012. index=-1;
  3013. }
  3014. if(escapeStack.length>0){
  3015. cur=escapeStack.pop();
  3016. }
  3017. return ['<span name="_SB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="'+(cur==3?'condition ':'')+'bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3018. }
  3019. t=x.match(/^\{/);
  3020. if(t){
  3021. cbStack.push(cbIndex);
  3022. return ['<span name="_CB_'+(cbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3023. }
  3024. t=x.match(/^\}/);
  3025. if(t){
  3026. var index;
  3027. if(cbStack.length>0){
  3028. index=cbStack.pop();
  3029. }
  3030. else{
  3031. index=-1;
  3032. }
  3033. return ['<span name="_CB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3034. }
  3035. t=x.match(/^,/);
  3036. if(t){
  3037. if(matchStack.length>0 && bStack.length==matchStack[matchStack.length-1][0]){
  3038. cur=matchStack.pop()[1];
  3039. }
  3040. return [escapeHtml(x[0]),x.slice(1)];
  3041. }
  3042. return [escapeHtml(x[0]),x.slice(1)];
  3043. },
  3044.  
  3045. function(x){
  3046. if(x.length==0){
  3047. return ['',''];
  3048. }
  3049. var t=x.match(/^\/\/[^\n]*/);
  3050. if(t){
  3051. return ['<span class="comment">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3052. }
  3053. t=x.match(/^(?:\\(?:\{|\())/);
  3054. if(t){
  3055. escapeStack.push(2);
  3056. cur=0;
  3057. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3058. }
  3059. t=x.match(/^(?:(?:\}|\))\\)/);
  3060. if(t){
  3061. if(escapeStack.length>0){
  3062. cur=escapeStack.pop();
  3063. }
  3064. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3065. }
  3066. t=x.match(/^\b(?:([A-Za-z_][A-Za-z0-9_]*)(?=\s*(?:\(|=)))\b/);
  3067. if(t){
  3068. cur=2;
  3069. return ['<span name="__'+t[0]+'" class="function">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3070. }
  3071. t=x.match(/^\b(?:[A-Za-z_][A-Za-z0-9_]*)\b/);
  3072. if(t){
  3073. return ['<span name="__'+t[0]+'" class="parameter">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3074. }
  3075. t=x.match(/^(?:=|->)/);
  3076. if(t){
  3077. cur=0;
  3078. return [escapeHtml(t[0]),x.slice(t[0].length)];
  3079. }
  3080. t=x.match(/^\(/);
  3081. if(t){
  3082. bStack.push(bIndex);
  3083. return ['<span name="_B_'+(bIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3084. }
  3085. t=x.match(/^\)/);
  3086. if(t){
  3087. var index;
  3088. if(bStack.length>0){
  3089. index=bStack.pop();
  3090. }
  3091. else{
  3092. index=-1;
  3093. }
  3094. return ['<span name="_B_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3095. }
  3096. t=x.match(/^\[/);
  3097. if(t){
  3098. sbStack.push(sbIndex);
  3099. escapeStack.push(cur);
  3100. cur=0;
  3101. return ['<span name="_SB_'+(sbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3102. }
  3103. t=x.match(/^\]/);
  3104. if(t){
  3105. var index;
  3106. if(sbStack.length>0){
  3107. index=sbStack.pop();
  3108. }
  3109. else{
  3110. index=-1;
  3111. }
  3112. if(escapeStack.length>0){
  3113. cur=escapeStack.pop();
  3114. }
  3115. return ['<span name="_SB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3116. }
  3117. t=x.match(/^\{/);
  3118. if(t){
  3119. cbStack.push(cbIndex);
  3120. return ['<span name="_CB_'+(cbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3121. }
  3122. t=x.match(/^\}/);
  3123. if(t){
  3124. var index;
  3125. if(cbStack.length>0){
  3126. index=cbStack.pop();
  3127. }
  3128. else{
  3129. index=-1;
  3130. }
  3131. return ['<span name="_CB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3132. }
  3133. return [escapeHtml(x[0]),x.slice(1)];
  3134. },
  3135.  
  3136. function(x){
  3137. if(x.length==0){
  3138. return ['',''];
  3139. }
  3140. var t=x.match(/^\/\/[^\n]*/);
  3141. if(t){
  3142. return ['<span class="comment">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3143. }
  3144. t=x.match(/^(?:\\(?:\{|\())/);
  3145. if(t){
  3146. escapeStack.push(cur);
  3147. cur=0;
  3148. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3149. }
  3150. t=x.match(/^(?:(?:\}|\))\\)/);
  3151. if(t){
  3152. if(escapeStack.length>0){
  3153. cur=escapeStack.pop();
  3154. }
  3155. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3156. }
  3157. t=x.match(/^\blambda\b/);
  3158. if(t){
  3159. matchStack.push([bStack.length,cur]);
  3160. cur=0;
  3161. return ['<span class="keyword">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3162. }
  3163. t=x.match(/^\b(?:(?:-)?[0-9.]+|None|false|true)\b/);
  3164. if(t){
  3165. return ['<span class="number">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3166. }
  3167. t=x.match(/^\b(?:[A-Za-z_][A-Za-z0-9_]*)\b/);
  3168. if(t){
  3169. return ['<span name="__'+t[0]+'" class="parameter">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3170. }
  3171. t=x.match(/^(?:=|->)/);
  3172. if(t){
  3173. cur=0;
  3174. return [escapeHtml(t[0]),x.slice(t[0].length)];
  3175. }
  3176. t=x.match(/^\(/);
  3177. if(t){
  3178. bStack.push(bIndex);
  3179. return ['<span name="_B_'+(bIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3180. }
  3181. t=x.match(/^\)/);
  3182. if(t){
  3183. cur=1;
  3184. var index;
  3185. if(bStack.length>0){
  3186. index=bStack.pop();
  3187. }
  3188. else{
  3189. index=-1;
  3190. }
  3191. return ['<span name="_B_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3192. }
  3193. t=x.match(/^\[/);
  3194. if(t){
  3195. sbStack.push(sbIndex);
  3196. escapeStack.push(cur);
  3197. cur=0;
  3198. return ['<span name="_SB_'+(sbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3199. }
  3200. t=x.match(/^\]/);
  3201. if(t){
  3202. var index;
  3203. if(sbStack.length>0){
  3204. index=sbStack.pop();
  3205. }
  3206. else{
  3207. index=-1;
  3208. }
  3209. if(escapeStack.length>0){
  3210. cur=escapeStack.pop();
  3211. }
  3212. return ['<span name="_SB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3213. }
  3214. t=x.match(/^\{/);
  3215. if(t){
  3216. cbStack.push(cbIndex);
  3217. return ['<span name="_CB_'+(cbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3218. }
  3219. t=x.match(/^\}/);
  3220. if(t){
  3221. var index;
  3222. if(cbStack.length>0){
  3223. index=cbStack.pop();
  3224. }
  3225. else{
  3226. index=-1;
  3227. }
  3228. return ['<span name="_CB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3229. }
  3230. return [escapeHtml(x[0]),x.slice(1)];
  3231. },
  3232.  
  3233. function(x){
  3234. if(x.length==0){
  3235. return ['',''];
  3236. }
  3237. var t=x.match(/^\/\/[^\n]*/);
  3238. if(t){
  3239. return ['<span class="comment">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3240. }
  3241. t=x.match(/^(?:\\(?:\{|\())/);
  3242. if(t){
  3243. escapeStack.push(cur);
  3244. cur=0;
  3245. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3246. }
  3247. t=x.match(/^(?:(?:\}|\))\\)/);
  3248. if(t){
  3249. if(escapeStack.length>0){
  3250. cur=escapeStack.pop();
  3251. }
  3252. return ['<span class="operator">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3253. }
  3254. t=x.match(/^\b(?:def!|(?:lambda|def)\b)/);
  3255. if(t){
  3256. t0=x.slice(t[0].length).match(/^\s*:/);
  3257. if(t0){
  3258. return ['<span class="condition keyword">'+escapeHtml(t[0])+'</span>'+'<span class="condition">'+escapeHtml(t0[0])+'</span>',
  3259. x.slice(t[0].length+t0[0].length)];
  3260. }
  3261. else{
  3262. return ['<span class="condition keyword">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3263. }
  3264. }
  3265. t=x.match(/^\b(?:(?:-)?[0-9.]+|None|false|true)\b/);
  3266. if(t){
  3267. return ['<span class="condition number">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3268. }
  3269. t=x.match(/^\b[A-Za-z_](?:[A-Za-z0-9]|_(?!\{|\(|\s))*/);
  3270. if(t){
  3271. return ['<span name="__'+t[0]+'" class="condition identifier">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3272. }
  3273. t=x.match(/^[^:\\\[\]\(\)\{\}\s\w]+/);
  3274. if(t){
  3275. return ['<span class="condition">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3276. }
  3277. t=x.match(/^:/);
  3278. if(t){
  3279. cur=0;
  3280. return [t[0],x.slice(t[0].length)];
  3281. }
  3282. t=x.match(/^\(/);
  3283. if(t){
  3284. bStack.push(bIndex);
  3285. return ['<span name="_B_'+(bIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="condition bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3286. }
  3287. t=x.match(/^\)/);
  3288. if(t){
  3289. var index;
  3290. if(bStack.length>0){
  3291. index=bStack.pop();
  3292. }
  3293. else{
  3294. index=-1;
  3295. }
  3296. return ['<span name="_B_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="condition bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3297. }
  3298. t=x.match(/^\[/);
  3299. if(t){
  3300. sbStack.push(sbIndex);
  3301. escapeStack.push(cur);
  3302. cur=0;
  3303. return ['<span name="_SB_'+(sbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="condition bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3304. }
  3305. t=x.match(/^\]/);
  3306. if(t){
  3307. var index;
  3308. if(sbStack.length>0){
  3309. index=sbStack.pop();
  3310. }
  3311. else{
  3312. index=-1;
  3313. }
  3314. if(escapeStack.length>0){
  3315. cur=escapeStack.pop();
  3316. }
  3317. return ['<span name="_SB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="condition bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3318. }
  3319. t=x.match(/^\{/);
  3320. if(t){
  3321. cbStack.push(cbIndex);
  3322. return ['<span name="_CB_'+(cbIndex++)+'" id="_bracket_at_'+(length-x.length)+'" class="condition bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3323. }
  3324. t=x.match(/^\}/);
  3325. if(t){
  3326. var index;
  3327. if(cbStack.length>0){
  3328. index=cbStack.pop();
  3329. }
  3330. else{
  3331. index=-1;
  3332. }
  3333. return ['<span name="_CB_'+index+'" id="_bracket_at_'+(length-x.length)+'" class="condition bracket">'+escapeHtml(t[0])+'</span>',x.slice(t[0].length)];
  3334. }
  3335. return ['<span class="condition">'+escapeHtml(x[0])+'</span>',x.slice(1)];
  3336. }
  3337. ];
  3338.  
  3339. var t=src;
  3340. var r='';
  3341. var cur=0;
  3342. while(t.length>0){
  3343. var ret=status[cur](t);
  3344. r+=ret[0];
  3345. t=ret[1];
  3346. }
  3347.  
  3348. return r;
  3349. }
  3350.  
  3351. addGlobalStyle(`
  3352. .console,
  3353. .console pre.output,
  3354. .console pre.output span,
  3355. .console textarea,
  3356. .console textarea:focus {
  3357. font-size:14px;
  3358. line-height:1.3;
  3359. font-weight: normal;
  3360. font-family:"Consolas", "Andale Mono", "Courier New", "Courier", monospace;
  3361. border:0 none;
  3362. outline:0 none;
  3363. -webkit-box-shadow:none;
  3364. -moz-box-shadow:none;
  3365. box-shadow:none;
  3366. }
  3367. .console {
  3368. position:relative;
  3369. color: #ddd;
  3370. background: #333;
  3371. padding-top:10px;
  3372. max-width:640px;
  3373. margin:0px auto;
  3374. }
  3375. .console .shadow {
  3376. position: absolute;
  3377. left: 0px;
  3378. top: 10px;
  3379. right: 0px;
  3380. bottom: 32px;
  3381. -webkit-box-shadow: inset 0px 0px 2px 2px #333;
  3382. -moz-box-shadow: inset 0px 0px 2px 2px #333;
  3383. box-shadow: inset 0px 0px 2px 2px #333;
  3384. pointer-events: none;
  3385. }
  3386. .console pre.output {
  3387. background: #333;
  3388. display:block;
  3389. white-space:pre;
  3390. width:calc(100% - 15px);
  3391. height:120px;
  3392. overflow-y:auto;
  3393. overflow-x:auto;
  3394. position:relative;
  3395. padding: 0 0 0 15px;
  3396. margin:0 0 10px;
  3397. border:0 none;
  3398. }
  3399. .console pre.output span { color:#f7f7f7; }
  3400. .console pre.output span.description { color:#aaa; }
  3401. .console pre.output span.command { color:#f7f7f7; opacity: 0.7; }
  3402. .console pre.output span.result { color:#f7f7f7; opacity: 1;}
  3403. .console pre.output span.error { color:#f77; }
  3404.  
  3405. .console .input {
  3406. padding:0 0 0 15px;
  3407. position:relative;
  3408. }
  3409. .console .input:before {
  3410. content:">";
  3411. position:absolute;
  3412. top: 0;
  3413. left: 0;
  3414. color:#ddd
  3415. }
  3416. .console textarea {
  3417. color:#ddd;
  3418. background:#333;
  3419. border:0 none;
  3420. outline:0 none;
  3421. padding:0;
  3422. margin:0;
  3423. resize: none;
  3424. width:100%;
  3425. overflow:hidden;
  3426. }
  3427. .console textarea:focus {
  3428. outline:0 none;
  3429. }
  3430. .console textarea.disabled{
  3431. color:transparent;
  3432. }
  3433. .console pre.output::-webkit-scrollbar,
  3434. .console pre.output::-webkit-scrollbar-button,
  3435. .console pre.output::-webkit-scrollbar-track,
  3436. .console pre.output::-webkit-scrollbar-track-piece,
  3437. .console pre.output::-webkit-scrollbar-thumb,
  3438. .console pre.output::-webkit-scrollbar-corner,
  3439. .console pre.output::-webkit-resizer {
  3440. background: transparent;
  3441. }
  3442. .console pre.output::-webkit-scrollbar {
  3443. width: 7px;
  3444. height: 7px;
  3445. -webkit-border-radius: 4px;
  3446. border-radius: 4px;
  3447. }
  3448. .console pre.output::-webkit-scrollbar-track-piece {
  3449. -webkit-border-radius: 5px;
  3450. border-radius: 5px;
  3451. }
  3452. .console pre.output::-webkit-scrollbar-thumb {
  3453. background: #4f4f4f;
  3454. border-radius: 5px;
  3455. }
  3456. .console pre.output::-webkit-scrollbar-button {
  3457. width:0;
  3458. height:0;
  3459. }
  3460. pre.console_container {
  3461. background: #333;
  3462. }
  3463. .console pre.output span.keyword{
  3464. font-style: italic;
  3465. color: #66D9EF;
  3466. }
  3467. .console pre.output span.number{
  3468. color:#AE81FF;
  3469. }
  3470. .console pre.output span.function{
  3471. color: #A6E22E;
  3472. }
  3473. .console pre.output span.parameter{
  3474. font-style: italic;
  3475. color: #FD971F;
  3476. }
  3477. .console pre.output span.comment{
  3478. color: #75715E;
  3479. }
  3480. .console pre.output span.operator{
  3481. color: #F92672;
  3482. }
  3483. .console pre.output span.condition{
  3484. color: #E6DB74;
  3485. }
  3486. `);
  3487. mb.observe(document.body, { subtree: true, childList: true, attributes: false, characterData: false });
  3488.  
  3489. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址