public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f.Signature.Add( typeof(bool) ); f.Signature.Add( typeof(List<mysToken>) ); f.Signature.Add( typeof(List<mysToken>) ); f.Function = (args, state, sss) => { bool condition = (bool)args[ 0 ].Value; List<mysToken> positive = (List<mysToken>)args[ 1 ].Value; List<mysToken> negative = (List<mysToken>)args[ 2 ].Value; return new EvaluationMachine( condition ? positive : negative, state, sss ).Evaluate(); }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "if", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f.Signature.Add( typeof(bool) ); f.Signature.Add( typeof(List<mysToken>) ); f.Function = (args, state, sss) => { mysToken condition = args[ 0 ]; List<mysToken> positive = (List<mysToken>)args[ 1 ].Value; EvaluationMachine em; if ( (bool)condition.Value ) { em = new EvaluationMachine( positive, state, sss ); } else { return null; } return em.Evaluate(); }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "when", functionGroup, global ); }
static void setupIntIntVariant( mysSymbolSpace global ) { mysBuiltin variant = new mysBuiltin(); variant.Signature.Add( typeof(int) ); variant.Signature.Add( typeof(int) ); variant.Function = (args, state, sss) => new mysToken( (int)args[ 0 ].Value + (int)args[ 1 ].Value ); mysBuiltin.AddVariant( "+", variant, global ); }
static void setupIntIntVariant() { mysBuiltin variant = new mysBuiltin(); variant.Signature.Add( typeof(int) ); variant.Signature.Add( typeof(int) ); variant.Function = (args, state, sss) => new mysToken( (int)args[ 0 ].Value / (int)args[ 1 ].Value ); functionGroup.Variants.Add( variant ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f.Signature.Add( typeof(List<mysToken>) ); f.Function = (args, state, sss) => ((List<mysToken>)args[ 0 ].Value) .Car(); functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "car", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f.Signature.Add( typeof(NUMBER) ); f.Signature.Add( typeof(NUMBER) ); f.Function = (args, state, sss) => new mysToken( NUMBER.Promote( args[ 0 ] ) > NUMBER.Promote( args[ 1 ] ) ); functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( ">", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f; f = new mysBuiltin(); f.Signature.Add( typeof(int) ); f.Function = (args, state, sss) => { List<int> range = new List<int>(); for ( int i = 1; i <= (int)args[ 0 ].Value; i++ ) { range.Add( i ); } return new mysToken( range ).Quote(); }; functionGroup.Variants.Add( f ); f = new mysBuiltin(); f.Signature.Add( typeof(int) ); f.Signature.Add( typeof(int) ); f.Function = (args, state, sss) => { List<mysToken> range = new List<mysToken>(); for ( long i = (long)args[ 0 ].Value; i <= (long)args[ 1 ].Value; i++ ) { range.Add( new mysToken( (int)i ) ); } return new mysToken( range ); }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "range", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { mysFunctionGroup assign = new mysFunctionGroup(); mysBuiltin assignVariant = new mysBuiltin(); assignVariant = new mysBuiltin(); assignVariant.Signature.Add( typeof(mysSymbol) ); assignVariant.Signature.Add( typeof(ANY) ); assignVariant.Function = (args, state, sss) => { mysSymbol assignsymbol = args[ 0 ].Value as mysSymbol; mysToken value = args[ 1 ]; return Evaluate( assignsymbol, value, sss ); }; assign.Variants.Add( assignVariant ); mysBuiltin.DefineInGlobal( "def", assign, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f.Signature.Add( typeof(List<mysToken>) ); f.Function = (args, state, sss) => { List<mysToken> l = ( (List<mysToken>)args[ 0 ].Value ) .Skip( 1 ) .ToList() ; return new mysToken( l ).Quote(); }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "cdr", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f = new mysBuiltin(); f.Signature.Add( typeof(ANY) ); f.Function = (args, state, sss) => new mysToken( args[ 0 ].ToString() ); functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "string", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f = new mysBuiltin(); f.Signature.Add( typeof(string) ); f.Function = (args, state, sss) => { string path = (string)args[ 0 ].Value; string source = System.IO.File.ReadAllText( System.IO.Path.Combine( System.IO.Directory.GetCurrentDirectory(), path ) ); // a bit clutzy atm, but I guess it does the trick for // the time being source = source.Replace( "@this-file", path ); source = source.Replace( "@this-folder", path.Substring( 0, path.LastIndexOf( '/' ) ) ); List<mysToken> tokens = ParseMachine.Parse( state, source ); state.Evaluate( tokens ); return null; }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "load", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { mysFunctionGroup lambda = new mysFunctionGroup(); mysBuiltin lambdaVariant = new mysBuiltin(); lambdaVariant = new mysBuiltin(); lambdaVariant.Signature.Add( typeof(List<mysToken>) ); lambdaVariant.Signature.Add( typeof(List<mysToken>) ); lambdaVariant.Function = (args, state, sss) => { mysSymbolSpace ss = sss.Peek(); List<mysToken> sig = (List<mysToken>)args[ 0 ].Value; List<mysToken> body = (List<mysToken>)args[ 1 ].Value; return Evaluate( sig, body, sss ); }; lambda.Variants.Add( lambdaVariant ); mysBuiltin.DefineInGlobal( "=>", lambda, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f; // single value version f = new mysBuiltin(); f = new mysBuiltin(); f.Signature.Add( typeof(mysSymbol) ); f.Signature.Add( typeof(List<mysToken>) ); f.Function = (args, state, sss) => { mysSymbol symbol = args[ 0 ].Value as mysSymbol; string ssName = symbol.StringRepresentation.ToLower(); List<mysToken> body = (List<mysToken>)args[ 1 ].Value; if ( !state.nameSpaces.ContainsKey( ssName ) ) { state.nameSpaces.Add( ssName, new mysSymbolSpace() ); } sss.Push( state.nameSpaces[ ssName ] ); EvaluationMachine em = new EvaluationMachine( body, state, sss ); mysToken result = em.Evaluate(); sss.Pop(); return result; }; functionGroup.Variants.Add( f ); // list version f = new mysBuiltin(); f = new mysBuiltin(); f.Signature.Add( typeof(List<mysToken>) ); f.Signature.Add( typeof(List<mysToken>) ); f.Function = (args, state, sss) => { List<mysToken> spaceList = (List<mysToken>)args[ 0 ].Value; List<mysToken> body = (List<mysToken>)args[ 1 ].Value; if ( !spaceList.All( v => v.Type == typeof(mysSymbol) ) ) { throw new FormatException(); } foreach( mysToken t in spaceList ) { mysSymbol symbol = t.Value as mysSymbol; string ssName = symbol.StringRepresentation.ToLower(); if ( !state.nameSpaces.ContainsKey( ssName ) ) { state.nameSpaces.Add( ssName, new mysSymbolSpace() ); } sss.Push( state.nameSpaces[ ssName ] ); } EvaluationMachine em = new EvaluationMachine( body, state, sss ); // really needs to be fixed mysToken result = em.Evaluate(); sss.Pop(); return result; }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "in", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f = new mysBuiltin(); f.Signature.Add( typeof(IList) ); f.Function = (args, state, sss) => new EvaluationMachine( args[ 0 ].Value as List<mysToken>, state, sss ).Evaluate(); functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "eval", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f = new mysBuiltin(); f.Signature.Add( typeof(IList) ); f.Function = (args, state, sss) => { List<mysToken> l = new List<mysToken>(); l.AddRange((List<mysToken>)args[ 0 ].Value); l.Reverse(); return new mysToken( l ); }; functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "reverse", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f; f = new mysBuiltin(); f.Signature.Add( typeof(IList) ); f.Function = (args, state, sss) => new mysToken( ( (IList)args[ 0 ].Value ).Count ); functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "len", functionGroup, global ); }
public static void Setup( mysSymbolSpace global ) { functionGroup = new mysFunctionGroup(); mysBuiltin f; // actual cons version f = new mysBuiltin(); f.Signature.Add( typeof(ANY) ); f.Signature.Add( typeof(ANY) ); f.Function = (args, state, sss) => { List<mysToken> outList = new List<mysToken>(); for ( int i = 0; i < 2; i++ ) { if ( args[ i ].Type == typeof(List<mysToken>) ) { outList.AddRange( (List<mysToken>)args[ i ].Value ); } else { outList.Add( args[ i ] ); } } return new mysToken( outList ).Quote(); }; functionGroup.Variants.Add( f ); // make-list version f = new mysBuiltin(); f.Signature.Add( typeof(ANY) ); f.Function = (args, state, sss) => new mysToken( new List<mysToken>() { args[ 0 ] } ); functionGroup.Variants.Add( f ); mysBuiltin.DefineInGlobal( "cons", functionGroup, global ); }