del-js-lang 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var e="0.0.3";exports.DelJS=void 0,function(t){let n,a,r,u,l,i,s;t.version=e,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=t.ErrorKind||(t.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(a=t.ErrorCode||(t.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:a}){super(e,null==t?{}:{cause:t}),this.code=a,this.kind=(()=>{for(const e of Object.values(n))if(a.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}t.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(r=t.TokenType||(t.TokenType={}));class c{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:a.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(c.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:a.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:r.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:a.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:r.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();c.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:r.Comma,value:null}),this.advance()):(e.push({type:r.RParen,value:null}),this.advance()):(e.push({type:r.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:r.EOF,value:null}),e}}t.Tokenizer=c,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(u=t.NodeType||(t.NodeType={}));class v{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:a.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===r.String)return this.advance(),{type:u.String,value:e.value};if(e.type===r.Identifier){this.advance();const t={type:u.Identifier,value:e.value};if(this.match(r.LParen)){const e=this.parseArguments();return{type:u.Call,value:{callee:t,args:e}}}return t}throw new o({code:a.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(r.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(r.Comma)){this.expect(r.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:a.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:a.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(r.EOF),e}}t.Parser=v,function(e){e.String="string",e.Function="function",e.AsyncFunction="async-function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=t.ValueType||(t.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(s))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}t.Env=p,function(e){e.Block="Block",e.ForDo="ForDo",e.WhileDo="WhileDo",e.Ifs="Ifs",e.Reuse="Reuse"}(i=t.InterpreterKeywordsLike||(t.InterpreterKeywordsLike={}));class y{evaluate(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return this.evaluateCall(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}async evaluateAsync(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return await this.evaluateCallAsync(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=this.evaluate(t,n);return a}async evaluateBlockAsync(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=await this.evaluateAsync(t,n);return a}evaluateFor(e,t){const[n,r,u,i]=e.value.args;if(null==n||null==r||null==u||null==i)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);this.evaluate(n,s);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(r,s);if(!y.isTruthy(e))break;c=this.evaluate(i,s),this.evaluate(u,s)}return c}async evaluateForAsync(e,t){const[n,r,u,i]=e.value.args;if(null==n||null==r||null==u||null==i)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);await this.evaluateAsync(n,s);let c={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(r,s);if(!y.isTruthy(e))break;c=await this.evaluateAsync(i,s),await this.evaluateAsync(u,s)}return c}evaluateWhile(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let i={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,u);if(!y.isTruthy(e))break;i=this.evaluate(r,u)}return i}async evaluateWhileAsync(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let i={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(n,u);if(!y.isTruthy(e))break;i=await this.evaluateAsync(r,u)}return i}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:case l.AsyncFunction:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=this.evaluate(e.value.args[n],t);if(y.isTruthy(a))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}async evaluateIfsAsync(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=await this.evaluateAsync(e.value.args[n],t);if(y.isTruthy(a)){return await this.evaluateAsync(e.value.args[n+1],t)}}return await this.evaluateAsync(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==u.String)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const i={type:l.Reuse,value:r};return t.set(n.value,i),{type:l.Nil,value:null}}callReuse(e,t,n){const a=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,a)}async callReuseAsync(e,t,n){const a=new p(n,await Promise.all(t.map(e=>this.evaluateAsync(e,n))));return await this.evaluateAsync(e.value,a)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===i.WhileDo)return this.evaluateWhile(e,t);if(e.value.callee.value===i.ForDo)return this.evaluateFor(e,t);if(e.value.callee.value===i.Block)return this.evaluateBlock(e,t);if(e.value.callee.value===i.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===i.Ifs)return this.evaluateIfs(e,t);const r=e.value.args.map(e=>this.evaluate(e,t));return n.value(r,t)}async evaluateCallAsync(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse){return await this.callReuseAsync(n,e.value.args,t)}if(n.type!==l.Function&&n.type!==l.AsyncFunction)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===i.WhileDo){return await this.evaluateWhileAsync(e,t)}if(e.value.callee.value===i.ForDo){return await this.evaluateForAsync(e,t)}if(e.value.callee.value===i.Block){return await this.evaluateBlockAsync(e,t)}if(e.value.callee.value===i.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===i.Ifs){return await this.evaluateIfsAsync(e,t)}const r=await Promise.all(e.value.args.map(e=>this.evaluateAsync(e,t)));return await n.value(r,t)}}t.Interpreter=y,t.evaluate=function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return n.evaluate(r,a)}return n.evaluate(e,a)},t.evaluateAsync=async function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return await n.evaluateAsync(r,a)}return await n.evaluateAsync(e,a)},function(t){function n(e){if(null==e)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function r(e){if(e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function u(e){if(e.type!==l.Boolean)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function i(e){if(e.type!==l.String)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function s(e){if(e.type!==l.Table)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e,t){return{type:l.Nil,value:null}}function v(e){if(!Number.isFinite(e))throw new o({code:a.InterpreterRuntime,message:"Invalid number"});return e}function p(e,t){const{value:a}=i(n(e[0])),r=Number(a);return{type:l.Number,value:v(r)}}function f(e,t){const{value:r}=i(n(e[0]));switch(r){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:a.InterpreterRuntime,message:"Invalid boolean"})}}function h(e,t){const{value:a}=i(n(e[0]));return{type:l.String,value:a}}function d(e,t){const n=e[0];if(null==n)return{type:l.String,value:"(nil)"};switch(n.type){case l.String:return{type:l.String,value:n.value};case l.Function:return{type:l.String,value:"(function)"};case l.AsyncFunction:return{type:l.String,value:"(async-function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(n.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function g(e,t){const a=n(e[0]);return{type:l.String,value:a.type}}function m(e,t){return console.info(d(e).value),{type:l.Nil,value:null}}function w(e,t){return n(e[0])}function b(e,t){const n=e[0];if(null==n)return{type:l.Number,value:0};switch(n.type){case l.String:try{return{type:l.Number,value:p([n]).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.AsyncFunction:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:n.value};case l.Boolean:return{type:l.Number,value:Number(n.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function I(e,t){return{type:l.Boolean,value:y.isTruthy(e[0])}}function F(e,t){return{type:l.Nil,value:null}}function N(e,t){throw new o({code:a.Stop,message:"Stop"})}function k(e,t){const a=i(n(e[0])).value,r=n(e[1]);return t.set(a,{type:l.Function,value:(e,t)=>r}),{type:l.Nil,value:null}}function S(e,t){const a=i(n(e[0])).value,r=n(e[1]);let u=t.parent;for(;u;)u.values.has(a)&&u.set(a,{type:l.Function,value:(e,t)=>r}),u=u.parent;return{type:l.Nil,value:null}}function A(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value<=u.value}}function _(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value<u.value}}function R(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value>u.value}}function x(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value>=u.value}}function T(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value+u.value)}}function B(e,t){const a=u(n(e[0])),r=u(n(e[1]));return{type:l.Boolean,value:a.value&&r.value}}function U(e,t){const a=u(n(e[0])),r=u(n(e[1]));return{type:l.Boolean,value:a.value||r.value}}function E(e,t){const a=u(n(e[0]));return{type:l.Boolean,value:!a.value}}function P(e,t){const a=n(e[0]),r=n(e[1]);return{type:l.Boolean,value:a.type===r.type&&a.value===r.value}}function C(e,t){const a=n(e[0]),r=n(e[1]);return{type:l.Boolean,value:!(a.type===r.type&&a.value===r.value)}}function z(e,t){const u=r(n(e[0])),i=r(n(e[1]));if(0===i.value)throw new o({code:a.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:v(u.value%i.value)}}function D(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value**u.value)}}function W(e,t){const u=r(n(e[0])),i=r(n(e[1]));if(0===i.value)throw new o({code:a.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:v(u.value/i.value)}}function O(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value*u.value)}}function V(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value-u.value)}}function L(t,n){return{type:l.String,value:e}}function q(e,t){const n=e.map(e=>i(e).value);return{type:l.String,value:n.join("")}}function $(e,t){const{value:a}=i(n(e[0]));switch(a){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:a}}}function j(e,t){return{type:l.String,value:'"'}}function K(e,t){const{value:a}=s(n(e[0]));let r=0;for(const e of a.keys())"number"==typeof e&&Number.isInteger(e)&&e>=0&&r++;return{type:l.Number,value:v(r)}}function M(e,t){const r=n(e[0]);switch(r.type){case l.String:return{type:l.Number,value:r.value.length};case l.Function:case l.AsyncFunction:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:K([r]).value};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function J(e,t){return{type:l.Number,value:Math.random()}}function X(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value&u.value)}}function G(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value|u.value)}}function H(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value^u.value)}}function Q(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value<<(31&u.value))}}function Y(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value>>(31&u.value))}}function Z(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value>>>0>>>(31&u.value))}}function ee(e,t){const a=r(n(e[0])).value;return t.getArgs()[a]??{type:l.Nil,value:null}}function te(e,t){return{type:l.Table,value:new Map}}function ne(e,t){const r=s(n(e[0])),u=n(e[1]);if(u.type!==l.String&&u.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Table key must be string or number"});return r.value.get(u.value)??{type:l.Nil,value:null}}function ae(e,t){const r=s(n(e[0])),u=n(e[1]),i=n(e[2]);if(u.type!==l.String&&u.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Table key must be string or number"});return r.value.set(u.value,i),{type:l.Nil,value:null}}t._assert=n,t._asNumberValue=r,t._asBooleanValue=u,t._asStringValue=i,t._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},t._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},t._asAsyncFunctionValue=function(e){if(e.type!==l.AsyncFunction)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be async function!"});return e},t._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},t._asTableValue=s,t._noop=c,t.nil={type:l.Function,value:c},t._assertValidNumber=v,t._number=p,t.number={type:l.Function,value:p},t._boolean=f,t.boolean={type:l.Function,value:f},t._string=h,t.string={type:l.Function,value:h},t.noop={type:l.Function,value:c},t.block={type:l.Function,value:c},t.forDo={type:l.Function,value:c},t.whileDo={type:l.Function,value:c},t.ifs={type:l.Function,value:c},t.reuse={type:l.Function,value:c},t._toString=d,t.toString={type:l.Function,value:d},t._type=g,t.type={type:l.Function,value:g},t._print=m,t.print={type:l.Function,value:m},t._id=w,t.id={type:l.Function,value:w},t._toNumber=b,t.toNumber={type:l.Function,value:b},t._toBoolean=I,t.toBoolean={type:l.Function,value:I},t._toNil=F,t.toNil={type:l.Function,value:F},t._stop=N,t.stop={type:l.Function,value:N},t._lets=k,t.lets={type:l.Function,value:k},t._env=S,t.env={type:l.Function,value:S},t._lte=A,t.lte={type:l.Function,value:A},t._lt=_,t.lt={type:l.Function,value:_},t._gt=R,t.gt={type:l.Function,value:R},t._gte=x,t.gte={type:l.Function,value:x},t._add=T,t.add={type:l.Function,value:T},t._and=B,t.and={type:l.Function,value:B},t._or=U,t.or={type:l.Function,value:U},t._not=E,t.not={type:l.Function,value:E},t._eq=P,t.eq={type:l.Function,value:P},t._neq=C,t.neq={type:l.Function,value:C},t._mod=z,t.mod={type:l.Function,value:z},t._power=D,t.power={type:l.Function,value:D},t._div=W,t.div={type:l.Function,value:W},t._mul=O,t.mul={type:l.Function,value:O},t._sub=V,t.sub={type:l.Function,value:V},t._version=L,t.version={type:l.Function,value:L},t._concat=q,t.concat={type:l.Function,value:q},t._escape=$,t.escape={type:l.Function,value:$},t._quote=j,t.quote={type:l.Function,value:j},t._lenArr=K,t.lenArr={type:l.Function,value:K},t._len=M,t.len={type:l.Function,value:M},t._random=J,t.random={type:l.Function,value:J},t._binAnd=X,t.binAnd={type:l.Function,value:X},t._binOr=G,t.binOr={type:l.Function,value:G},t._binXor=H,t.binXor={type:l.Function,value:H},t._binLeftShift=Q,t.binLeftShift={type:l.Function,value:Q},t._binRightShift=Y,t.binRightShift={type:l.Function,value:Y},t._binUnsignedRightShift=Z,t.binUnsignedRightShift={type:l.Function,value:Z},t._arg=ee,t.arg={type:l.Function,value:ee},t._table=te,t.table={type:l.Function,value:te},t._get=ne,t.get={type:l.Function,value:ne},t._set=ae,t.set={type:l.Function,value:ae}}(s=t.Std||(t.Std={}))}(exports.DelJS||(exports.DelJS={}));
1
+ "use strict";var e="0.0.4";exports.DelJS=void 0,function(t){let n,a,r,u,l,s,i;t.version=e,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=t.ErrorKind||(t.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(a=t.ErrorCode||(t.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:a}){super(e,null==t?{}:{cause:t}),this.code=a,this.kind=(()=>{for(const e of Object.values(n))if(a.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}t.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(r=t.TokenType||(t.TokenType={}));class c{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:a.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(c.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:a.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:r.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:a.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:r.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();c.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:r.Comma,value:null}),this.advance()):(e.push({type:r.RParen,value:null}),this.advance()):(e.push({type:r.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:r.EOF,value:null}),e}}t.Tokenizer=c,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(u=t.NodeType||(t.NodeType={}));class v{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:a.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===r.String)return this.advance(),{type:u.String,value:e.value};if(e.type===r.Identifier){this.advance();const t={type:u.Identifier,value:e.value};if(this.match(r.LParen)){const e=this.parseArguments();return{type:u.Call,value:{callee:t,args:e}}}return t}throw new o({code:a.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(r.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(r.Comma)){this.expect(r.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:a.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:a.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(r.EOF),e}}t.Parser=v,function(e){e.String="string",e.Function="function",e.AsyncFunction="async-function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=t.ValueType||(t.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(i))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}t.Env=p,function(e){e.Block="Block",e.ForDo="ForDo",e.WhileDo="WhileDo",e.Ifs="Ifs",e.Reuse="Reuse"}(s=t.InterpreterKeywordsLike||(t.InterpreterKeywordsLike={}));class y{evaluate(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return this.evaluateCall(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}async evaluateAsync(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return await this.evaluateCallAsync(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=this.evaluate(t,n);return a}async evaluateBlockAsync(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=await this.evaluateAsync(t,n);return a}evaluateFor(e,t){const[n,r,u,s]=e.value.args;if(null==n||null==r||null==u||null==s)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const i=new p(t);this.evaluate(n,i);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(r,i);if(!y.isTruthy(e))break;c=this.evaluate(s,i),this.evaluate(u,i)}return c}async evaluateForAsync(e,t){const[n,r,u,s]=e.value.args;if(null==n||null==r||null==u||null==s)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const i=new p(t);await this.evaluateAsync(n,i);let c={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(r,i);if(!y.isTruthy(e))break;c=await this.evaluateAsync(s,i),await this.evaluateAsync(u,i)}return c}evaluateWhile(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let s={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,u);if(!y.isTruthy(e))break;s=this.evaluate(r,u)}return s}async evaluateWhileAsync(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let s={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(n,u);if(!y.isTruthy(e))break;s=await this.evaluateAsync(r,u)}return s}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:case l.AsyncFunction:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=this.evaluate(e.value.args[n],t);if(y.isTruthy(a))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}async evaluateIfsAsync(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=await this.evaluateAsync(e.value.args[n],t);if(y.isTruthy(a)){return await this.evaluateAsync(e.value.args[n+1],t)}}return await this.evaluateAsync(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==u.String)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const s={type:l.Reuse,value:r};return t.set(n.value,s),{type:l.Nil,value:null}}callReuse(e,t,n){const a=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,a)}async callReuseAsync(e,t,n){const a=new p(n,await Promise.all(t.map(e=>this.evaluateAsync(e,n))));return await this.evaluateAsync(e.value,a)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===s.WhileDo)return this.evaluateWhile(e,t);if(e.value.callee.value===s.ForDo)return this.evaluateFor(e,t);if(e.value.callee.value===s.Block)return this.evaluateBlock(e,t);if(e.value.callee.value===s.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===s.Ifs)return this.evaluateIfs(e,t);const r=e.value.args.map(e=>this.evaluate(e,t));return n.value({args:r,env:t,isAsync:!1})}async evaluateCallAsync(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse){return await this.callReuseAsync(n,e.value.args,t)}if(n.type!==l.Function&&n.type!==l.AsyncFunction)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===s.WhileDo){return await this.evaluateWhileAsync(e,t)}if(e.value.callee.value===s.ForDo){return await this.evaluateForAsync(e,t)}if(e.value.callee.value===s.Block){return await this.evaluateBlockAsync(e,t)}if(e.value.callee.value===s.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===s.Ifs){return await this.evaluateIfsAsync(e,t)}const r=await Promise.all(e.value.args.map(e=>this.evaluateAsync(e,t)));return await n.value({args:r,env:t,isAsync:!0})}}t.Interpreter=y,t.evaluate=function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return n.evaluate(r,a)}return n.evaluate(e,a)},t.evaluateAsync=async function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return await n.evaluateAsync(r,a)}return await n.evaluateAsync(e,a)},function(t){function n(e){if(null==e)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function r(e){if(e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function u(e){if(e.type!==l.Boolean)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function s(e){if(e.type!==l.String)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function i(e){if(e.type!==l.Table)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e){if(e.type!==l.String&&e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string or number!"});return e}function v(e){return{type:l.Nil,value:null}}function p(e){if(!Number.isFinite(e))throw new o({code:a.InterpreterRuntime,message:"Invalid number"});return e}function f(e){const{value:t}=s(n(e.args[0])),a=Number(t);return{type:l.Number,value:p(a)}}function g(e){const{value:t}=s(n(e.args[0]));switch(t){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:a.InterpreterRuntime,message:"Invalid boolean"})}}function h(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t}}function d(e){const t=e.args[0];if(null==t)return{type:l.String,value:"(nil)"};switch(t.type){case l.String:return{type:l.String,value:t.value};case l.Function:return{type:l.String,value:"(function)"};case l.AsyncFunction:return{type:l.String,value:"(async-function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(t.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function m(e){const t=n(e.args[0]);return{type:l.String,value:t.type}}function w(e){return console.info(d(e).value),{type:l.Nil,value:null}}function b(e){return console.error(d(e).value),{type:l.Nil,value:null}}function F(e){const t=e.args[0];return console.dir(t,{depth:1/0}),{type:l.Nil,value:null}}function I(e){return n(e.args[0])}function N(e){const t=e.args[0];if(null==t)return{type:l.Number,value:0};switch(t.type){case l.String:try{return{type:l.Number,value:f({args:[t],env:e.env,isAsync:e.isAsync}).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.AsyncFunction:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:t.value};case l.Boolean:return{type:l.Number,value:Number(t.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function _(e){return{type:l.Boolean,value:y.isTruthy(e.args[0])}}function A(e){return{type:l.Nil,value:null}}function S(e){throw new o({code:a.Stop,message:"Stop"})}function k(e){const t=s(n(e.args[0])).value,a=n(e.args[1]);return a.type===l.Function||a.type===l.AsyncFunction||a.type===l.Reuse?e.env.set(t,a):e.env.set(t,{type:l.Function,value:e=>a}),{type:l.Nil,value:null}}function R(e){const t=s(n(e.args[0])).value,a=n(e.args[1]);let r=e.env.parent;for(;r;)r.values.has(t)&&r.set(t,{type:l.Function,value:e=>a}),r=r.parent;return{type:l.Nil,value:null}}function x(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value<=a.value}}function T(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value<a.value}}function B(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value>a.value}}function U(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value>=a.value}}function E(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value+a.value)}}function C(e){const t=u(n(e.args[0])),a=u(n(e.args[1]));return{type:l.Boolean,value:t.value&&a.value}}function P(e){const t=u(n(e.args[0])),a=u(n(e.args[1]));return{type:l.Boolean,value:t.value||a.value}}function D(e){const{value:t}=u(n(e.args[0]));return{type:l.Boolean,value:!t}}function z(e){const t=n(e.args[0]),a=n(e.args[1]);return{type:l.Boolean,value:t.type===a.type&&t.value===a.value}}function W(e){const t=n(e.args[0]),a=n(e.args[1]);return{type:l.Boolean,value:!(t.type===a.type&&t.value===a.value)}}function O(e){const t=r(n(e.args[0])),u=r(n(e.args[1]));if(0===u.value)throw new o({code:a.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:p(t.value%u.value)}}function V(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value**a.value)}}function L(e){const t=r(n(e.args[0])),u=r(n(e.args[1]));if(0===u.value)throw new o({code:a.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:p(t.value/u.value)}}function K(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value*a.value)}}function M(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value-a.value)}}function q(t){return{type:l.String,value:e}}function $(e){const t=e.args.map(e=>s(e).value);return{type:l.String,value:t.join("")}}function j(e){const{value:t}=s(n(e.args[0]));switch(t){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:t}}}function J(e){return{type:l.String,value:'"'}}function X(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0}function G(e){const{value:t}=i(n(e.args[0]));let a=0;for(const e of t.keys())X(e)&&a++;return{type:l.Number,value:p(a)}}function H(e){const t=n(e.args[0]);switch(t.type){case l.String:return{type:l.Number,value:t.value.length};case l.Function:case l.AsyncFunction:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:G({args:[t],env:e.env,isAsync:e.isAsync}).value};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function Q(e){return{type:l.Number,value:Math.random()}}function Y(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value&a.value)}}function Z(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value|a.value)}}function ee(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value^a.value)}}function te(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value<<(31&a.value))}}function ne(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value>>(31&a.value))}}function ae(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value>>>0>>>(31&a.value))}}function re(e){const t=r(n(e.args[0])).value;return e.env.getArgs()[t]??{type:l.Nil,value:null}}function ue(e){return{type:l.Table,value:new Map}}function le(e){const t=i(n(e.args[0])),a=c(n(e.args[1]));return t.value.get(a.value)??{type:l.Nil,value:null}}function se(e){const t=i(n(e.args[0])),a=c(n(e.args[1])),r=n(e.args[2]);return t.value.set(a.value,r),{type:l.Nil,value:null}}function ie(e){const{value:t}=r(n(e.args[0]));return{type:l.Number,value:Math.floor(t)}}async function oe(e){const{value:t}=r(n(e.args[0]));return await new Promise(e=>{setTimeout(()=>{e()},t)}),{type:l.Nil,value:null}}function ce(e){return{type:l.String,value:crypto.randomUUID()}}function ve(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.trim()}}function pe(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.toLowerCase()}}function ye(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.toUpperCase()}}function fe(e){const t=s(n(e.args[0])).value,a=r(n(e.args[1])).value;return{type:l.String,value:t[a]??""}}function ge(e){const t=new Map;for(let n=0;n<e.length;n++){const a=e[n]??{type:l.Nil,value:null};t.set(n,a)}return{type:l.Table,value:t}}function he(e){const t=s(n(e.args[0])).value,a=s(n(e.args[1])).value,r=t.split(a),u=new Map;for(let e=0;e<r.length;e++){const t=r[e]??"";u.set(e,{type:l.String,value:t})}return{type:l.Table,value:u}}function de(e){return{type:l.Number,value:Date.now()}}function me(e){if(null==e)return null;switch(e.type){case l.String:case l.Number:case l.Boolean:return e.value;case l.Nil:case l.Table:case l.AsyncFunction:case l.Function:case l.Reuse:default:return null}}function we(e){switch(typeof e){case"string":return{type:l.String,value:e};case"number":return{type:l.Number,value:p(e)};case"boolean":return{type:l.Boolean,value:e};default:return{type:l.Nil,value:null}}}function be(e){const{value:t}=i(n(e.args[0]));return ge([...t.keys()].filter(e=>!X(e)).map(e=>({type:l.String,value:e})))}function Fe(e){const{value:t}=i(n(e.args[0]));return ge([...t.keys()].map(e=>we(e)))}function Ie(e){return{type:l.Boolean,value:e.isAsync}}t._assert=n,t._asNumberValue=r,t._asBooleanValue=u,t._asStringValue=s,t._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},t._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},t._asAsyncFunctionValue=function(e){if(e.type!==l.AsyncFunction)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be async function!"});return e},t._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},t._asTableValue=i,t._asTableKeyValue=c,t._noop=v,t.nil={type:l.Function,value:v},t._assertValidNumber=p,t._number=f,t.number={type:l.Function,value:f},t._boolean=g,t.boolean={type:l.Function,value:g},t._string=h,t.string={type:l.Function,value:h},t.noop={type:l.Function,value:v},t.block={type:l.Function,value:v},t.forDo={type:l.Function,value:v},t.whileDo={type:l.Function,value:v},t.ifs={type:l.Function,value:v},t.reuse={type:l.Function,value:v},t._toString=d,t.toString={type:l.Function,value:d},t._type=m,t.type={type:l.Function,value:m},t._print=w,t.print={type:l.Function,value:w},t._eprint=b,t.eprint={type:l.Function,value:b},t._debug=F,t.debug={type:l.Function,value:F},t._id=I,t.id={type:l.Function,value:I},t._toNumber=N,t.toNumber={type:l.Function,value:N},t._toBoolean=_,t.toBoolean={type:l.Function,value:_},t._toNil=A,t.toNil={type:l.Function,value:A},t._stop=S,t.stop={type:l.Function,value:S},t._lets=k,t.lets={type:l.Function,value:k},t._env=R,t.env={type:l.Function,value:R},t._lte=x,t.lte={type:l.Function,value:x},t._lt=T,t.lt={type:l.Function,value:T},t._gt=B,t.gt={type:l.Function,value:B},t._gte=U,t.gte={type:l.Function,value:U},t._add=E,t.add={type:l.Function,value:E},t._and=C,t.and={type:l.Function,value:C},t._or=P,t.or={type:l.Function,value:P},t._not=D,t.not={type:l.Function,value:D},t._eq=z,t.eq={type:l.Function,value:z},t._neq=W,t.neq={type:l.Function,value:W},t._mod=O,t.mod={type:l.Function,value:O},t._power=V,t.power={type:l.Function,value:V},t._div=L,t.div={type:l.Function,value:L},t._mul=K,t.mul={type:l.Function,value:K},t._sub=M,t.sub={type:l.Function,value:M},t._version=q,t.version={type:l.Function,value:q},t._concat=$,t.concat={type:l.Function,value:$},t._escape=j,t.escape={type:l.Function,value:j},t._quote=J,t.quote={type:l.Function,value:J},t._isArrayLikeKey=X,t._lenArr=G,t.lenArr={type:l.Function,value:G},t._len=H,t.len={type:l.Function,value:H},t._random=Q,t.random={type:l.Function,value:Q},t._binAnd=Y,t.binAnd={type:l.Function,value:Y},t._binOr=Z,t.binOr={type:l.Function,value:Z},t._binXor=ee,t.binXor={type:l.Function,value:ee},t._binLeftShift=te,t.binLeftShift={type:l.Function,value:te},t._binRightShift=ne,t.binRightShift={type:l.Function,value:ne},t._binUnsignedRightShift=ae,t.binUnsignedRightShift={type:l.Function,value:ae},t._arg=re,t.arg={type:l.Function,value:re},t._table=ue,t.table={type:l.Function,value:ue},t._get=le,t.get={type:l.Function,value:le},t._set=se,t.set={type:l.Function,value:se},t._floor=ie,t.floor={type:l.Function,value:ie},t._sleep=oe,t.sleep={type:l.AsyncFunction,value:oe},t._uuid=ce,t.uuid={type:l.Function,value:ce},t._trim=ve,t.trim={type:l.Function,value:ve},t._lower=pe,t.lower={type:l.Function,value:pe},t._upper=ye,t.upper={type:l.Function,value:ye},t._charAt=fe,t.charAt={type:l.Function,value:fe},t._arrayToTable=ge,t._split=he,t.split={type:l.Function,value:he},t._now=de,t.now={type:l.Function,value:de},t._toConvert=me,t._fromConvert=we,t._bindFunction=function(e){return{type:l.Function,value:t=>we(e(...t.args.map(e=>me(e))))}},t._bindAsyncFunction=function(e){return{type:l.AsyncFunction,value:async t=>we(await e(...t.args.map(e=>me(e))))}},t._keys=be,t.keys={type:l.Function,value:be},t._allKeys=Fe,t.allKeys={type:l.Function,value:Fe},t._isAsync=Ie,t.isAsync={type:l.Function,value:Ie}}(i=t.Std||(t.Std={}))}(exports.DelJS||(exports.DelJS={}));
package/dist/index.d.ts CHANGED
@@ -125,13 +125,18 @@ declare namespace DelJS {
125
125
  type: ValueType.String;
126
126
  value: string;
127
127
  }
128
+ interface CallContext {
129
+ args: readonly Value[];
130
+ env: Env;
131
+ isAsync: boolean;
132
+ }
128
133
  interface ValueFunction {
129
134
  type: ValueType.Function;
130
- value: (args: readonly Value[], env: Env) => Value;
135
+ value: (context: CallContext) => Value;
131
136
  }
132
137
  interface ValueAsyncFunction {
133
138
  type: ValueType.AsyncFunction;
134
- value: (args: readonly Value[], env: Env) => AsyncValue;
139
+ value: (context: CallContext) => AsyncValue;
135
140
  }
136
141
  interface ValueNil {
137
142
  type: ValueType.Nil;
@@ -203,14 +208,15 @@ declare namespace DelJS {
203
208
  function _asAsyncFunctionValue(value: Value): ValueAsyncFunction;
204
209
  function _asReuseValue(value: Value): ValueReuse;
205
210
  function _asTableValue(value: Value): ValueTable;
206
- function _noop(_args: readonly Value[], _env: Env): ValueNil;
211
+ function _asTableKeyValue(value: Value): ValueString | ValueNumber;
212
+ function _noop(_context: CallContext): ValueNil;
207
213
  const nil: ValueFunction;
208
214
  function _assertValidNumber(value: number): number;
209
- function _number(args: readonly Value[], _env: Env): ValueNumber;
215
+ function _number(context: CallContext): ValueNumber;
210
216
  const number: ValueFunction;
211
- function _boolean(args: readonly Value[], _env: Env): ValueBoolean;
217
+ function _boolean(context: CallContext): ValueBoolean;
212
218
  const boolean: ValueFunction;
213
- function _string(args: readonly Value[], _env: Env): ValueString;
219
+ function _string(context: CallContext): ValueString;
214
220
  const string: ValueFunction;
215
221
  const noop: ValueFunction;
216
222
  const block: ValueFunction;
@@ -218,90 +224,124 @@ declare namespace DelJS {
218
224
  const whileDo: ValueFunction;
219
225
  const ifs: ValueFunction;
220
226
  const reuse: ValueFunction;
221
- function _toString(args: readonly Value[], _env: Env): ValueString;
227
+ function _toString(context: CallContext): ValueString;
222
228
  const toString: ValueFunction;
223
- function _type(args: readonly Value[], _env: Env): ValueString;
229
+ function _type(context: CallContext): ValueString;
224
230
  const type: ValueFunction;
225
- function _print(args: readonly Value[], env: Env): ValueNil;
231
+ function _print(context: CallContext): ValueNil;
226
232
  const print: ValueFunction;
227
- function _id(args: readonly Value[], _env: Env): Value;
233
+ function _eprint(context: CallContext): ValueNil;
234
+ const eprint: ValueFunction;
235
+ function _debug(context: CallContext): ValueNil;
236
+ const debug: ValueFunction;
237
+ function _id(context: CallContext): Value;
228
238
  const id: ValueFunction;
229
- function _toNumber(args: readonly Value[], env: Env): ValueNumber;
239
+ function _toNumber(context: CallContext): ValueNumber;
230
240
  const toNumber: ValueFunction;
231
- function _toBoolean(args: readonly Value[], _env: Env): ValueBoolean;
241
+ function _toBoolean(context: CallContext): ValueBoolean;
232
242
  const toBoolean: ValueFunction;
233
- function _toNil(_args: readonly Value[], _env: Env): ValueNil;
243
+ function _toNil(_context: CallContext): ValueNil;
234
244
  const toNil: ValueFunction;
235
- function _stop(_args: readonly Value[], _env: Env): never;
245
+ function _stop(_context: CallContext): never;
236
246
  const stop: ValueFunction;
237
- function _lets(args: readonly Value[], env: Env): ValueNil;
247
+ function _lets(context: CallContext): ValueNil;
238
248
  const lets: ValueFunction;
239
- function _env(args: readonly Value[], env: Env): ValueNil;
249
+ function _env(context: CallContext): ValueNil;
240
250
  const env: ValueFunction;
241
- function _lte(args: readonly Value[], _env: Env): ValueBoolean;
251
+ function _lte(context: CallContext): ValueBoolean;
242
252
  const lte: ValueFunction;
243
- function _lt(args: readonly Value[], _env: Env): ValueBoolean;
253
+ function _lt(context: CallContext): ValueBoolean;
244
254
  const lt: ValueFunction;
245
- function _gt(args: readonly Value[], _env: Env): ValueBoolean;
255
+ function _gt(context: CallContext): ValueBoolean;
246
256
  const gt: ValueFunction;
247
- function _gte(args: readonly Value[], _env: Env): ValueBoolean;
257
+ function _gte(context: CallContext): ValueBoolean;
248
258
  const gte: ValueFunction;
249
- function _add(args: readonly Value[], _env: Env): ValueNumber;
259
+ function _add(context: CallContext): ValueNumber;
250
260
  const add: ValueFunction;
251
- function _and(args: readonly Value[], _env: Env): ValueBoolean;
261
+ function _and(context: CallContext): ValueBoolean;
252
262
  const and: ValueFunction;
253
- function _or(args: readonly Value[], _env: Env): ValueBoolean;
263
+ function _or(context: CallContext): ValueBoolean;
254
264
  const or: ValueFunction;
255
- function _not(args: readonly Value[], _env: Env): ValueBoolean;
265
+ function _not(context: CallContext): ValueBoolean;
256
266
  const not: ValueFunction;
257
- function _eq(args: readonly Value[], _env: Env): ValueBoolean;
267
+ function _eq(context: CallContext): ValueBoolean;
258
268
  const eq: ValueFunction;
259
- function _neq(args: readonly Value[], _env: Env): ValueBoolean;
269
+ function _neq(context: CallContext): ValueBoolean;
260
270
  const neq: ValueFunction;
261
- function _mod(args: readonly Value[], _env: Env): ValueNumber;
271
+ function _mod(context: CallContext): ValueNumber;
262
272
  const mod: ValueFunction;
263
- function _power(args: readonly Value[], _env: Env): ValueNumber;
273
+ function _power(context: CallContext): ValueNumber;
264
274
  const power: ValueFunction;
265
- function _div(args: readonly Value[], _env: Env): ValueNumber;
275
+ function _div(context: CallContext): ValueNumber;
266
276
  const div: ValueFunction;
267
- function _mul(args: readonly Value[], _env: Env): ValueNumber;
277
+ function _mul(context: CallContext): ValueNumber;
268
278
  const mul: ValueFunction;
269
- function _sub(args: readonly Value[], _env: Env): ValueNumber;
279
+ function _sub(context: CallContext): ValueNumber;
270
280
  const sub: ValueFunction;
271
- function _version(_args: readonly Value[], _env: Env): ValueString;
281
+ function _version(_context: CallContext): ValueString;
272
282
  const version: ValueFunction;
273
- function _concat(args: readonly Value[], _env: Env): ValueString;
283
+ function _concat(context: CallContext): ValueString;
274
284
  const concat: ValueFunction;
275
- function _escape(args: readonly Value[], _env: Env): ValueString;
285
+ function _escape(context: CallContext): ValueString;
276
286
  const escape: ValueFunction;
277
- function _quote(_args: readonly Value[], _env: Env): ValueString;
287
+ function _quote(_context: CallContext): ValueString;
278
288
  const quote: ValueFunction;
279
- function _lenArr(args: readonly Value[], _env: Env): ValueNumber;
289
+ function _isArrayLikeKey(key: unknown): key is number;
290
+ function _lenArr(context: CallContext): ValueNumber;
280
291
  const lenArr: ValueFunction;
281
- function _len(args: readonly Value[], env: Env): ValueNumber;
292
+ function _len(context: CallContext): ValueNumber;
282
293
  const len: ValueFunction;
283
- function _random(_args: readonly Value[], _env: Env): ValueNumber;
294
+ function _random(_context: CallContext): ValueNumber;
284
295
  const random: ValueFunction;
285
- function _binAnd(args: readonly Value[], _env: Env): ValueNumber;
296
+ function _binAnd(context: CallContext): ValueNumber;
286
297
  const binAnd: ValueFunction;
287
- function _binOr(args: readonly Value[], _env: Env): ValueNumber;
298
+ function _binOr(context: CallContext): ValueNumber;
288
299
  const binOr: ValueFunction;
289
- function _binXor(args: readonly Value[], _env: Env): ValueNumber;
300
+ function _binXor(context: CallContext): ValueNumber;
290
301
  const binXor: ValueFunction;
291
- function _binLeftShift(args: readonly Value[], _env: Env): ValueNumber;
302
+ function _binLeftShift(context: CallContext): ValueNumber;
292
303
  const binLeftShift: ValueFunction;
293
- function _binRightShift(args: readonly Value[], _env: Env): ValueNumber;
304
+ function _binRightShift(context: CallContext): ValueNumber;
294
305
  const binRightShift: ValueFunction;
295
- function _binUnsignedRightShift(args: readonly Value[], _env: Env): ValueNumber;
306
+ function _binUnsignedRightShift(context: CallContext): ValueNumber;
296
307
  const binUnsignedRightShift: ValueFunction;
297
- function _arg(args: readonly Value[], env: Env): Value;
308
+ function _arg(context: CallContext): Value;
298
309
  const arg: ValueFunction;
299
- function _table(_args: readonly Value[], _env: Env): ValueTable;
310
+ function _table(_context: CallContext): ValueTable;
300
311
  const table: ValueFunction;
301
- function _get(args: readonly Value[], _env: Env): Value;
312
+ function _get(context: CallContext): Value;
302
313
  const get: ValueFunction;
303
- function _set(args: readonly Value[], _env: Env): ValueNil;
314
+ function _set(context: CallContext): ValueNil;
304
315
  const set: ValueFunction;
316
+ function _floor(context: CallContext): ValueNumber;
317
+ const floor: ValueFunction;
318
+ function _sleep(context: CallContext): Promise<ValueNil>;
319
+ const sleep: ValueAsyncFunction;
320
+ function _uuid(_context: CallContext): ValueString;
321
+ const uuid: ValueFunction;
322
+ function _trim(context: CallContext): ValueString;
323
+ const trim: ValueFunction;
324
+ function _lower(context: CallContext): ValueString;
325
+ const lower: ValueFunction;
326
+ function _upper(context: CallContext): ValueString;
327
+ const upper: ValueFunction;
328
+ function _charAt(context: CallContext): ValueString;
329
+ const charAt: ValueFunction;
330
+ function _arrayToTable(array: readonly Value[]): ValueTable;
331
+ function _split(context: CallContext): ValueTable;
332
+ const split: ValueFunction;
333
+ function _now(_context: CallContext): ValueNumber;
334
+ const now: ValueFunction;
335
+ function _toConvert(value?: Value): unknown;
336
+ function _fromConvert(value?: unknown): Value;
337
+ function _bindFunction(fn: (...args: readonly any[]) => any): ValueFunction;
338
+ function _bindAsyncFunction(fn: (...args: readonly any[]) => Promise<any>): ValueAsyncFunction;
339
+ function _keys(context: CallContext): ValueTable;
340
+ const keys: ValueFunction;
341
+ function _allKeys(context: CallContext): ValueTable;
342
+ const allKeys: ValueFunction;
343
+ function _isAsync(context: CallContext): ValueBoolean;
344
+ const isAsync: ValueFunction;
305
345
  }
306
346
  }
307
347
 
@@ -1 +1 @@
1
- var DelJS=function(e){"use strict";var t="0.0.3";return e.default=void 0,function(e){let n,a,r,u,l,i,s;e.version=t,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=e.ErrorKind||(e.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(a=e.ErrorCode||(e.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:a}){super(e,null==t?{}:{cause:t}),this.code=a,this.kind=(()=>{for(const e of Object.values(n))if(a.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}e.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(r=e.TokenType||(e.TokenType={}));class c{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:a.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(c.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:a.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:r.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:a.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:r.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();c.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:r.Comma,value:null}),this.advance()):(e.push({type:r.RParen,value:null}),this.advance()):(e.push({type:r.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:r.EOF,value:null}),e}}e.Tokenizer=c,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(u=e.NodeType||(e.NodeType={}));class v{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:a.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===r.String)return this.advance(),{type:u.String,value:e.value};if(e.type===r.Identifier){this.advance();const t={type:u.Identifier,value:e.value};if(this.match(r.LParen)){const e=this.parseArguments();return{type:u.Call,value:{callee:t,args:e}}}return t}throw new o({code:a.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(r.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(r.Comma)){this.expect(r.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:a.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:a.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(r.EOF),e}}e.Parser=v,function(e){e.String="string",e.Function="function",e.AsyncFunction="async-function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=e.ValueType||(e.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(s))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}e.Env=p,function(e){e.Block="Block",e.ForDo="ForDo",e.WhileDo="WhileDo",e.Ifs="Ifs",e.Reuse="Reuse"}(i=e.InterpreterKeywordsLike||(e.InterpreterKeywordsLike={}));class y{evaluate(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return this.evaluateCall(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}async evaluateAsync(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return await this.evaluateCallAsync(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=this.evaluate(t,n);return a}async evaluateBlockAsync(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=await this.evaluateAsync(t,n);return a}evaluateFor(e,t){const[n,r,u,i]=e.value.args;if(null==n||null==r||null==u||null==i)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);this.evaluate(n,s);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(r,s);if(!y.isTruthy(e))break;c=this.evaluate(i,s),this.evaluate(u,s)}return c}async evaluateForAsync(e,t){const[n,r,u,i]=e.value.args;if(null==n||null==r||null==u||null==i)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);await this.evaluateAsync(n,s);let c={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(r,s);if(!y.isTruthy(e))break;c=await this.evaluateAsync(i,s),await this.evaluateAsync(u,s)}return c}evaluateWhile(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let i={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,u);if(!y.isTruthy(e))break;i=this.evaluate(r,u)}return i}async evaluateWhileAsync(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let i={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(n,u);if(!y.isTruthy(e))break;i=await this.evaluateAsync(r,u)}return i}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:case l.AsyncFunction:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=this.evaluate(e.value.args[n],t);if(y.isTruthy(a))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}async evaluateIfsAsync(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=await this.evaluateAsync(e.value.args[n],t);if(y.isTruthy(a)){return await this.evaluateAsync(e.value.args[n+1],t)}}return await this.evaluateAsync(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==u.String)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const i={type:l.Reuse,value:r};return t.set(n.value,i),{type:l.Nil,value:null}}callReuse(e,t,n){const a=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,a)}async callReuseAsync(e,t,n){const a=new p(n,await Promise.all(t.map(e=>this.evaluateAsync(e,n))));return await this.evaluateAsync(e.value,a)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===i.WhileDo)return this.evaluateWhile(e,t);if(e.value.callee.value===i.ForDo)return this.evaluateFor(e,t);if(e.value.callee.value===i.Block)return this.evaluateBlock(e,t);if(e.value.callee.value===i.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===i.Ifs)return this.evaluateIfs(e,t);const r=e.value.args.map(e=>this.evaluate(e,t));return n.value(r,t)}async evaluateCallAsync(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse){return await this.callReuseAsync(n,e.value.args,t)}if(n.type!==l.Function&&n.type!==l.AsyncFunction)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===i.WhileDo){return await this.evaluateWhileAsync(e,t)}if(e.value.callee.value===i.ForDo){return await this.evaluateForAsync(e,t)}if(e.value.callee.value===i.Block){return await this.evaluateBlockAsync(e,t)}if(e.value.callee.value===i.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===i.Ifs){return await this.evaluateIfsAsync(e,t)}const r=await Promise.all(e.value.args.map(e=>this.evaluateAsync(e,t)));return await n.value(r,t)}}e.Interpreter=y,e.evaluate=function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return n.evaluate(r,a)}return n.evaluate(e,a)},e.evaluateAsync=async function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return await n.evaluateAsync(r,a)}return await n.evaluateAsync(e,a)},function(e){function n(e){if(null==e)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function r(e){if(e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function u(e){if(e.type!==l.Boolean)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function i(e){if(e.type!==l.String)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function s(e){if(e.type!==l.Table)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e,t){return{type:l.Nil,value:null}}function v(e){if(!Number.isFinite(e))throw new o({code:a.InterpreterRuntime,message:"Invalid number"});return e}function p(e,t){const{value:a}=i(n(e[0])),r=Number(a);return{type:l.Number,value:v(r)}}function f(e,t){const{value:r}=i(n(e[0]));switch(r){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:a.InterpreterRuntime,message:"Invalid boolean"})}}function h(e,t){const{value:a}=i(n(e[0]));return{type:l.String,value:a}}function d(e,t){const n=e[0];if(null==n)return{type:l.String,value:"(nil)"};switch(n.type){case l.String:return{type:l.String,value:n.value};case l.Function:return{type:l.String,value:"(function)"};case l.AsyncFunction:return{type:l.String,value:"(async-function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(n.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function g(e,t){const a=n(e[0]);return{type:l.String,value:a.type}}function m(e,t){return console.info(d(e).value),{type:l.Nil,value:null}}function w(e,t){return n(e[0])}function b(e,t){const n=e[0];if(null==n)return{type:l.Number,value:0};switch(n.type){case l.String:try{return{type:l.Number,value:p([n]).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.AsyncFunction:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:n.value};case l.Boolean:return{type:l.Number,value:Number(n.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function I(e,t){return{type:l.Boolean,value:y.isTruthy(e[0])}}function F(e,t){return{type:l.Nil,value:null}}function N(e,t){throw new o({code:a.Stop,message:"Stop"})}function k(e,t){const a=i(n(e[0])).value,r=n(e[1]);return t.set(a,{type:l.Function,value:(e,t)=>r}),{type:l.Nil,value:null}}function S(e,t){const a=i(n(e[0])).value,r=n(e[1]);let u=t.parent;for(;u;)u.values.has(a)&&u.set(a,{type:l.Function,value:(e,t)=>r}),u=u.parent;return{type:l.Nil,value:null}}function A(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value<=u.value}}function _(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value<u.value}}function R(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value>u.value}}function x(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value>=u.value}}function T(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value+u.value)}}function B(e,t){const a=u(n(e[0])),r=u(n(e[1]));return{type:l.Boolean,value:a.value&&r.value}}function U(e,t){const a=u(n(e[0])),r=u(n(e[1]));return{type:l.Boolean,value:a.value||r.value}}function E(e,t){const a=u(n(e[0]));return{type:l.Boolean,value:!a.value}}function P(e,t){const a=n(e[0]),r=n(e[1]);return{type:l.Boolean,value:a.type===r.type&&a.value===r.value}}function C(e,t){const a=n(e[0]),r=n(e[1]);return{type:l.Boolean,value:!(a.type===r.type&&a.value===r.value)}}function z(e,t){const u=r(n(e[0])),i=r(n(e[1]));if(0===i.value)throw new o({code:a.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:v(u.value%i.value)}}function W(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value**u.value)}}function O(e,t){const u=r(n(e[0])),i=r(n(e[1]));if(0===i.value)throw new o({code:a.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:v(u.value/i.value)}}function D(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value*u.value)}}function V(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value-u.value)}}function L(e,n){return{type:l.String,value:t}}function q(e,t){const n=e.map(e=>i(e).value);return{type:l.String,value:n.join("")}}function $(e,t){const{value:a}=i(n(e[0]));switch(a){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:a}}}function j(e,t){return{type:l.String,value:'"'}}function K(e,t){const{value:a}=s(n(e[0]));let r=0;for(const e of a.keys())"number"==typeof e&&Number.isInteger(e)&&e>=0&&r++;return{type:l.Number,value:v(r)}}function M(e,t){const r=n(e[0]);switch(r.type){case l.String:return{type:l.Number,value:r.value.length};case l.Function:case l.AsyncFunction:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:K([r]).value};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function X(e,t){return{type:l.Number,value:Math.random()}}function J(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value&u.value)}}function G(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value|u.value)}}function H(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value^u.value)}}function Q(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value<<(31&u.value))}}function Y(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value>>(31&u.value))}}function Z(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value>>>0>>>(31&u.value))}}function ee(e,t){const a=r(n(e[0])).value;return t.getArgs()[a]??{type:l.Nil,value:null}}function te(e,t){return{type:l.Table,value:new Map}}function ne(e,t){const r=s(n(e[0])),u=n(e[1]);if(u.type!==l.String&&u.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Table key must be string or number"});return r.value.get(u.value)??{type:l.Nil,value:null}}function ae(e,t){const r=s(n(e[0])),u=n(e[1]),i=n(e[2]);if(u.type!==l.String&&u.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Table key must be string or number"});return r.value.set(u.value,i),{type:l.Nil,value:null}}e._assert=n,e._asNumberValue=r,e._asBooleanValue=u,e._asStringValue=i,e._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},e._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},e._asAsyncFunctionValue=function(e){if(e.type!==l.AsyncFunction)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be async function!"});return e},e._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},e._asTableValue=s,e._noop=c,e.nil={type:l.Function,value:c},e._assertValidNumber=v,e._number=p,e.number={type:l.Function,value:p},e._boolean=f,e.boolean={type:l.Function,value:f},e._string=h,e.string={type:l.Function,value:h},e.noop={type:l.Function,value:c},e.block={type:l.Function,value:c},e.forDo={type:l.Function,value:c},e.whileDo={type:l.Function,value:c},e.ifs={type:l.Function,value:c},e.reuse={type:l.Function,value:c},e._toString=d,e.toString={type:l.Function,value:d},e._type=g,e.type={type:l.Function,value:g},e._print=m,e.print={type:l.Function,value:m},e._id=w,e.id={type:l.Function,value:w},e._toNumber=b,e.toNumber={type:l.Function,value:b},e._toBoolean=I,e.toBoolean={type:l.Function,value:I},e._toNil=F,e.toNil={type:l.Function,value:F},e._stop=N,e.stop={type:l.Function,value:N},e._lets=k,e.lets={type:l.Function,value:k},e._env=S,e.env={type:l.Function,value:S},e._lte=A,e.lte={type:l.Function,value:A},e._lt=_,e.lt={type:l.Function,value:_},e._gt=R,e.gt={type:l.Function,value:R},e._gte=x,e.gte={type:l.Function,value:x},e._add=T,e.add={type:l.Function,value:T},e._and=B,e.and={type:l.Function,value:B},e._or=U,e.or={type:l.Function,value:U},e._not=E,e.not={type:l.Function,value:E},e._eq=P,e.eq={type:l.Function,value:P},e._neq=C,e.neq={type:l.Function,value:C},e._mod=z,e.mod={type:l.Function,value:z},e._power=W,e.power={type:l.Function,value:W},e._div=O,e.div={type:l.Function,value:O},e._mul=D,e.mul={type:l.Function,value:D},e._sub=V,e.sub={type:l.Function,value:V},e._version=L,e.version={type:l.Function,value:L},e._concat=q,e.concat={type:l.Function,value:q},e._escape=$,e.escape={type:l.Function,value:$},e._quote=j,e.quote={type:l.Function,value:j},e._lenArr=K,e.lenArr={type:l.Function,value:K},e._len=M,e.len={type:l.Function,value:M},e._random=X,e.random={type:l.Function,value:X},e._binAnd=J,e.binAnd={type:l.Function,value:J},e._binOr=G,e.binOr={type:l.Function,value:G},e._binXor=H,e.binXor={type:l.Function,value:H},e._binLeftShift=Q,e.binLeftShift={type:l.Function,value:Q},e._binRightShift=Y,e.binRightShift={type:l.Function,value:Y},e._binUnsignedRightShift=Z,e.binUnsignedRightShift={type:l.Function,value:Z},e._arg=ee,e.arg={type:l.Function,value:ee},e._table=te,e.table={type:l.Function,value:te},e._get=ne,e.get={type:l.Function,value:ne},e._set=ae,e.set={type:l.Function,value:ae}}(s=e.Std||(e.Std={}))}(e.default||(e.default={})),e.default}({});
1
+ var DelJS=function(e){"use strict";var t="0.0.4";return e.default=void 0,function(e){let n,a,r,u,l,s,i;e.version=t,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=e.ErrorKind||(e.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(a=e.ErrorCode||(e.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:a}){super(e,null==t?{}:{cause:t}),this.code=a,this.kind=(()=>{for(const e of Object.values(n))if(a.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}e.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(r=e.TokenType||(e.TokenType={}));class c{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:a.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(c.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:a.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:r.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:a.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:r.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();c.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:r.Comma,value:null}),this.advance()):(e.push({type:r.RParen,value:null}),this.advance()):(e.push({type:r.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:r.EOF,value:null}),e}}e.Tokenizer=c,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(u=e.NodeType||(e.NodeType={}));class v{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:a.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===r.String)return this.advance(),{type:u.String,value:e.value};if(e.type===r.Identifier){this.advance();const t={type:u.Identifier,value:e.value};if(this.match(r.LParen)){const e=this.parseArguments();return{type:u.Call,value:{callee:t,args:e}}}return t}throw new o({code:a.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(r.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(r.Comma)){this.expect(r.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:a.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:a.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(r.EOF),e}}e.Parser=v,function(e){e.String="string",e.Function="function",e.AsyncFunction="async-function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=e.ValueType||(e.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(i))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}e.Env=p,function(e){e.Block="Block",e.ForDo="ForDo",e.WhileDo="WhileDo",e.Ifs="Ifs",e.Reuse="Reuse"}(s=e.InterpreterKeywordsLike||(e.InterpreterKeywordsLike={}));class y{evaluate(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return this.evaluateCall(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}async evaluateAsync(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return await this.evaluateCallAsync(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=this.evaluate(t,n);return a}async evaluateBlockAsync(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=await this.evaluateAsync(t,n);return a}evaluateFor(e,t){const[n,r,u,s]=e.value.args;if(null==n||null==r||null==u||null==s)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const i=new p(t);this.evaluate(n,i);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(r,i);if(!y.isTruthy(e))break;c=this.evaluate(s,i),this.evaluate(u,i)}return c}async evaluateForAsync(e,t){const[n,r,u,s]=e.value.args;if(null==n||null==r||null==u||null==s)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const i=new p(t);await this.evaluateAsync(n,i);let c={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(r,i);if(!y.isTruthy(e))break;c=await this.evaluateAsync(s,i),await this.evaluateAsync(u,i)}return c}evaluateWhile(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let s={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,u);if(!y.isTruthy(e))break;s=this.evaluate(r,u)}return s}async evaluateWhileAsync(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let s={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(n,u);if(!y.isTruthy(e))break;s=await this.evaluateAsync(r,u)}return s}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:case l.AsyncFunction:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=this.evaluate(e.value.args[n],t);if(y.isTruthy(a))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}async evaluateIfsAsync(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=await this.evaluateAsync(e.value.args[n],t);if(y.isTruthy(a)){return await this.evaluateAsync(e.value.args[n+1],t)}}return await this.evaluateAsync(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==u.String)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const s={type:l.Reuse,value:r};return t.set(n.value,s),{type:l.Nil,value:null}}callReuse(e,t,n){const a=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,a)}async callReuseAsync(e,t,n){const a=new p(n,await Promise.all(t.map(e=>this.evaluateAsync(e,n))));return await this.evaluateAsync(e.value,a)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===s.WhileDo)return this.evaluateWhile(e,t);if(e.value.callee.value===s.ForDo)return this.evaluateFor(e,t);if(e.value.callee.value===s.Block)return this.evaluateBlock(e,t);if(e.value.callee.value===s.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===s.Ifs)return this.evaluateIfs(e,t);const r=e.value.args.map(e=>this.evaluate(e,t));return n.value({args:r,env:t,isAsync:!1})}async evaluateCallAsync(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse){return await this.callReuseAsync(n,e.value.args,t)}if(n.type!==l.Function&&n.type!==l.AsyncFunction)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===s.WhileDo){return await this.evaluateWhileAsync(e,t)}if(e.value.callee.value===s.ForDo){return await this.evaluateForAsync(e,t)}if(e.value.callee.value===s.Block){return await this.evaluateBlockAsync(e,t)}if(e.value.callee.value===s.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===s.Ifs){return await this.evaluateIfsAsync(e,t)}const r=await Promise.all(e.value.args.map(e=>this.evaluateAsync(e,t)));return await n.value({args:r,env:t,isAsync:!0})}}e.Interpreter=y,e.evaluate=function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return n.evaluate(r,a)}return n.evaluate(e,a)},e.evaluateAsync=async function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return await n.evaluateAsync(r,a)}return await n.evaluateAsync(e,a)},function(e){function n(e){if(null==e)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function r(e){if(e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function u(e){if(e.type!==l.Boolean)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function s(e){if(e.type!==l.String)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function i(e){if(e.type!==l.Table)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e){if(e.type!==l.String&&e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string or number!"});return e}function v(e){return{type:l.Nil,value:null}}function p(e){if(!Number.isFinite(e))throw new o({code:a.InterpreterRuntime,message:"Invalid number"});return e}function f(e){const{value:t}=s(n(e.args[0])),a=Number(t);return{type:l.Number,value:p(a)}}function g(e){const{value:t}=s(n(e.args[0]));switch(t){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:a.InterpreterRuntime,message:"Invalid boolean"})}}function h(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t}}function d(e){const t=e.args[0];if(null==t)return{type:l.String,value:"(nil)"};switch(t.type){case l.String:return{type:l.String,value:t.value};case l.Function:return{type:l.String,value:"(function)"};case l.AsyncFunction:return{type:l.String,value:"(async-function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(t.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function m(e){const t=n(e.args[0]);return{type:l.String,value:t.type}}function w(e){return console.info(d(e).value),{type:l.Nil,value:null}}function b(e){return console.error(d(e).value),{type:l.Nil,value:null}}function F(e){const t=e.args[0];return console.dir(t,{depth:1/0}),{type:l.Nil,value:null}}function I(e){return n(e.args[0])}function N(e){const t=e.args[0];if(null==t)return{type:l.Number,value:0};switch(t.type){case l.String:try{return{type:l.Number,value:f({args:[t],env:e.env,isAsync:e.isAsync}).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.AsyncFunction:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:t.value};case l.Boolean:return{type:l.Number,value:Number(t.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function _(e){return{type:l.Boolean,value:y.isTruthy(e.args[0])}}function A(e){return{type:l.Nil,value:null}}function k(e){throw new o({code:a.Stop,message:"Stop"})}function S(e){const t=s(n(e.args[0])).value,a=n(e.args[1]);return a.type===l.Function||a.type===l.AsyncFunction||a.type===l.Reuse?e.env.set(t,a):e.env.set(t,{type:l.Function,value:e=>a}),{type:l.Nil,value:null}}function R(e){const t=s(n(e.args[0])).value,a=n(e.args[1]);let r=e.env.parent;for(;r;)r.values.has(t)&&r.set(t,{type:l.Function,value:e=>a}),r=r.parent;return{type:l.Nil,value:null}}function T(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value<=a.value}}function x(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value<a.value}}function B(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value>a.value}}function U(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value>=a.value}}function E(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value+a.value)}}function C(e){const t=u(n(e.args[0])),a=u(n(e.args[1]));return{type:l.Boolean,value:t.value&&a.value}}function P(e){const t=u(n(e.args[0])),a=u(n(e.args[1]));return{type:l.Boolean,value:t.value||a.value}}function z(e){const{value:t}=u(n(e.args[0]));return{type:l.Boolean,value:!t}}function D(e){const t=n(e.args[0]),a=n(e.args[1]);return{type:l.Boolean,value:t.type===a.type&&t.value===a.value}}function W(e){const t=n(e.args[0]),a=n(e.args[1]);return{type:l.Boolean,value:!(t.type===a.type&&t.value===a.value)}}function O(e){const t=r(n(e.args[0])),u=r(n(e.args[1]));if(0===u.value)throw new o({code:a.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:p(t.value%u.value)}}function V(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value**a.value)}}function L(e){const t=r(n(e.args[0])),u=r(n(e.args[1]));if(0===u.value)throw new o({code:a.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:p(t.value/u.value)}}function K(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value*a.value)}}function M(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value-a.value)}}function q(e){return{type:l.String,value:t}}function $(e){const t=e.args.map(e=>s(e).value);return{type:l.String,value:t.join("")}}function j(e){const{value:t}=s(n(e.args[0]));switch(t){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:t}}}function X(e){return{type:l.String,value:'"'}}function J(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0}function G(e){const{value:t}=i(n(e.args[0]));let a=0;for(const e of t.keys())J(e)&&a++;return{type:l.Number,value:p(a)}}function H(e){const t=n(e.args[0]);switch(t.type){case l.String:return{type:l.Number,value:t.value.length};case l.Function:case l.AsyncFunction:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:G({args:[t],env:e.env,isAsync:e.isAsync}).value};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function Q(e){return{type:l.Number,value:Math.random()}}function Y(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value&a.value)}}function Z(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value|a.value)}}function ee(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value^a.value)}}function te(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value<<(31&a.value))}}function ne(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value>>(31&a.value))}}function ae(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value>>>0>>>(31&a.value))}}function re(e){const t=r(n(e.args[0])).value;return e.env.getArgs()[t]??{type:l.Nil,value:null}}function ue(e){return{type:l.Table,value:new Map}}function le(e){const t=i(n(e.args[0])),a=c(n(e.args[1]));return t.value.get(a.value)??{type:l.Nil,value:null}}function se(e){const t=i(n(e.args[0])),a=c(n(e.args[1])),r=n(e.args[2]);return t.value.set(a.value,r),{type:l.Nil,value:null}}function ie(e){const{value:t}=r(n(e.args[0]));return{type:l.Number,value:Math.floor(t)}}async function oe(e){const{value:t}=r(n(e.args[0]));return await new Promise(e=>{setTimeout(()=>{e()},t)}),{type:l.Nil,value:null}}function ce(e){return{type:l.String,value:crypto.randomUUID()}}function ve(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.trim()}}function pe(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.toLowerCase()}}function ye(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.toUpperCase()}}function fe(e){const t=s(n(e.args[0])).value,a=r(n(e.args[1])).value;return{type:l.String,value:t[a]??""}}function ge(e){const t=new Map;for(let n=0;n<e.length;n++){const a=e[n]??{type:l.Nil,value:null};t.set(n,a)}return{type:l.Table,value:t}}function he(e){const t=s(n(e.args[0])).value,a=s(n(e.args[1])).value,r=t.split(a),u=new Map;for(let e=0;e<r.length;e++){const t=r[e]??"";u.set(e,{type:l.String,value:t})}return{type:l.Table,value:u}}function de(e){return{type:l.Number,value:Date.now()}}function me(e){if(null==e)return null;switch(e.type){case l.String:case l.Number:case l.Boolean:return e.value;case l.Nil:case l.Table:case l.AsyncFunction:case l.Function:case l.Reuse:default:return null}}function we(e){switch(typeof e){case"string":return{type:l.String,value:e};case"number":return{type:l.Number,value:p(e)};case"boolean":return{type:l.Boolean,value:e};default:return{type:l.Nil,value:null}}}function be(e){const{value:t}=i(n(e.args[0]));return ge([...t.keys()].filter(e=>!J(e)).map(e=>({type:l.String,value:e})))}function Fe(e){const{value:t}=i(n(e.args[0]));return ge([...t.keys()].map(e=>we(e)))}function Ie(e){return{type:l.Boolean,value:e.isAsync}}e._assert=n,e._asNumberValue=r,e._asBooleanValue=u,e._asStringValue=s,e._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},e._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},e._asAsyncFunctionValue=function(e){if(e.type!==l.AsyncFunction)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be async function!"});return e},e._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},e._asTableValue=i,e._asTableKeyValue=c,e._noop=v,e.nil={type:l.Function,value:v},e._assertValidNumber=p,e._number=f,e.number={type:l.Function,value:f},e._boolean=g,e.boolean={type:l.Function,value:g},e._string=h,e.string={type:l.Function,value:h},e.noop={type:l.Function,value:v},e.block={type:l.Function,value:v},e.forDo={type:l.Function,value:v},e.whileDo={type:l.Function,value:v},e.ifs={type:l.Function,value:v},e.reuse={type:l.Function,value:v},e._toString=d,e.toString={type:l.Function,value:d},e._type=m,e.type={type:l.Function,value:m},e._print=w,e.print={type:l.Function,value:w},e._eprint=b,e.eprint={type:l.Function,value:b},e._debug=F,e.debug={type:l.Function,value:F},e._id=I,e.id={type:l.Function,value:I},e._toNumber=N,e.toNumber={type:l.Function,value:N},e._toBoolean=_,e.toBoolean={type:l.Function,value:_},e._toNil=A,e.toNil={type:l.Function,value:A},e._stop=k,e.stop={type:l.Function,value:k},e._lets=S,e.lets={type:l.Function,value:S},e._env=R,e.env={type:l.Function,value:R},e._lte=T,e.lte={type:l.Function,value:T},e._lt=x,e.lt={type:l.Function,value:x},e._gt=B,e.gt={type:l.Function,value:B},e._gte=U,e.gte={type:l.Function,value:U},e._add=E,e.add={type:l.Function,value:E},e._and=C,e.and={type:l.Function,value:C},e._or=P,e.or={type:l.Function,value:P},e._not=z,e.not={type:l.Function,value:z},e._eq=D,e.eq={type:l.Function,value:D},e._neq=W,e.neq={type:l.Function,value:W},e._mod=O,e.mod={type:l.Function,value:O},e._power=V,e.power={type:l.Function,value:V},e._div=L,e.div={type:l.Function,value:L},e._mul=K,e.mul={type:l.Function,value:K},e._sub=M,e.sub={type:l.Function,value:M},e._version=q,e.version={type:l.Function,value:q},e._concat=$,e.concat={type:l.Function,value:$},e._escape=j,e.escape={type:l.Function,value:j},e._quote=X,e.quote={type:l.Function,value:X},e._isArrayLikeKey=J,e._lenArr=G,e.lenArr={type:l.Function,value:G},e._len=H,e.len={type:l.Function,value:H},e._random=Q,e.random={type:l.Function,value:Q},e._binAnd=Y,e.binAnd={type:l.Function,value:Y},e._binOr=Z,e.binOr={type:l.Function,value:Z},e._binXor=ee,e.binXor={type:l.Function,value:ee},e._binLeftShift=te,e.binLeftShift={type:l.Function,value:te},e._binRightShift=ne,e.binRightShift={type:l.Function,value:ne},e._binUnsignedRightShift=ae,e.binUnsignedRightShift={type:l.Function,value:ae},e._arg=re,e.arg={type:l.Function,value:re},e._table=ue,e.table={type:l.Function,value:ue},e._get=le,e.get={type:l.Function,value:le},e._set=se,e.set={type:l.Function,value:se},e._floor=ie,e.floor={type:l.Function,value:ie},e._sleep=oe,e.sleep={type:l.AsyncFunction,value:oe},e._uuid=ce,e.uuid={type:l.Function,value:ce},e._trim=ve,e.trim={type:l.Function,value:ve},e._lower=pe,e.lower={type:l.Function,value:pe},e._upper=ye,e.upper={type:l.Function,value:ye},e._charAt=fe,e.charAt={type:l.Function,value:fe},e._arrayToTable=ge,e._split=he,e.split={type:l.Function,value:he},e._now=de,e.now={type:l.Function,value:de},e._toConvert=me,e._fromConvert=we,e._bindFunction=function(e){return{type:l.Function,value:t=>we(e(...t.args.map(e=>me(e))))}},e._bindAsyncFunction=function(e){return{type:l.AsyncFunction,value:async t=>we(await e(...t.args.map(e=>me(e))))}},e._keys=be,e.keys={type:l.Function,value:be},e._allKeys=Fe,e.allKeys={type:l.Function,value:Fe},e._isAsync=Ie,e.isAsync={type:l.Function,value:Ie}}(i=e.Std||(e.Std={}))}(e.default||(e.default={})),e.default}({});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e,t="0.0.3";!function(e){let n,a,r,u,l,i,s;e.version=t,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=e.ErrorKind||(e.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(a=e.ErrorCode||(e.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:a}){super(e,null==t?{}:{cause:t}),this.code=a,this.kind=(()=>{for(const e of Object.values(n))if(a.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}e.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(r=e.TokenType||(e.TokenType={}));class c{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:a.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(c.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:a.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:r.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:a.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:r.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();c.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:r.Comma,value:null}),this.advance()):(e.push({type:r.RParen,value:null}),this.advance()):(e.push({type:r.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:r.EOF,value:null}),e}}e.Tokenizer=c,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(u=e.NodeType||(e.NodeType={}));class v{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:a.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===r.String)return this.advance(),{type:u.String,value:e.value};if(e.type===r.Identifier){this.advance();const t={type:u.Identifier,value:e.value};if(this.match(r.LParen)){const e=this.parseArguments();return{type:u.Call,value:{callee:t,args:e}}}return t}throw new o({code:a.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(r.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(r.Comma)){this.expect(r.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:a.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:a.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(r.EOF),e}}e.Parser=v,function(e){e.String="string",e.Function="function",e.AsyncFunction="async-function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=e.ValueType||(e.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(s))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}e.Env=p,function(e){e.Block="Block",e.ForDo="ForDo",e.WhileDo="WhileDo",e.Ifs="Ifs",e.Reuse="Reuse"}(i=e.InterpreterKeywordsLike||(e.InterpreterKeywordsLike={}));class y{evaluate(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return this.evaluateCall(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}async evaluateAsync(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return await this.evaluateCallAsync(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=this.evaluate(t,n);return a}async evaluateBlockAsync(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=await this.evaluateAsync(t,n);return a}evaluateFor(e,t){const[n,r,u,i]=e.value.args;if(null==n||null==r||null==u||null==i)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);this.evaluate(n,s);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(r,s);if(!y.isTruthy(e))break;c=this.evaluate(i,s),this.evaluate(u,s)}return c}async evaluateForAsync(e,t){const[n,r,u,i]=e.value.args;if(null==n||null==r||null==u||null==i)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);await this.evaluateAsync(n,s);let c={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(r,s);if(!y.isTruthy(e))break;c=await this.evaluateAsync(i,s),await this.evaluateAsync(u,s)}return c}evaluateWhile(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let i={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,u);if(!y.isTruthy(e))break;i=this.evaluate(r,u)}return i}async evaluateWhileAsync(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let i={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(n,u);if(!y.isTruthy(e))break;i=await this.evaluateAsync(r,u)}return i}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:case l.AsyncFunction:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=this.evaluate(e.value.args[n],t);if(y.isTruthy(a))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}async evaluateIfsAsync(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=await this.evaluateAsync(e.value.args[n],t);if(y.isTruthy(a)){return await this.evaluateAsync(e.value.args[n+1],t)}}return await this.evaluateAsync(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==u.String)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const i={type:l.Reuse,value:r};return t.set(n.value,i),{type:l.Nil,value:null}}callReuse(e,t,n){const a=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,a)}async callReuseAsync(e,t,n){const a=new p(n,await Promise.all(t.map(e=>this.evaluateAsync(e,n))));return await this.evaluateAsync(e.value,a)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===i.WhileDo)return this.evaluateWhile(e,t);if(e.value.callee.value===i.ForDo)return this.evaluateFor(e,t);if(e.value.callee.value===i.Block)return this.evaluateBlock(e,t);if(e.value.callee.value===i.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===i.Ifs)return this.evaluateIfs(e,t);const r=e.value.args.map(e=>this.evaluate(e,t));return n.value(r,t)}async evaluateCallAsync(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse){return await this.callReuseAsync(n,e.value.args,t)}if(n.type!==l.Function&&n.type!==l.AsyncFunction)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===i.WhileDo){return await this.evaluateWhileAsync(e,t)}if(e.value.callee.value===i.ForDo){return await this.evaluateForAsync(e,t)}if(e.value.callee.value===i.Block){return await this.evaluateBlockAsync(e,t)}if(e.value.callee.value===i.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===i.Ifs){return await this.evaluateIfsAsync(e,t)}const r=await Promise.all(e.value.args.map(e=>this.evaluateAsync(e,t)));return await n.value(r,t)}}e.Interpreter=y,e.evaluate=function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return n.evaluate(r,a)}return n.evaluate(e,a)},e.evaluateAsync=async function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return await n.evaluateAsync(r,a)}return await n.evaluateAsync(e,a)},function(e){function n(e){if(null==e)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function r(e){if(e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function u(e){if(e.type!==l.Boolean)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function i(e){if(e.type!==l.String)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function s(e){if(e.type!==l.Table)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e,t){return{type:l.Nil,value:null}}function v(e){if(!Number.isFinite(e))throw new o({code:a.InterpreterRuntime,message:"Invalid number"});return e}function p(e,t){const{value:a}=i(n(e[0])),r=Number(a);return{type:l.Number,value:v(r)}}function f(e,t){const{value:r}=i(n(e[0]));switch(r){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:a.InterpreterRuntime,message:"Invalid boolean"})}}function h(e,t){const{value:a}=i(n(e[0]));return{type:l.String,value:a}}function d(e,t){const n=e[0];if(null==n)return{type:l.String,value:"(nil)"};switch(n.type){case l.String:return{type:l.String,value:n.value};case l.Function:return{type:l.String,value:"(function)"};case l.AsyncFunction:return{type:l.String,value:"(async-function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(n.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function g(e,t){const a=n(e[0]);return{type:l.String,value:a.type}}function m(e,t){return console.info(d(e).value),{type:l.Nil,value:null}}function w(e,t){return n(e[0])}function b(e,t){const n=e[0];if(null==n)return{type:l.Number,value:0};switch(n.type){case l.String:try{return{type:l.Number,value:p([n]).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.AsyncFunction:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:n.value};case l.Boolean:return{type:l.Number,value:Number(n.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function I(e,t){return{type:l.Boolean,value:y.isTruthy(e[0])}}function F(e,t){return{type:l.Nil,value:null}}function N(e,t){throw new o({code:a.Stop,message:"Stop"})}function k(e,t){const a=i(n(e[0])).value,r=n(e[1]);return t.set(a,{type:l.Function,value:(e,t)=>r}),{type:l.Nil,value:null}}function A(e,t){const a=i(n(e[0])).value,r=n(e[1]);let u=t.parent;for(;u;)u.values.has(a)&&u.set(a,{type:l.Function,value:(e,t)=>r}),u=u.parent;return{type:l.Nil,value:null}}function S(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value<=u.value}}function _(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value<u.value}}function R(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value>u.value}}function x(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Boolean,value:a.value>=u.value}}function T(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value+u.value)}}function B(e,t){const a=u(n(e[0])),r=u(n(e[1]));return{type:l.Boolean,value:a.value&&r.value}}function U(e,t){const a=u(n(e[0])),r=u(n(e[1]));return{type:l.Boolean,value:a.value||r.value}}function E(e,t){const a=u(n(e[0]));return{type:l.Boolean,value:!a.value}}function P(e,t){const a=n(e[0]),r=n(e[1]);return{type:l.Boolean,value:a.type===r.type&&a.value===r.value}}function C(e,t){const a=n(e[0]),r=n(e[1]);return{type:l.Boolean,value:!(a.type===r.type&&a.value===r.value)}}function z(e,t){const u=r(n(e[0])),i=r(n(e[1]));if(0===i.value)throw new o({code:a.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:v(u.value%i.value)}}function W(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value**u.value)}}function O(e,t){const u=r(n(e[0])),i=r(n(e[1]));if(0===i.value)throw new o({code:a.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:v(u.value/i.value)}}function D(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value*u.value)}}function V(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value-u.value)}}function L(e,n){return{type:l.String,value:t}}function q(e,t){const n=e.map(e=>i(e).value);return{type:l.String,value:n.join("")}}function $(e,t){const{value:a}=i(n(e[0]));switch(a){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:a}}}function j(e,t){return{type:l.String,value:'"'}}function K(e,t){const{value:a}=s(n(e[0]));let r=0;for(const e of a.keys())"number"==typeof e&&Number.isInteger(e)&&e>=0&&r++;return{type:l.Number,value:v(r)}}function M(e,t){const r=n(e[0]);switch(r.type){case l.String:return{type:l.Number,value:r.value.length};case l.Function:case l.AsyncFunction:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:K([r]).value};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function X(e,t){return{type:l.Number,value:Math.random()}}function G(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value&u.value)}}function H(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value|u.value)}}function J(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value^u.value)}}function Q(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value<<(31&u.value))}}function Y(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value>>(31&u.value))}}function Z(e,t){const a=r(n(e[0])),u=r(n(e[1]));return{type:l.Number,value:v(a.value>>>0>>>(31&u.value))}}function ee(e,t){const a=r(n(e[0])).value;return t.getArgs()[a]??{type:l.Nil,value:null}}function te(e,t){return{type:l.Table,value:new Map}}function ne(e,t){const r=s(n(e[0])),u=n(e[1]);if(u.type!==l.String&&u.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Table key must be string or number"});return r.value.get(u.value)??{type:l.Nil,value:null}}function ae(e,t){const r=s(n(e[0])),u=n(e[1]),i=n(e[2]);if(u.type!==l.String&&u.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Table key must be string or number"});return r.value.set(u.value,i),{type:l.Nil,value:null}}e._assert=n,e._asNumberValue=r,e._asBooleanValue=u,e._asStringValue=i,e._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},e._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},e._asAsyncFunctionValue=function(e){if(e.type!==l.AsyncFunction)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be async function!"});return e},e._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},e._asTableValue=s,e._noop=c,e.nil={type:l.Function,value:c},e._assertValidNumber=v,e._number=p,e.number={type:l.Function,value:p},e._boolean=f,e.boolean={type:l.Function,value:f},e._string=h,e.string={type:l.Function,value:h},e.noop={type:l.Function,value:c},e.block={type:l.Function,value:c},e.forDo={type:l.Function,value:c},e.whileDo={type:l.Function,value:c},e.ifs={type:l.Function,value:c},e.reuse={type:l.Function,value:c},e._toString=d,e.toString={type:l.Function,value:d},e._type=g,e.type={type:l.Function,value:g},e._print=m,e.print={type:l.Function,value:m},e._id=w,e.id={type:l.Function,value:w},e._toNumber=b,e.toNumber={type:l.Function,value:b},e._toBoolean=I,e.toBoolean={type:l.Function,value:I},e._toNil=F,e.toNil={type:l.Function,value:F},e._stop=N,e.stop={type:l.Function,value:N},e._lets=k,e.lets={type:l.Function,value:k},e._env=A,e.env={type:l.Function,value:A},e._lte=S,e.lte={type:l.Function,value:S},e._lt=_,e.lt={type:l.Function,value:_},e._gt=R,e.gt={type:l.Function,value:R},e._gte=x,e.gte={type:l.Function,value:x},e._add=T,e.add={type:l.Function,value:T},e._and=B,e.and={type:l.Function,value:B},e._or=U,e.or={type:l.Function,value:U},e._not=E,e.not={type:l.Function,value:E},e._eq=P,e.eq={type:l.Function,value:P},e._neq=C,e.neq={type:l.Function,value:C},e._mod=z,e.mod={type:l.Function,value:z},e._power=W,e.power={type:l.Function,value:W},e._div=O,e.div={type:l.Function,value:O},e._mul=D,e.mul={type:l.Function,value:D},e._sub=V,e.sub={type:l.Function,value:V},e._version=L,e.version={type:l.Function,value:L},e._concat=q,e.concat={type:l.Function,value:q},e._escape=$,e.escape={type:l.Function,value:$},e._quote=j,e.quote={type:l.Function,value:j},e._lenArr=K,e.lenArr={type:l.Function,value:K},e._len=M,e.len={type:l.Function,value:M},e._random=X,e.random={type:l.Function,value:X},e._binAnd=G,e.binAnd={type:l.Function,value:G},e._binOr=H,e.binOr={type:l.Function,value:H},e._binXor=J,e.binXor={type:l.Function,value:J},e._binLeftShift=Q,e.binLeftShift={type:l.Function,value:Q},e._binRightShift=Y,e.binRightShift={type:l.Function,value:Y},e._binUnsignedRightShift=Z,e.binUnsignedRightShift={type:l.Function,value:Z},e._arg=ee,e.arg={type:l.Function,value:ee},e._table=te,e.table={type:l.Function,value:te},e._get=ne,e.get={type:l.Function,value:ne},e._set=ae,e.set={type:l.Function,value:ae}}(s=e.Std||(e.Std={}))}(e||(e={}));export{e as DelJS};
1
+ var e,t="0.0.4";!function(e){let n,a,r,u,l,s,i;e.version=t,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=e.ErrorKind||(e.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(a=e.ErrorCode||(e.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:a}){super(e,null==t?{}:{cause:t}),this.code=a,this.kind=(()=>{for(const e of Object.values(n))if(a.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}e.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(r=e.TokenType||(e.TokenType={}));class c{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:a.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(c.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:a.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:r.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:a.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:r.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();c.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:r.Comma,value:null}),this.advance()):(e.push({type:r.RParen,value:null}),this.advance()):(e.push({type:r.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:r.EOF,value:null}),e}}e.Tokenizer=c,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(u=e.NodeType||(e.NodeType={}));class v{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:a.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===r.String)return this.advance(),{type:u.String,value:e.value};if(e.type===r.Identifier){this.advance();const t={type:u.Identifier,value:e.value};if(this.match(r.LParen)){const e=this.parseArguments();return{type:u.Call,value:{callee:t,args:e}}}return t}throw new o({code:a.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(r.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(r.Comma)){this.expect(r.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:a.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:a.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(r.EOF),e}}e.Parser=v,function(e){e.String="string",e.Function="function",e.AsyncFunction="async-function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=e.ValueType||(e.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(i))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}e.Env=p,function(e){e.Block="Block",e.ForDo="ForDo",e.WhileDo="WhileDo",e.Ifs="Ifs",e.Reuse="Reuse"}(s=e.InterpreterKeywordsLike||(e.InterpreterKeywordsLike={}));class y{evaluate(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return this.evaluateCall(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}async evaluateAsync(e,t){switch(e.type){case u.String:return{type:l.String,value:e.value};case u.Identifier:return t.get(e.value);case u.Call:return await this.evaluateCallAsync(e,t);default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=this.evaluate(t,n);return a}async evaluateBlockAsync(e,t){const n=new p(t);let a={type:l.Nil,value:null};for(const t of e.value.args)a=await this.evaluateAsync(t,n);return a}evaluateFor(e,t){const[n,r,u,s]=e.value.args;if(null==n||null==r||null==u||null==s)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const i=new p(t);this.evaluate(n,i);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(r,i);if(!y.isTruthy(e))break;c=this.evaluate(s,i),this.evaluate(u,i)}return c}async evaluateForAsync(e,t){const[n,r,u,s]=e.value.args;if(null==n||null==r||null==u||null==s)throw new o({code:a.InterpreterInvalidFor,message:"Invalid for"});const i=new p(t);await this.evaluateAsync(n,i);let c={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(r,i);if(!y.isTruthy(e))break;c=await this.evaluateAsync(s,i),await this.evaluateAsync(u,i)}return c}evaluateWhile(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let s={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,u);if(!y.isTruthy(e))break;s=this.evaluate(r,u)}return s}async evaluateWhileAsync(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidWhile,message:"Invalid while"});const u=new p(t);let s={type:l.Nil,value:null};for(;;){const e=await this.evaluateAsync(n,u);if(!y.isTruthy(e))break;s=await this.evaluateAsync(r,u)}return s}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:case l.AsyncFunction:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=this.evaluate(e.value.args[n],t);if(y.isTruthy(a))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}async evaluateIfsAsync(e,t){if(e.value.args.length<3)throw new o({code:a.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:a.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const a=await this.evaluateAsync(e.value.args[n],t);if(y.isTruthy(a)){return await this.evaluateAsync(e.value.args[n+1],t)}}return await this.evaluateAsync(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,r]=e.value.args;if(null==n||null==r)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==u.String)throw new o({code:a.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const s={type:l.Reuse,value:r};return t.set(n.value,s),{type:l.Nil,value:null}}callReuse(e,t,n){const a=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,a)}async callReuseAsync(e,t,n){const a=new p(n,await Promise.all(t.map(e=>this.evaluateAsync(e,n))));return await this.evaluateAsync(e.value,a)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===s.WhileDo)return this.evaluateWhile(e,t);if(e.value.callee.value===s.ForDo)return this.evaluateFor(e,t);if(e.value.callee.value===s.Block)return this.evaluateBlock(e,t);if(e.value.callee.value===s.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===s.Ifs)return this.evaluateIfs(e,t);const r=e.value.args.map(e=>this.evaluate(e,t));return n.value({args:r,env:t,isAsync:!1})}async evaluateCallAsync(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse){return await this.callReuseAsync(n,e.value.args,t)}if(n.type!==l.Function&&n.type!==l.AsyncFunction)throw new o({code:a.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if(e.value.callee.value===s.WhileDo){return await this.evaluateWhileAsync(e,t)}if(e.value.callee.value===s.ForDo){return await this.evaluateForAsync(e,t)}if(e.value.callee.value===s.Block){return await this.evaluateBlockAsync(e,t)}if(e.value.callee.value===s.Reuse)return this.evaluateReuse(e,t);if(e.value.callee.value===s.Ifs){return await this.evaluateIfsAsync(e,t)}const r=await Promise.all(e.value.args.map(e=>this.evaluateAsync(e,t)));return await n.value({args:r,env:t,isAsync:!0})}}e.Interpreter=y,e.evaluate=function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return n.evaluate(r,a)}return n.evaluate(e,a)},e.evaluateAsync=async function(e,t){const n=new y,a=p.globalEnv();for(const[e,n]of Object.entries(t??{}))a.set(e,n);if("string"==typeof e){const t=new c(e).tokenize(),r=new v(t).parse();return await n.evaluateAsync(r,a)}return await n.evaluateAsync(e,a)},function(e){function n(e){if(null==e)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function r(e){if(e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function u(e){if(e.type!==l.Boolean)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function s(e){if(e.type!==l.String)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function i(e){if(e.type!==l.Table)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e){if(e.type!==l.String&&e.type!==l.Number)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be string or number!"});return e}function v(e){return{type:l.Nil,value:null}}function p(e){if(!Number.isFinite(e))throw new o({code:a.InterpreterRuntime,message:"Invalid number"});return e}function f(e){const{value:t}=s(n(e.args[0])),a=Number(t);return{type:l.Number,value:p(a)}}function g(e){const{value:t}=s(n(e.args[0]));switch(t){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:a.InterpreterRuntime,message:"Invalid boolean"})}}function h(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t}}function d(e){const t=e.args[0];if(null==t)return{type:l.String,value:"(nil)"};switch(t.type){case l.String:return{type:l.String,value:t.value};case l.Function:return{type:l.String,value:"(function)"};case l.AsyncFunction:return{type:l.String,value:"(async-function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(t.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function m(e){const t=n(e.args[0]);return{type:l.String,value:t.type}}function w(e){return console.info(d(e).value),{type:l.Nil,value:null}}function b(e){return console.error(d(e).value),{type:l.Nil,value:null}}function F(e){const t=e.args[0];return console.dir(t,{depth:1/0}),{type:l.Nil,value:null}}function I(e){return n(e.args[0])}function N(e){const t=e.args[0];if(null==t)return{type:l.Number,value:0};switch(t.type){case l.String:try{return{type:l.Number,value:f({args:[t],env:e.env,isAsync:e.isAsync}).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.AsyncFunction:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:t.value};case l.Boolean:return{type:l.Number,value:Number(t.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function _(e){return{type:l.Boolean,value:y.isTruthy(e.args[0])}}function A(e){return{type:l.Nil,value:null}}function k(e){throw new o({code:a.Stop,message:"Stop"})}function S(e){const t=s(n(e.args[0])).value,a=n(e.args[1]);return a.type===l.Function||a.type===l.AsyncFunction||a.type===l.Reuse?e.env.set(t,a):e.env.set(t,{type:l.Function,value:e=>a}),{type:l.Nil,value:null}}function R(e){const t=s(n(e.args[0])).value,a=n(e.args[1]);let r=e.env.parent;for(;r;)r.values.has(t)&&r.set(t,{type:l.Function,value:e=>a}),r=r.parent;return{type:l.Nil,value:null}}function T(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value<=a.value}}function x(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value<a.value}}function B(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value>a.value}}function U(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Boolean,value:t.value>=a.value}}function E(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value+a.value)}}function C(e){const t=u(n(e.args[0])),a=u(n(e.args[1]));return{type:l.Boolean,value:t.value&&a.value}}function P(e){const t=u(n(e.args[0])),a=u(n(e.args[1]));return{type:l.Boolean,value:t.value||a.value}}function z(e){const{value:t}=u(n(e.args[0]));return{type:l.Boolean,value:!t}}function W(e){const t=n(e.args[0]),a=n(e.args[1]);return{type:l.Boolean,value:t.type===a.type&&t.value===a.value}}function D(e){const t=n(e.args[0]),a=n(e.args[1]);return{type:l.Boolean,value:!(t.type===a.type&&t.value===a.value)}}function O(e){const t=r(n(e.args[0])),u=r(n(e.args[1]));if(0===u.value)throw new o({code:a.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:p(t.value%u.value)}}function V(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value**a.value)}}function L(e){const t=r(n(e.args[0])),u=r(n(e.args[1]));if(0===u.value)throw new o({code:a.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:p(t.value/u.value)}}function K(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value*a.value)}}function M(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value-a.value)}}function q(e){return{type:l.String,value:t}}function $(e){const t=e.args.map(e=>s(e).value);return{type:l.String,value:t.join("")}}function j(e){const{value:t}=s(n(e.args[0]));switch(t){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:t}}}function X(e){return{type:l.String,value:'"'}}function G(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0}function H(e){const{value:t}=i(n(e.args[0]));let a=0;for(const e of t.keys())G(e)&&a++;return{type:l.Number,value:p(a)}}function J(e){const t=n(e.args[0]);switch(t.type){case l.String:return{type:l.Number,value:t.value.length};case l.Function:case l.AsyncFunction:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:H({args:[t],env:e.env,isAsync:e.isAsync}).value};default:throw new o({code:a.InterpreterUnreachable,message:"Unreachable! value.type"})}}function Q(e){return{type:l.Number,value:Math.random()}}function Y(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value&a.value)}}function Z(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value|a.value)}}function ee(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value^a.value)}}function te(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value<<(31&a.value))}}function ne(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value>>(31&a.value))}}function ae(e){const t=r(n(e.args[0])),a=r(n(e.args[1]));return{type:l.Number,value:p(t.value>>>0>>>(31&a.value))}}function re(e){const t=r(n(e.args[0])).value;return e.env.getArgs()[t]??{type:l.Nil,value:null}}function ue(e){return{type:l.Table,value:new Map}}function le(e){const t=i(n(e.args[0])),a=c(n(e.args[1]));return t.value.get(a.value)??{type:l.Nil,value:null}}function se(e){const t=i(n(e.args[0])),a=c(n(e.args[1])),r=n(e.args[2]);return t.value.set(a.value,r),{type:l.Nil,value:null}}function ie(e){const{value:t}=r(n(e.args[0]));return{type:l.Number,value:Math.floor(t)}}async function oe(e){const{value:t}=r(n(e.args[0]));return await new Promise(e=>{setTimeout(()=>{e()},t)}),{type:l.Nil,value:null}}function ce(e){return{type:l.String,value:crypto.randomUUID()}}function ve(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.trim()}}function pe(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.toLowerCase()}}function ye(e){const{value:t}=s(n(e.args[0]));return{type:l.String,value:t.toUpperCase()}}function fe(e){const t=s(n(e.args[0])).value,a=r(n(e.args[1])).value;return{type:l.String,value:t[a]??""}}function ge(e){const t=new Map;for(let n=0;n<e.length;n++){const a=e[n]??{type:l.Nil,value:null};t.set(n,a)}return{type:l.Table,value:t}}function he(e){const t=s(n(e.args[0])).value,a=s(n(e.args[1])).value,r=t.split(a),u=new Map;for(let e=0;e<r.length;e++){const t=r[e]??"";u.set(e,{type:l.String,value:t})}return{type:l.Table,value:u}}function de(e){return{type:l.Number,value:Date.now()}}function me(e){if(null==e)return null;switch(e.type){case l.String:case l.Number:case l.Boolean:return e.value;case l.Nil:case l.Table:case l.AsyncFunction:case l.Function:case l.Reuse:default:return null}}function we(e){switch(typeof e){case"string":return{type:l.String,value:e};case"number":return{type:l.Number,value:p(e)};case"boolean":return{type:l.Boolean,value:e};default:return{type:l.Nil,value:null}}}function be(e){const{value:t}=i(n(e.args[0]));return ge([...t.keys()].filter(e=>!G(e)).map(e=>({type:l.String,value:e})))}function Fe(e){const{value:t}=i(n(e.args[0]));return ge([...t.keys()].map(e=>we(e)))}function Ie(e){return{type:l.Boolean,value:e.isAsync}}e._assert=n,e._asNumberValue=r,e._asBooleanValue=u,e._asStringValue=s,e._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},e._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},e._asAsyncFunctionValue=function(e){if(e.type!==l.AsyncFunction)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be async function!"});return e},e._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:a.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},e._asTableValue=i,e._asTableKeyValue=c,e._noop=v,e.nil={type:l.Function,value:v},e._assertValidNumber=p,e._number=f,e.number={type:l.Function,value:f},e._boolean=g,e.boolean={type:l.Function,value:g},e._string=h,e.string={type:l.Function,value:h},e.noop={type:l.Function,value:v},e.block={type:l.Function,value:v},e.forDo={type:l.Function,value:v},e.whileDo={type:l.Function,value:v},e.ifs={type:l.Function,value:v},e.reuse={type:l.Function,value:v},e._toString=d,e.toString={type:l.Function,value:d},e._type=m,e.type={type:l.Function,value:m},e._print=w,e.print={type:l.Function,value:w},e._eprint=b,e.eprint={type:l.Function,value:b},e._debug=F,e.debug={type:l.Function,value:F},e._id=I,e.id={type:l.Function,value:I},e._toNumber=N,e.toNumber={type:l.Function,value:N},e._toBoolean=_,e.toBoolean={type:l.Function,value:_},e._toNil=A,e.toNil={type:l.Function,value:A},e._stop=k,e.stop={type:l.Function,value:k},e._lets=S,e.lets={type:l.Function,value:S},e._env=R,e.env={type:l.Function,value:R},e._lte=T,e.lte={type:l.Function,value:T},e._lt=x,e.lt={type:l.Function,value:x},e._gt=B,e.gt={type:l.Function,value:B},e._gte=U,e.gte={type:l.Function,value:U},e._add=E,e.add={type:l.Function,value:E},e._and=C,e.and={type:l.Function,value:C},e._or=P,e.or={type:l.Function,value:P},e._not=z,e.not={type:l.Function,value:z},e._eq=W,e.eq={type:l.Function,value:W},e._neq=D,e.neq={type:l.Function,value:D},e._mod=O,e.mod={type:l.Function,value:O},e._power=V,e.power={type:l.Function,value:V},e._div=L,e.div={type:l.Function,value:L},e._mul=K,e.mul={type:l.Function,value:K},e._sub=M,e.sub={type:l.Function,value:M},e._version=q,e.version={type:l.Function,value:q},e._concat=$,e.concat={type:l.Function,value:$},e._escape=j,e.escape={type:l.Function,value:j},e._quote=X,e.quote={type:l.Function,value:X},e._isArrayLikeKey=G,e._lenArr=H,e.lenArr={type:l.Function,value:H},e._len=J,e.len={type:l.Function,value:J},e._random=Q,e.random={type:l.Function,value:Q},e._binAnd=Y,e.binAnd={type:l.Function,value:Y},e._binOr=Z,e.binOr={type:l.Function,value:Z},e._binXor=ee,e.binXor={type:l.Function,value:ee},e._binLeftShift=te,e.binLeftShift={type:l.Function,value:te},e._binRightShift=ne,e.binRightShift={type:l.Function,value:ne},e._binUnsignedRightShift=ae,e.binUnsignedRightShift={type:l.Function,value:ae},e._arg=re,e.arg={type:l.Function,value:re},e._table=ue,e.table={type:l.Function,value:ue},e._get=le,e.get={type:l.Function,value:le},e._set=se,e.set={type:l.Function,value:se},e._floor=ie,e.floor={type:l.Function,value:ie},e._sleep=oe,e.sleep={type:l.AsyncFunction,value:oe},e._uuid=ce,e.uuid={type:l.Function,value:ce},e._trim=ve,e.trim={type:l.Function,value:ve},e._lower=pe,e.lower={type:l.Function,value:pe},e._upper=ye,e.upper={type:l.Function,value:ye},e._charAt=fe,e.charAt={type:l.Function,value:fe},e._arrayToTable=ge,e._split=he,e.split={type:l.Function,value:he},e._now=de,e.now={type:l.Function,value:de},e._toConvert=me,e._fromConvert=we,e._bindFunction=function(e){return{type:l.Function,value:t=>we(e(...t.args.map(e=>me(e))))}},e._bindAsyncFunction=function(e){return{type:l.AsyncFunction,value:async t=>we(await e(...t.args.map(e=>me(e))))}},e._keys=be,e.keys={type:l.Function,value:be},e._allKeys=Fe,e.allKeys={type:l.Function,value:Fe},e._isAsync=Ie,e.isAsync={type:l.Function,value:Ie}}(i=e.Std||(e.Std={}))}(e||(e={}));export{e as DelJS};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "del-js-lang",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "author": {
5
5
  "name": "Ivan Polushin",
6
6
  "url": "https://t.me/polioan"