14 Experimental Features

▼ |  | The Typed Racket Reference

1 | Type Reference
2 | Special Form Reference
3 | Libraries Provided With Typed Racket
4 | Typed Classes
5 | Typed Units
6 | Utilities
7 | Exploring Types
8 | Typed Racket Syntax Without Type Checking
9 | Typed Regions
10 | Optimization in Typed Racket
11 | Unsafe Typed Racket operations
12 | Legacy Forms
13 | Compatibility Languages
14 | Experimental Features

On this page:

declare-refinement
Refinement
define-typed-struct/ exec
define-new-subtype

6.5
top ← prev up next →

### 14`` Experimental Features

These features are currently experimental and subject to change.

> syntax (declare-refinement id)

Declares id to be usable in refinement types.

> syntax (Refinement id)

Includes values that have been tested with the predicate id, which must have been specified with declare-refinement.

> syntax (define-typed-struct/exec forms ...)

Defines an executable structure.

> syntax (define-new-subtype name (constructor t))

Defines a new type name that is a subtype of t. The constructor is defined as a function that takes a value of type t and produces a value of the new type name. A define-new-subtype definition is only allowed at the top level of a file or module.

This is purely a type-level distinction, with no way to distinguish the new type from the base type at runtime. Predicates made by make-predicate won’t be able distinguish them properly, so they will return true for all values that the base type’s predicate would return true for. This is usually not what you want, so you shouldn’t use make-predicate with these types.

Examples:

> > (module m typed/racket
> (provide Radians radians f)
> (define-new-subtype Radians (radians Real))
> (: f : [Radians -> Real])
> (define (f a)
> (sin a)))
> > (require 'm)
> > (radians 0)
> - : Real [more precisely: Radians]
> 0
> > (f (radians 0))
> - : Real
> 0

top ← prev up next →