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); }
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); }