public static KeywordArguments kw(params object[] kv) { var dict = new KeywordArguments(); if (kv.Length % 2 != 0) { throw new ArgumentException("Must have an equal number of keys and values"); } for (var i = 0; i < kv.Length; i += 2) { IntPtr value; if (kv[i + 1] is PyObject) { value = ((PyObject)kv[i + 1]).Handle; } else { value = Converter.ToPython(kv[i + 1], kv[i + 1]?.GetType()); } if (Runtime.PyDict_SetItemString(dict.Handle, (string)kv[i], value) != 0) { throw new ArgumentException(string.Format("Cannot add key '{0}' to dictionary.", (string)kv[i])); } if (!(kv[i + 1] is PyObject)) { Runtime.XDecref(value); } } return(dict); }
public override string ToString() { var regularArguments = string.Join(" ", RegularArguments.Select(a => a.ToString())).Trim(); var optionalArguments = string.Join(" ", OptionalArguments.Select(a => a.ToString())).Trim(); var keywordArguments = string.Join(" ", KeywordArguments.Select(a => a.ToString())).Trim(); var auxiliaryArguments = string.Join(" ", AuxiliaryArguments.Select(a => a.ToString())).Trim(); var rest = RestArgument?.ToString(); return(string.Join(" ", new[] { regularArguments, optionalArguments, keywordArguments, auxiliaryArguments, rest }).Trim()); }
internal bool TryMatchInvocationArguments(LispObject[] argumentValues, out Tuple <LispInvocationArgument, LispObject>[] matchedArguments, out LispError error) { matchedArguments = default; error = default; var regularArgumentIndex = 0; var optionalArgumentIndex = 0; var argumentValueIndex = 0; var matchedArgumentsList = new List <Tuple <LispInvocationArgument, LispObject> >(); var boundArguments = new HashSet <string>(); var assignedRest = false; for (; argumentValueIndex < argumentValues.Length; argumentValueIndex++) { var argumentValue = argumentValues[argumentValueIndex]; if (argumentValue is LispResolvedSymbol symbol && symbol.IsKeyword) { if (argumentValueIndex < argumentValues.Length - 1) { var keywordArgumentName = symbol.Value.Substring(1); if (KeywordArguments.TryGetValue(keywordArgumentName, out var keywordArgument)) { if (!boundArguments.Add(keywordArgumentName)) { error = new LispError($"Duplicate value for keyword argument {keywordArgumentName}"); return(false); } matchedArgumentsList.Add(Tuple.Create((LispInvocationArgument)keywordArgument, argumentValues[argumentValueIndex + 1])); argumentValueIndex++; } } else { error = new LispError($"Missing value for keyword argument {symbol.Value}"); return(false); } }
public static KeywordArguments kw(params object[] kv) { var dict = new KeywordArguments(); if (kv.Length % 2 != 0) throw new ArgumentException("Must have an equal number of keys and values"); for (int i = 0; i < kv.Length; i += 2) { IntPtr value; if (kv[i + 1] is PyObject) value = ((PyObject)kv[i + 1]).Handle; else value = Converter.ToPython(kv[i + 1], kv[i + 1].GetType()); if (Runtime.PyDict_SetItemString(dict.Handle, (string)kv[i], value) != 0) throw new ArgumentException(string.Format("Cannot add key '{0}' to dictionary.", (string)kv[i])); if (!(kv[i + 1] is PyObject)) Runtime.Decref(value); } return dict; }