mirror of
https://github.com/swarm-game/swarm.git
synced 2024-09-11 22:58:21 +03:00
Closes #1547 , which was caused by misspelled/nonexistent types being interpreted as type variables. In #1550 I proposed one solution to the problem, namely, to stop implicitly quantifying types and require explicit `forall` on any polymorphic type. This PR represents an alternative solution: to keep implicit quantification but require all types to start with an uppercase letter, as in Haskell. I think I like this one better but I'm open to feedback. Specifically, with this PR: - All built-in type constructors (`Int`, `Cmd`, `Unit`, etc.) must start with a capital letter - Type variables: - Must start with a lowercase letter or underscore - May not be named a lowercase version of a type constructor, *e.g.* `int` - This is important so that old code with lowercase types is not silently accepted by parsing the former types as implicitly quantified type variables; even in cases where old code no longer typechecks, this will give better error messages. - Term variables: - May start with upper- or lowercase - May be named lowercase versions of type names, *e.g.* `let f : Int -> Int = \int. int + 1` is fine This PR obviously represents a bigger breaking change. Once we merge this we might consider adding an option to `swarm format` to be able to parse old code with lowercase types and then reformat it with uppercase, to aid in porting code. Once this is merged I will also regenerate the wiki pages that mention types. Closes #1550.
14 lines
251 B
Plaintext
14 lines
251 B
Plaintext
// Defining simple recursive functions.
|
|
|
|
def repeat : Int -> Cmd Unit -> Cmd Unit = \n.\c.
|
|
if (n == 0) {} {c ; repeat (n-1) c}
|
|
end
|
|
|
|
def fact : Int -> Int = \n:Int.
|
|
if (n == 0)
|
|
{1}
|
|
{n * fact (n-1)}
|
|
end
|
|
|
|
def gofar = repeat (fact 4) move end
|