- Integer.
- Boolean.
- test (
if .. then .. else ..
)
-
Add
let x : T = t
to define top-level definition. It is used to extend the environment.- Add a
magic
term of typeNothing
to define a term which has no implementation (like()
forunit
). With this term, we can say a term exist without defining the meaning.
- Add a
-
Add
(term : Type)
with the typing rule:Γ ⊦ t : T => Γ ⊦ (t : T) : T
-
Add
let x = t
. -
Reorganize the grammar because it's very ugly!
let x : T = t
is equivalent tolet x = (t : T)
.
- Check all results.
- Automatic verification for tests.
- Add an history to get the derivation tree.
- Use
SUB
in select rules. - Add an action to check if each algorithm outputs the same result. representation of a variable when an error occurs and is raised.
- Trick when
SEL <:
and<: SEL
can be both used. - Add
let x = t
. - check well formedness.
- Return all possible derivation trees.
- Take an extend environment (
Atom -> String
) to recover the initial
- In
let x = s in t
, check that the variable doesn't appear in the type oft
. This is the avoidance problem. - Add
let x = t
. - least_upper_bound_of_dependent_function: call to
best_bounds
and check if it's an arrow. If it'sNothing
, we need to returnTop -> Nothing
because it's the least upper bound which is an arrow. - check
best_bounds
. - check well formedness.
- Improve error message in var application when we have
x.A
(for the moment, we only havex.A
, not what isx.A
). Example - Take an extend environment (
Atom -> String
) to recover the initial
- Add a syntax to check typing at runtime like
[@check_typing type]
- Add a function
well_formed : env -> Grammar.nominal_typ -> bool
returningtrue
if the given nominal type is well formed. We say a typeT
is not well formed ifT
is the formx.A
andx
is not a variable of type{ A : Nothing .. Any }
. - Be able to extend the environment with the syntax
let x : T = t
. - Use a default environment (like
Pervasives
in OCaml) while reading a file.
- Emacs mode.
- Add a sugar for dependent function when the variable is not needed in the return type.
- type S : Nothing .. Any (no need to mention bounds) -> S
- S : Nothing .. U -> S <: U
- S : L .. Any -> S :> L
- struct .. end (ou obj .. end) to define terms and sig .. end to define types.
- sig S = int end for { S : int .. int } (so S = int is for terms and also for types, the difference is sig .. end and struct .. end)
- Allow to use
sig
type S = int.A
type T = S
end
instead of
sig
type S = int.A
type T = self.S
end
It implies to remember the variable binding in the module.
- Instead of
z => sig .. end
, usemodule z = struct .. end
. - Instead of
z => sig .. end
, usemodule type z = sig .. end
- Top level module definitions.
- Top level module type definitions.
- Top level type definitions.
type T = int
=let x = struct type T = int end in open x
. - keyword
include
in modules. - keyword with type S = ... --> intersection.
- Multiple argument.
- Remove ;; for top level definitions. It implies to consider a file like a module.
- Sugar for polymorphic types like
type 'a t = 'a
. - Recursive functions. How can we implement this?
- Allow to write
File.expression
. It searches for the moduleFile
in thebase_modules
.base_modules
a list of modules loaded with the command line. It can be files. IfFile
is a file, then we can add a directory to search it with the argument-I
. -
open M
= for all labelsl
inM
, addM.l
in the environment with the namel
-
t => struct .. end
-->struct(t) .. end
- function with multiple arguments.
- infix operators.