[Types-sig] New syntax?
Greg Stein
gstein@lyra.org
Fri, 17 Dec 1999 20:55:12 -0800 (PST)
On Fri, 17 Dec 1999, Tim Peters wrote:
> [Greg Stein]
> > ...
> > I guess that does mean that something like:
> >
> > decl a: def(Int)->None
> >
> > would be possible. e.g. <a> is a member holding a ref to a function
> > object.
>
> If it weren't possible, it would be quite a hole in the type description
> mechanism!
hehe :-)
This syntax is part of my current proposal. I definitely agree it is a
requirement to be able to specify functional types.
>...
> today. BTW, I wouldn't object to requiring that the class/member
> distinction be explicit.
>
> decl class a: ...
> decl member a: ...
>
> If "decl" gets used for more stuff down the road, it could be a real help to
> make the syntax explicit from the start:
>
> ofwhat : 'class' | 'member' | 'var' | 'type' | 'frozen' | ...
> decl-stmt : 'decl' ofwhat <stuff that depends on ofwhat>
This seems entirely reasonable to me. Let's see what Mr. Consensus says.
> > In fact, these two are probably equivalent:
> >
> > decl class a: def(Int)->None
> > def a(Int x)->None:
>
> WRT type, yes, but (of course!) the former is merely a declaration while the
> latter is the initial stmt of a definition.
Correct. I forgot to mention that and noticed the lack later when I read
that email. No worries... you won't let me get away with being a
slacker... :-)
>...
> Yes, Any is good.
I've listed this in my proposal as an open question. I'm leaning to
"formally endorsing" it. My only real opposition is whether it must be a
new keyword, or we can find some other way to deal with it.
For example:
import types
Int = types.IntType
String = types.StringType
Any = None
decl foo: Any
decl bar: String
The compiler isn't going to have recognized names for the types. I think
it will be using data flow to figure that out (and maybe some builtin
knowledge of the type() builtin and the types module). If the compiler
determines that a particular dotted_name leads to the value None (whereas
it typically refers to a PyTypeObject, a class object, or a typedecl
object), then it says "oh. that is the 'any' construct".
This also leads quite naturally to the following:
def foo(bar):
...
In this case, all the type annotations are not specified -- they are None.
Implicitly, that means "any".
Damn, I'm smooth. ;-)
> The problem with * and ** is that people are going to want to express
> restrictions, like "only strings from here on in" or "all the keyword args
> must be of int type". Under the theory that things work well if you just
> don't think about them <wink>,
>
> decl c: def(Int, *: (String), **: {String: Int})->Int
Yah... this has been covered. No problem.
Funny note: looking at the grammar, I've found the following is legal:
def foo(bar, *args, * *kw):
...
In my typedecl syntax, I punted the ability to use "* *" ... you must use
"**". So there :-)
> > ...
> > I'm not sure whether to go for practical or pure.
>
> I'm leaning toward the "always explicit" above. Restrictions can always be
> loosened later if they prove too confining, but tightening a permissive spec
> is usually impossible.
Yup. Quite a reasonable argument.
Cheers,
-g
--
Greg Stein, http://www.lyra.org/