Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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);
                    }
                }
Esempio n. 4
0
 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;
 }