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 +1 -1
- package/dist/index.d.ts +88 -48
- package/dist/index.global.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
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: (
|
|
135
|
+
value: (context: CallContext) => Value;
|
|
131
136
|
}
|
|
132
137
|
interface ValueAsyncFunction {
|
|
133
138
|
type: ValueType.AsyncFunction;
|
|
134
|
-
value: (
|
|
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
|
|
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(
|
|
215
|
+
function _number(context: CallContext): ValueNumber;
|
|
210
216
|
const number: ValueFunction;
|
|
211
|
-
function _boolean(
|
|
217
|
+
function _boolean(context: CallContext): ValueBoolean;
|
|
212
218
|
const boolean: ValueFunction;
|
|
213
|
-
function _string(
|
|
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(
|
|
227
|
+
function _toString(context: CallContext): ValueString;
|
|
222
228
|
const toString: ValueFunction;
|
|
223
|
-
function _type(
|
|
229
|
+
function _type(context: CallContext): ValueString;
|
|
224
230
|
const type: ValueFunction;
|
|
225
|
-
function _print(
|
|
231
|
+
function _print(context: CallContext): ValueNil;
|
|
226
232
|
const print: ValueFunction;
|
|
227
|
-
function
|
|
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(
|
|
239
|
+
function _toNumber(context: CallContext): ValueNumber;
|
|
230
240
|
const toNumber: ValueFunction;
|
|
231
|
-
function _toBoolean(
|
|
241
|
+
function _toBoolean(context: CallContext): ValueBoolean;
|
|
232
242
|
const toBoolean: ValueFunction;
|
|
233
|
-
function _toNil(
|
|
243
|
+
function _toNil(_context: CallContext): ValueNil;
|
|
234
244
|
const toNil: ValueFunction;
|
|
235
|
-
function _stop(
|
|
245
|
+
function _stop(_context: CallContext): never;
|
|
236
246
|
const stop: ValueFunction;
|
|
237
|
-
function _lets(
|
|
247
|
+
function _lets(context: CallContext): ValueNil;
|
|
238
248
|
const lets: ValueFunction;
|
|
239
|
-
function _env(
|
|
249
|
+
function _env(context: CallContext): ValueNil;
|
|
240
250
|
const env: ValueFunction;
|
|
241
|
-
function _lte(
|
|
251
|
+
function _lte(context: CallContext): ValueBoolean;
|
|
242
252
|
const lte: ValueFunction;
|
|
243
|
-
function _lt(
|
|
253
|
+
function _lt(context: CallContext): ValueBoolean;
|
|
244
254
|
const lt: ValueFunction;
|
|
245
|
-
function _gt(
|
|
255
|
+
function _gt(context: CallContext): ValueBoolean;
|
|
246
256
|
const gt: ValueFunction;
|
|
247
|
-
function _gte(
|
|
257
|
+
function _gte(context: CallContext): ValueBoolean;
|
|
248
258
|
const gte: ValueFunction;
|
|
249
|
-
function _add(
|
|
259
|
+
function _add(context: CallContext): ValueNumber;
|
|
250
260
|
const add: ValueFunction;
|
|
251
|
-
function _and(
|
|
261
|
+
function _and(context: CallContext): ValueBoolean;
|
|
252
262
|
const and: ValueFunction;
|
|
253
|
-
function _or(
|
|
263
|
+
function _or(context: CallContext): ValueBoolean;
|
|
254
264
|
const or: ValueFunction;
|
|
255
|
-
function _not(
|
|
265
|
+
function _not(context: CallContext): ValueBoolean;
|
|
256
266
|
const not: ValueFunction;
|
|
257
|
-
function _eq(
|
|
267
|
+
function _eq(context: CallContext): ValueBoolean;
|
|
258
268
|
const eq: ValueFunction;
|
|
259
|
-
function _neq(
|
|
269
|
+
function _neq(context: CallContext): ValueBoolean;
|
|
260
270
|
const neq: ValueFunction;
|
|
261
|
-
function _mod(
|
|
271
|
+
function _mod(context: CallContext): ValueNumber;
|
|
262
272
|
const mod: ValueFunction;
|
|
263
|
-
function _power(
|
|
273
|
+
function _power(context: CallContext): ValueNumber;
|
|
264
274
|
const power: ValueFunction;
|
|
265
|
-
function _div(
|
|
275
|
+
function _div(context: CallContext): ValueNumber;
|
|
266
276
|
const div: ValueFunction;
|
|
267
|
-
function _mul(
|
|
277
|
+
function _mul(context: CallContext): ValueNumber;
|
|
268
278
|
const mul: ValueFunction;
|
|
269
|
-
function _sub(
|
|
279
|
+
function _sub(context: CallContext): ValueNumber;
|
|
270
280
|
const sub: ValueFunction;
|
|
271
|
-
function _version(
|
|
281
|
+
function _version(_context: CallContext): ValueString;
|
|
272
282
|
const version: ValueFunction;
|
|
273
|
-
function _concat(
|
|
283
|
+
function _concat(context: CallContext): ValueString;
|
|
274
284
|
const concat: ValueFunction;
|
|
275
|
-
function _escape(
|
|
285
|
+
function _escape(context: CallContext): ValueString;
|
|
276
286
|
const escape: ValueFunction;
|
|
277
|
-
function _quote(
|
|
287
|
+
function _quote(_context: CallContext): ValueString;
|
|
278
288
|
const quote: ValueFunction;
|
|
279
|
-
function
|
|
289
|
+
function _isArrayLikeKey(key: unknown): key is number;
|
|
290
|
+
function _lenArr(context: CallContext): ValueNumber;
|
|
280
291
|
const lenArr: ValueFunction;
|
|
281
|
-
function _len(
|
|
292
|
+
function _len(context: CallContext): ValueNumber;
|
|
282
293
|
const len: ValueFunction;
|
|
283
|
-
function _random(
|
|
294
|
+
function _random(_context: CallContext): ValueNumber;
|
|
284
295
|
const random: ValueFunction;
|
|
285
|
-
function _binAnd(
|
|
296
|
+
function _binAnd(context: CallContext): ValueNumber;
|
|
286
297
|
const binAnd: ValueFunction;
|
|
287
|
-
function _binOr(
|
|
298
|
+
function _binOr(context: CallContext): ValueNumber;
|
|
288
299
|
const binOr: ValueFunction;
|
|
289
|
-
function _binXor(
|
|
300
|
+
function _binXor(context: CallContext): ValueNumber;
|
|
290
301
|
const binXor: ValueFunction;
|
|
291
|
-
function _binLeftShift(
|
|
302
|
+
function _binLeftShift(context: CallContext): ValueNumber;
|
|
292
303
|
const binLeftShift: ValueFunction;
|
|
293
|
-
function _binRightShift(
|
|
304
|
+
function _binRightShift(context: CallContext): ValueNumber;
|
|
294
305
|
const binRightShift: ValueFunction;
|
|
295
|
-
function _binUnsignedRightShift(
|
|
306
|
+
function _binUnsignedRightShift(context: CallContext): ValueNumber;
|
|
296
307
|
const binUnsignedRightShift: ValueFunction;
|
|
297
|
-
function _arg(
|
|
308
|
+
function _arg(context: CallContext): Value;
|
|
298
309
|
const arg: ValueFunction;
|
|
299
|
-
function _table(
|
|
310
|
+
function _table(_context: CallContext): ValueTable;
|
|
300
311
|
const table: ValueFunction;
|
|
301
|
-
function _get(
|
|
312
|
+
function _get(context: CallContext): Value;
|
|
302
313
|
const get: ValueFunction;
|
|
303
|
-
function _set(
|
|
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
|
|
package/dist/index.global.js
CHANGED
|
@@ -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};
|