[Types-sig] merry christmas... here is a demo!

Greg Stein gstein@lyra.org
Sun, 26 Dec 1999 04:13:41 -0800 (PST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1658348780-1663354158-946210421=:412
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hi all,

I banged together a rough prototype for a type checker. It provides some
interesting errors/warnings, but totally ignores a bazillion others :-)

But: it does provide a complete structure for handling that stuff. It
understands a variety of types and composite types and whatnot. It
analyzes a parse tree of a target module. It provides for looking up names
in the builtin, global, and local namespaces; each name has an associated
type. No declarations exist, but it does extract a bit of type information
based on what is going on.

It runs in "verbose" mode. In this mode, all assignments (or dels) and
return statements are printed, along with the type that will be assigned
or returned. It's fun to do something like:

  return (1, "ab", [])

And watch it print:

  line 1: return tuple<type_int, type_string, list<*(Any)>>


I figured it would be nice to go ahead and dump a copy to the SIG. Merry
Christmas! :-)
[ and for those who don't celebrate christmas, figure this to be an early
  New Year's Gift... for those who celebrate Chinese New Years... consider
  this a *really* early gift :-) ... for those... hehe... just have fun! ]


For fun: run "check.py" on itself.

Cheers,
-g

-- 
Greg Stein, http://www.lyra.org/

--1658348780-1663354158-946210421=:412
Content-Type: APPLICATION/octet-stream; name="typesys.tar.gz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.10.9912260413410.412@nebula.lyra.org>
Content-Description: 
Content-Disposition: attachment; filename="typesys.tar.gz"

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
6qq9/h9NWvziAMgAAA==
--1658348780-1663354158-946210421=:412--