コード例 #1
0
        public Value Copy()
        {
            var target = array.Copy();
            var source = Arguments.AsArray();

            if (source == null)
            {
                return(this);
            }

            var sourceIndex = 0;

            foreach (var index in getIndicators())
            {
                target[index] = source[sourceIndex++];
            }

            return(target);
        }
コード例 #2
0
        public static Value DefaultSendMessage(Value value, string messageName, Arguments arguments, out bool handled)
        {
            handled = true;
            InterpolatedString interpolated;
            double             number;

            switch (messageName)
            {
            case "print":
                print(value.Text, arguments);
                return(null);

            case "put":
                put(value.Text, arguments);
                return(null);

            case "date":
                return(new Date(value));

            case "but":
                return(elseMessage(value, arguments));

            case "kind":
                return(new TypeName(value.Type.ToString()));

            case "match":
                var match = new Match(value);
                return(match.Evaluate(arguments.Executable));

            case "str":
            {
                return(value is Object obj && obj.RespondsNoDefault("str") ? Runtime.SendMessage(obj, "str", arguments) : value.Text);
            }

            case "num":
                return(value.Number);

            case "id":
                return(value.ID);

            case "dup":
                return(value.Clone());

            case "write":
                write(value.Text, arguments);
                return(null);

            case "newMessage":
                value.RegisterMessages();
                if (arguments[0] is Values.Message message)
                {
                    value.RegisterUserMessage(message);
                    return(value);
                }

                return(new Nil());

            case "cmp":
            {
                return(value is Object obj && obj.RespondsNoDefault("cmp") ? Runtime.SendMessage(obj, "cmp", arguments) :
                       value.Compare(arguments[0]));
            }

            case "isResp":
                return(MessagingState.RespondsTo(value, arguments[0].Text));

            case "isEmpty":
                return(value.IsEmpty);

            case "fmt":
                var source    = arguments[0].Text;
                var formatter = Formatter.Parse(source);
                return(formatter.Format(value.Text));

            case "return":
                value        = value.Resolve();
                interpolated = value as InterpolatedString;
                if (interpolated != null)
                {
                    value = interpolated.String;
                }
                State.ReturnValue  = value;
                State.ReturnSignal = true;
                return(State.ReturnValue);

            case "result":
                value        = value.Resolve();
                interpolated = value as InterpolatedString;
                if (interpolated != null)
                {
                    value = interpolated.String;
                }
                State.ResultValue = value;
                return(value);

            case "squote":
                return(value.Text.SingleQuotify("`'"));

            case "dquote":
                return(value.Text.Quotify("`\""));

            case "rep":
                return(value.Resolve().ToString());

            case "isNum":
                return(value.IsNumeric() ? value.Number : value);

            case "exit":
                if (value.IsTrue)
                {
                    State.ExitSignal = true;
                }
                return(null);

            case "after":
                State.LateBlock = arguments.Executable;
                return(value);

            case "give":
                State.Give(value);
                return(value);

            case "with":
                return(with(value, arguments));

            case "alt":
                return(value.AlternateValue("alt"));

            case "for":
                handled = false;
                return(forLoop(value, arguments, out handled));

            case "json":
                return(value.Text);

            case "send":
                var argClone = arguments.Clone();
                messageName = argClone.Shift().Text;
                return(MessagingState.SendMessage(value, messageName, argClone));

            case "assert":
                if (!value.IsTrue)
                {
                    var errorMessage = arguments[0].Text;
                    if (errorMessage.IsEmpty())
                    {
                        errorMessage = "Assertion failed";
                    }
                    throw new ApplicationException(errorMessage);
                }

                return(null);

            case "freeze":
                freeze(value, arguments);
                return(value);

            case "thaw":
                return(thaw(value));

            case "isVal":
                return(arguments.IsArray() ? arguments.AsArray().ContainsValue(value) : arguments[0].Text.Has(value.Text,
                                                                                                              true));

            case "isKey":
                return(arguments.IsArray() && arguments.AsArray().ContainsKey(value.Text));

            case "can":
                return(can(value, arguments));

            case "isInt":
                number = value.Number;
                return(number == Math.Truncate(number));

            case "isFloat":
                number = value.Number;
                return(number != Math.Truncate(number));

            case "isArr":
                return(value.IsArray);

            case "isInv":
                return(invokeable(value));

            case "isTrue":
                return(value.IsTrue);

            case "isIter":
                return(value.ProvidesGenerator);

            case "tap":
                return(tap(value, arguments));

            case "isFailure":
                return(value.Type == Value.ValueType.Failure);
            }

            handled = false;

            return(null);
        }