Commit Graph

528 Commits

Author SHA1 Message Date
Andrew Kent
5fbf4d30a8 singleton char types if expected type (#527) 2017-03-31 18:04:05 -04:00
Andrew Kent
20a73e479f fix minor bug, make funapp code more readable (#521)
* make our inference abstraction macro readable by mere mortals
2017-03-29 21:48:03 -04:00
Andrew Kent
52caac26e8 be more reasonable about constructor contract checking (#522) 2017-03-29 19:15:22 -04:00
Vincent St-Amour
52b4507585 Fix filters of comparisons in the presence of NaN.
Closes #112.
2017-03-28 15:48:37 -05:00
Andrew Kent
1f28ae53cd fix some lexp function contracts (#520) 2017-03-28 13:20:41 -04:00
Andrew Kent
81b134cbb9 add refinement types, linear expr objs, and ineq props (#510)
This PR adds about half of the needed primitives and logic for
reasoning about linear integer arithmetic in programs with interesting
dependent types. Things have been added in a way s.t. programs will
still continue to typecheck as they did, but if you want integer literals
and certain operations (e.g. *,+,<,<=,=,>=,>) to include linear inequality
information by default, you need to include the
'#:with-linear-integer-arithmetic' keyword at the top of your module.

The other features needed to get TR to be able to check things like
verified vector operations will be to ajust function types so
dependencies can exist between arguments and a minor tweak to get
type inference to consider the symbolic objects of functions arguments.
These features should be coming shortly in a future pull request.
2017-03-27 14:32:29 -04:00
Ben Greenman
2804bd4a93 update path-add-extension type with new optional argument (#519) 2017-03-27 10:18:53 -04:00
Andrew Kent
f4aff224a8 update find-relative-path type w/ new keyword (#518) 2017-03-26 09:11:12 -04:00
Andrew Kent
bf0761b500 fix serialization of objects (#516) 2017-03-20 20:57:28 -04:00
Andrew Kent
c174ba655c fix port-> functions to match new kw args in impl (#514) 2017-03-17 13:25:32 -04:00
Andrew Kent
a103ec257b remove broken subtype caching (#513) 2017-03-16 14:09:23 -04:00
Vincent St-Amour
1d7b7b5a00 Use new DrRacket opt-in buttons for OC. 2017-03-09 17:12:49 -06:00
Sam Tobin-Hochstadt
b24507a71b Allow disabling TR optimization with an environment variable. (#504) 2017-03-01 13:19:15 +00:00
Sam Tobin-Hochstadt
b3ab93768f Add types for loop precondition checking functions. (#501)
This is primarily intended for use on the `linklet` branch,
but does not cause problems in other contexts.
2017-02-24 00:33:47 +00:00
Andrew Kent
6334dfb939 fix the maximum range for type-masks 2017-01-30 18:57:04 -05:00
Sam Tobin-Hochstadt
25419f9a9a Add 6.8 HISTORY. 2017-01-17 08:55:20 -05:00
Vincent St-Amour
41eabc9195 Use existing contract combinators.
To cooperate better with the contract system.
2017-01-10 13:55:13 -06:00
Andrew Kent
b0f707b576 fix Union-fmap bug that skipped some base arg results 2017-01-07 21:43:07 -05:00
Andrew Kent
81255d9a14 misc contract fix 2017-01-07 12:44:48 -05:00
Eric Dobson
3b80ae71f9 correct keyword function conversion
Keyword functions are a little tricky. This PR addresses issues
checking the body of kw functions.

Basically, a function with keyword arguments such as inc:

(define (inc x #:n [n 1])
  (+ x n))

actually expands into a more complex function with 3 arguments that
looks something resembling the following:

(define (inc-expanded n* n-given? x)
   (let ([n (if n-given? n* 1)]) (+ x n)))

and calls to inc are converted to match this form:

(inc 42) => (inc-expanded #f #f 42)

(inc 42 #:n 2) => (inc-expanded 2 #t 42)

Note that each optional keyword argument has a boolean flag argument
that signals whether or not the caller provided that keyword argument.

This PR takes advantage of the observation that the value for the n*
argument in inc is only reachable in code when n-given? is #t, and so,
assuming the kw-expansion protocol always only accesses n* if n-given?
is #t, we can actually safely check the body of the function against
the following simple but correct type:

(-> Number Boolean Number Number)

An alternative previous approach expanded the function type into every
possible combination of optional argument and optional argument flag,
but this was prohibitively expensive.
2017-01-07 12:36:01 -05:00
Asumu Takikawa
e2be0382d1 Remove many uses of dict functions for performance 2017-01-06 15:18:46 -05:00
WarGrey Gyoudmon Ju
3cafa94801 Add type annotation for (make-parent-directory*) (#483) 2017-01-06 11:27:42 -05:00
Ben Greenman
3e2d020a19 Implement object/c-opaque-stronger
An opaque object contract is stronger than another (opaque) object contract if:
- it has stronger field/method contracts on fields/methods common to both
- and it has no more field/method contracts than the other, if the other is opaque
2017-01-06 02:41:59 -05:00
Ben Greenman
7c495eea62 fix bug in object/c-clause syntax-class
`field` needs to be a literal; with the bug, the following syntax

```
  (object/c-opaque (any-var (->m any/c)))
```

made a contract with 1 field (named `->m`, value `any/c`)
2017-01-06 02:41:59 -05:00
Andrew Kent
4bfb101677 use bits for base unions, make unions deterministic
This PR primarily changes how we represent Base types and unions of
Base types. Basically, Base types now contain a bits field, which
contains an exact-nonnegative-integer? with exactly one bit set to
1. This allows us to represent unions of Base types by simply OR-ing
together the various base bits. We store these unions in a new type
called a BaseUnion (which contains a field for numeric Base type bits
and a field for non-numeric Base type bits). We can perform set
operations on BaseUnion types rather quickly (using simple bitwise
arithmetic operations).

To make Union and BaseUnion work together nicely, the Union type now
has a field for non-Base types, and a field which contains any and all
Base types placed directly in the Union ( either as a Base if there is
only one, or as a BaseUnion if there are more than one).

Other changes present in this PR:

Base types are now "closed" -- i.e. Base types are only declared in
base-types.rkt and numeric-base-types.rkt with a special macro that
assigns them their respective bits. The constructor make-Base is no
longer provided for miscellaneous usages.

Some singleton Value types were moved to Base so all of our common
unions of basic types can fit into the new BaseUnion type (namely
Null, Void, One, Zero, and the booleans).

A new Val-able match expander lets us match on singleton types that
used to all be Value types, but, as described above, now some are Base
types.

Unions contain deterministically ordered, duplicate free lists (in
addition to sets for equality and constant time membership checks), so
iterating over Unions can be done deterministically (yay!) -- this
gets rid of some otherwise problematic behavior in areas like type
inference, where the order Unions are iterated over can actually
affect the results (i.e. if two valid type inferences are possible,
nondeterministic ordering means we can sometimes get one and sometimes
get another, which makes for particularly difficult to debug issues
and in general has no immediate solution (both substitutions are
valid, after all!))
2017-01-05 20:45:17 -05:00
Phil Nguyen
2bb0698388 add types for hash-clear, hash-clear!, and hash-copy-clear (#466) 2017-01-04 15:16:49 -05:00
WarGrey Gyoudmon Ju
5b546e1b2c Add type annotations for port line counting (#479) 2017-01-04 14:47:44 -05:00
WarGrey Gyoudmon Ju
fdb79d9a34 Add type annotation for (vector-set-performance-stats) (#480) 2017-01-04 14:47:25 -05:00
Sam Tobin-Hochstadt
565f7ec233 Fix range type after racket/racket#1558.
Closes racket/racket#1560.
2017-01-04 14:29:00 -05:00
Andrew Kent
3e13359ef3 fix errors from 8e7f390 2016-12-20 12:36:26 -05:00
Andrew Kent
be155fa3e3 propagate expected type info further down AST
Previously expected propositions were erased frequently
(at lets and ifs) and checking for logical entailment
was unidirectional instead of bidirectional. In other words,
instead of checking if propositions held at the leaves
of the AST, we would typecheck the AST and blindly propagate
up ALL logical info we learned at each step. This meant that
we would get exponential blow up of propositions even when
we didn't care about their content.

With this commit, instead now we send down expected types
*and* propositions so we can verify expected types and
propisitions are satisfied at leaves, thereby relieving the
need to constantly report up huge amounts of logical info
while typechecking.
2016-12-20 07:43:21 -05:00
Andrew Kent
aa1d36f44e add type syntax for Union/Intersection 2016-12-19 20:16:36 -05:00
Andrew Kent
da30fb6f74 be less eager about bottom propogation
Moving to eager propagating of bottom works for most cases,
but in some cases flattening types such as (Pairof Bottom Any)
to Bottom made things like type inference break for some cases
(since (Listof Nothing) == Null, and (Listof A) did not structurally
like up like it used to). Perhaps w/ a little more effort
inference and any other potential issues could work better
with propagating bottom, but for now we'll be slightly less
aggressive about it.

i.e. this fixes pfds, which commit 8e7f390 broke.
2016-12-19 08:28:49 -05:00
Andrew Kent
708e0782fa make name table non-weak 2016-12-16 22:36:02 -05:00
Andrew Kent
09b78c6ab2 remove unneeded nondeterminism 2016-12-16 22:35:30 -05:00
Andrew Kent
8e7f39025a remove interning for most Reps in TR
Prior to this change (which was Typed Racket PR 469) all internal TR
objects (Reps) were interned and kept around for the entire duration
of type checking.  Because of this, frequent operations that rebuilt
types were particularly costly (e.g. various forms of
substitution). To recoup some of this cost, caching was being used in
a lot of places. This PR sought to remove interning as the default
behavior for Reps and allow for more flexibility in how we approach
time/space performance needs going forward.

The following changes were included in this overhaul:

Interning: All Reps are no longer interned. Right now we only intern
unions and some propositions.

Rep generic operations: we now use racket/generic so we're not
reinventing this wheel.

Singletons: Reps (e.g. TrueProp, Univ, etc) can be declared singleton,
which creates a single instance of the rep that all visible operations
(even within the declaring module) are defined in terms of
(e.g. predicates are defined as (λ (x) (eq? x singleton-instance)),
etc).

Custom constructors: Custom constructors can be specified for Reps,
which allows for simple normalization, interning, or other invariants
to be enfored whenever a Rep is created.

Union: Unions used to try to ensure no obviously overlaping types
would inhabit the same Union (e.g. (U String (Pairof Any Any) (Pairof
Int Int)) would be simplified to (U String (Pairof Any Any))). This,
however, required frequent calls to subtyping every time a Union was
modified and working with Unions thus had a high cost (another thing
that caching was used to reduce). Instead of this, Unions now enforce
a much simpler set of invariants on their members: (1) No duplicates
(by virtue of using a hash-based set), (2) Any and Nothing do not
appear in unions, and (3) Nested unions are flattened. Also, using a
hashset as the internal data structure meant that we could easily
intern unions w.r.t. equal? equality. NOTE: we do reduce unions to not
contain obviously overlapping terms when printing to users and when
generating contracts (so obviously and avoidable inneficient contracts
are not generated – See union.rkt for 'normalize-type').

Subtyping changes: Subtyping has been designed to reduce dispatch time
w/ a switch since we no longer cache _all_ subtyping calls (we only
cache subtyping results for unions since they have some costly
subtyping).

prop-ops changes: AndProps now are careful to sort OrProps by length
before building the resulting proposition. This is done because
OrProp implication only checks if one Or is a subset of another Or.
By ordering Or props by size, we only ever check if an OrProp implies
another if its size is <= the other OrProp. This also makes the
smart constructor '-and' more robust, since the order the props
appear does not affect if some Ors are kept or not.

Testing: More subtype tests have been added (we are still probably
relying too much on typecheck-tests.rkt and not the more granular unit
tests in general).  Also, typecheck-tests.rkt has been changed to
check for type-equivalence (i.e. subtyping in both directions)
instead of equal? equivalence.
2016-12-16 15:18:50 -05:00
Matthew Flatt
0be76c5537 sync with change to for expansion
The expansion of `for` for a generic sequence has changed to receive
and use an extra result from the internal `make-sequence` function.
2016-12-13 20:04:29 -07:00
Tim Brown
d97243b1e8 Update base-env-numeric.rkt (#464)
Added `-Index` to second `varop` list for max so that max is typed for: `(-> Index * Index))`
2016-12-01 09:16:15 -05:00
Sam Tobin-Hochstadt
6a57af77b7 Improve type for dump-memory-stats. 2016-11-28 12:01:07 -05:00
Andrew Kent
7b6013272b fix contract bug 2016-11-22 11:05:43 -05:00
Andrew Kent
f9385af461 clean up tc-let-unit
This commit cleans up some helper functions that have been
pretty awful for a while. The code is (hopefully) more readable
and it does less work (i.e. unneeded substitutions are no longer
performed).
2016-11-21 19:49:33 -05:00
Sam Tobin-Hochstadt
0678743e3d Fix errors in a9ae85d3. 2016-11-05 20:02:15 -04:00
Sam Tobin-Hochstadt
a9ae85d3fd Fix #378 more comprehensively. (#453)
The previous fix relied on finding and manipulating all dead code.
But we missed some; in particular code of the form:

    (begin (error 'x) ...dead...)

So switch to a different strategy that tolerates untraversed
dead code.
2016-11-05 13:11:25 -04:00
Andrew Kent
6f1eff8d2a less dynamic dispatch in contract gen 2016-10-31 12:53:48 -04:00
Phil Nguyen
a8b20d87aa simplify hash-count's type 2016-10-28 17:15:00 -04:00
Phil Nguyen
c85515e258 type for hash-empty? 2016-10-28 00:19:09 -04:00
Andrew Kent
9c33a54c6a fix intersect, make it (hopefully) commutative 2016-10-25 19:25:28 -04:00
Andrew Kent
db1e7183aa provide less from type-rep 2016-10-24 14:56:44 -04:00
Andrew Kent
9df3a1dab5 fix resolve for names being defined 2016-10-23 21:47:00 -04:00
Andrew Kent
4bfebbda98 fix contract provide ordering bug 2016-10-23 19:50:24 -04:00