/// <summary> /// このオブジェクトに対して二項式としての演算をしようとしても大体nilです。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { switch (op) { case KecaknoahILCodeType.Equal: return (dynamic)this == (dynamic)target; case KecaknoahILCodeType.NotEqual: return (dynamic)this != (dynamic)target; default: return KecaknoahNil.Instance; } }
/// <summary> /// 指定した<see cref="KecaknoahObject"/>をメソッドとして呼び出します。 /// </summary> /// <param name="obj">呼び出す<see cref="KecaknoahObject"/></param> /// <param name="args">引数</param> /// <returns>結果</returns> public KecaknoahObject Execute(KecaknoahObject obj, params KecaknoahObject[] args) { var r = obj.Call(this, args).ReturningObject; return(r); }
/// <summary> /// 新しいインスタンスを生成します。 /// </summary> /// <param name="inst">インスタンス</param> /// <param name="method">メソッド</param> public KecaknoahInteropFunction(KecaknoahObject inst, KecaknoahInteropDelegate method) { Instance = inst; Function = method; ExtraType = "InteropFunction"; }
/// <summary> /// 呼び出します。 /// </summary> /// <param name="context"></param> /// <param name="args"></param> /// <returns></returns> protected internal override KecaknoahFunctionResult Call(KecaknoahContext context, KecaknoahObject[] args) => Function(context, Instance, args);
/* * 当たり前ですがクラスメソッド呼び出しではselfはnullになります。 * selfに代入するのではなく生成したのをNoResumeで返却します。 */ private static KecaknoahFunctionResult ClassNew(KecaknoahContext ctx, KecaknoahObject self, KecaknoahObject[] args) => new KecaknoahDictionary().NoResume();
private KecaknoahFunctionResult InstanceRemove(KecaknoahContext ctx, KecaknoahObject self, KecaknoahObject[] args) { dict.Remove(args[0]); return(KecaknoahNil.Instance.NoResume()); }
private KecaknoahFunctionResult InstanceHasKey(KecaknoahContext ctx, KecaknoahObject self, KecaknoahObject[] args) { dict.ContainsKey(args[0]); return(dict.ContainsKey(args[0]).AsKecaknoahBoolean().NoResume()); }
/// <summary> /// このオブジェクトに対してインデクサーアクセスを試みようとしてもnilです。 /// </summary> /// <param name="indices">インデックス引数</param> /// <returns></returns> protected internal override KecaknoahReference GetIndexerReference(KecaknoahObject[] indices) => Reference;
/// <summary> /// このオブジェクトに対してメソッドとしての呼び出しをしようとしてもnilです。 /// </summary> /// <param name="context"></param> /// <param name="args">引数</param> /// <returns>返り値</returns> protected internal override KecaknoahFunctionResult Call(KecaknoahContext context, KecaknoahObject[] args) => Instance.NoResume();
/// <summary> /// このオブジェクトに対して二項式としての演算をしようとしても大体nilです。 /// </summary> /// <param name="op">演算子</param> /// <param name="target">2項目の<see cref="KecaknoahObject"/></param> /// <returns></returns> protected internal override KecaknoahObject ExpressionOperation(KecaknoahILCodeType op, KecaknoahObject target) { switch (op) { case KecaknoahILCodeType.Equal: return((dynamic)this == (dynamic)target); case KecaknoahILCodeType.NotEqual: return((dynamic)this != (dynamic)target); default: return(KecaknoahNil.Instance); } }
private KecaknoahFunctionResult Exit(KecaknoahContext context, KecaknoahObject self, KecaknoahObject[] args) { Environment.Exit(args.Length > 0 ? (int)args[0].ToInt64() : 0); return(KecaknoahNil.Instance.NoResume()); }
private KecaknoahFunctionResult Write(KecaknoahContext context, KecaknoahObject self, KecaknoahObject[] args) { Console.Write(args[0]); return(KecaknoahNil.Instance.NoResume()); }
private KecaknoahFunctionResult Eval(KecaknoahContext ctx, KecaknoahObject self, KecaknoahObject[] args) => new KecaknoahContext(this).ExecuteExpressionIL(new KecaknoahPrecompiler().PrecompileExpression(new KecaknoahParser().ParseAsExpression(new KecaknoahLexer().AnalyzeFromSource(args[0].ToString())))).NoResume();