mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-01 01:09:03 +03:00
Merge branch 'master' into misc-fixes
This commit is contained in:
commit
ae7bdaa7d3
55
CHANGELOG.md
Normal file
55
CHANGELOG.md
Normal file
@ -0,0 +1,55 @@
|
||||
Changes since Idris 2 v0.1.0
|
||||
----------------------------
|
||||
|
||||
The implementation is now self-hosted. To initialise the build, either use
|
||||
the [bootstrapping version of Idris2](https://github.com/edwinb/Idris2-boot)
|
||||
or build fromt the generated Scheme, using `make bootstrap`.
|
||||
|
||||
Compiler updates:
|
||||
|
||||
* Data types with a single constructor, with a single unerased arguments,
|
||||
are translated to just that argument, to save repeated packing and unpacking.
|
||||
(c.f. `newtype` in Haskell)
|
||||
+ A data type can opt out of this behaviour by specifying `noNewtype` in its
|
||||
options list. `noNewtype` allows code generators to apply special handling
|
||||
to the generated constructor/deconstructor, for a newtype-like data type,
|
||||
that would otherwise be optimised away.
|
||||
* 0-multiplicity constructor arguments are now properly erased, not just
|
||||
given a placeholder null value.
|
||||
|
||||
Language extensions:
|
||||
|
||||
* %transform directive, for declaring transformation rules on runtime
|
||||
expressions. Transformation rules are automatically added for top level
|
||||
implementations of interfaces.
|
||||
* A %spec flag on functions which allows arguments to be marked for partial
|
||||
evaluation, following the rules from "Scrapping Your Inefficient Engine"
|
||||
(ICFP 2010, Brady & Hammond)
|
||||
|
||||
Library additions:
|
||||
|
||||
* Additional file management operations in `base`
|
||||
* New modules in `contrib` for time (`System.Clock`); JSON (`Language.JSON.*`);
|
||||
random numbers (`System.Random`)
|
||||
|
||||
Other improvements:
|
||||
|
||||
* Various performance improvements in the typechecker:
|
||||
+ Noting which metavariables are blocking unification constraints, so that
|
||||
they only get retried if those metavariables make progress.
|
||||
+ Evaluating `fromInteger` at compile time.
|
||||
+ In the run-time, reuse the old heap after garbage collection if it
|
||||
hasn't been resized, to avoid unnecessary system calls.
|
||||
|
||||
* Extend Idris2's literate mode to support reading Markdown and OrgMode files.
|
||||
For more details see: https://idris2.readthedocs.io/en/latest/reference/literate.html
|
||||
|
||||
* Fields of records can be accessed (and updated) using the dot syntax,
|
||||
such as `r.field1.field2` or `record { field1.field2 = 42 }`.
|
||||
For details, see https://idris2.readthedocs.io/en/latest/reference/records.html
|
||||
|
||||
Changes since Idris 1
|
||||
---------------------
|
||||
|
||||
Everything :). For full details, see:
|
||||
https://idris2.readthedocs.io/en/latest/updates/updates.html
|
34
INSTALL.md
34
INSTALL.md
@ -1,14 +1,15 @@
|
||||
Installing
|
||||
==========
|
||||
|
||||
Requirements:
|
||||
The easiest way to install is via the existing generated Scheme code. The
|
||||
requirements are:
|
||||
|
||||
* A Scheme compiler; either Chez Scheme (default), or Racket
|
||||
* `bash`, with `realpath`. On Linux, you probably already have this. On
|
||||
a `Mac`, you can install this with `brew install coreutils`.
|
||||
a Mac, you can install this with `brew install coreutils`.
|
||||
|
||||
On Windows, it has been reported that installing via `MSYS2` works
|
||||
(https://www.msys2.org/)
|
||||
(https://www.msys2.org/). On Raspberry Pi, you can bootstrap via Racket.
|
||||
|
||||
By default, code generation is via Chez Scheme. You can use Racket instead,
|
||||
by passing `CG=racket` to `make` for the commands below.
|
||||
@ -16,7 +17,7 @@ by passing `CG=racket` to `make` for the commands below.
|
||||
[Note: a couple of tests are currently known to fail when installing via
|
||||
Racket. This will be addressed soon!]
|
||||
|
||||
0: Set the PREFIX
|
||||
1: Set the PREFIX
|
||||
-----------------
|
||||
|
||||
* Change the `PREFIX` in `config.mk`. The default is to install in
|
||||
@ -30,7 +31,7 @@ Make sure that:
|
||||
* `$PREFIX/lib` is in your `LD_LIBRARY_PATH` or `DYLD_LIBRARY_PATH` if on
|
||||
`macOS` (so that the system knows where to look for library support code)
|
||||
|
||||
1a: Installing without an existing Idris 2
|
||||
2: Installing without an existing Idris 2
|
||||
------------------------------------------
|
||||
|
||||
If you *don't* have Idris-2-in-Idris-1 installed, you can build from pre-built
|
||||
@ -54,27 +55,26 @@ If all is well, to install, type:
|
||||
|
||||
* `make install`
|
||||
|
||||
1b: Installing with an existing Idris 2
|
||||
---------------------------------------
|
||||
(Alternative 2: Installing with an existing Idris 2)
|
||||
----------------------------------------------------
|
||||
|
||||
If you have Idris-2-in-Idris-1 installed:
|
||||
If you have [Idris-2-in-Idris-1](https://github.com/edwinb/Idris2-boot)
|
||||
installed:
|
||||
|
||||
* `make all && make install`
|
||||
|
||||
2: Self-hosting step
|
||||
--------------------
|
||||
3: (Optional) Self-hosting step
|
||||
-------------------------------
|
||||
|
||||
Then, to build from the newly installed `idris2sh`, assuming that `idris2sh`
|
||||
is in your `PATH`.
|
||||
As a final step, you can rebuild from the newly installed Idris 2 to verify
|
||||
that everything has worked correctly. Assuming that `idris2sh` is in your
|
||||
`PATH`.
|
||||
|
||||
* `make clean` -- to make sure you're building everything with the new version
|
||||
* `make all IDRIS2_BOOT=idris2sh && make install`
|
||||
|
||||
For amusement, try using `time` on the above. I get about 3m for installing
|
||||
from `idris2`, and about 1m45 for installing from `idris2sh`.
|
||||
|
||||
3: Testing
|
||||
----------
|
||||
4: Running tests
|
||||
----------------
|
||||
|
||||
After `make all`, type `make test` to check everything works. This uses the
|
||||
executable in `./build/exec`.
|
||||
|
32
LICENSE
Normal file
32
LICENSE
Normal file
@ -0,0 +1,32 @@
|
||||
Copyright (c) 2020 Edwin Brady
|
||||
School of Computer Science, University of St Andrews
|
||||
All rights reserved.
|
||||
|
||||
This code is derived from software written by Edwin Brady
|
||||
(ecb10@st-andrews.ac.uk).
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. None of the names of the copyright holders may be used to endorse
|
||||
or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*** End of disclaimer. ***
|
99
README.md
99
README.md
@ -1,12 +1,95 @@
|
||||
Self-hosted Idris 2
|
||||
-------------------
|
||||
Idris 2
|
||||
=======
|
||||
|
||||
It finally happened!
|
||||
[![Build Status](https://travis-ci.org/edwinb/Idris2-SH.svg?branch=master)](https://travis-ci.org/edwinb/Idris2-SH)
|
||||
|
||||
See `INSTALL.md` for installation instructions.
|
||||
[Idris 2](https://idris-lang.org/) is a purely functional programming language
|
||||
with first class types.
|
||||
|
||||
There are no guarantees: This repository might move or be renamed or deleted or
|
||||
anything at no notice. It will eventually turn into the real Idris 2
|
||||
repository, one way or another.
|
||||
For full installation instructions, see [INSTALL.md](INSTALL.md). Briefly, if
|
||||
you have Chez Scheme installed, with the executable name `chez`, type:
|
||||
|
||||
Good luck :)
|
||||
* `make bootstrap SCHEME=chez`
|
||||
* `make install`
|
||||
|
||||
You may need to change `chez` to be the local name of your Chez Scheme. This
|
||||
is often one of `scheme`, `chezscheme` or `chezscheme9.5` (depending on the
|
||||
version). On a modern desktop machine, this process should take no more than
|
||||
2 or 3 minutes.
|
||||
|
||||
Idris 2 is mostly backwards compatible with Idris 1, with some minor
|
||||
exceptions. The most notable user visible differences, which might cause Idris
|
||||
1 programs to fail to type check, are:
|
||||
|
||||
+ Unbound implicit arguments are always erased, so it is a type error to
|
||||
attempt to pattern match on one.
|
||||
+ Simplified resolution of ambiguous names, which might mean you need to
|
||||
explicitly disambiguate more often. As a general rule, Idris 2 will be able
|
||||
to disambiguate between names which have different concrete return types
|
||||
(such as data constructors), or which have different concrete argument
|
||||
types (such as record projections). It may struggle to resolve ambiguities
|
||||
if one name requires an interface to be resolved.
|
||||
+ Minor differences in the meaning of export modifiers `private`, `export`,
|
||||
and `public export`, which now refer to visibility of names from other
|
||||
*namespaces* rather than visibility from other *files*.
|
||||
+ Module names must match the filename in which they are defined (unless
|
||||
the module's name is "Main").
|
||||
+ Anything which uses a `%language` pragma in Idris 1 is likely to be different.
|
||||
Notably, elaborator reflection will exist, but most likely in a slightly
|
||||
different form because the internal details of the elaborator are different.
|
||||
+ The `Prelude` is much smaller (and easier to replace with an alternative).
|
||||
+ `let x = val in e` no longer computes with `x` in `e`, instead being
|
||||
essentially equivalent to `(\x => e) val`. This is to make the
|
||||
behaviour of `let` consistent in the presence of `case` and `with` (where
|
||||
it is hard to push the computation inside the `case`/`with` efficiently).
|
||||
Instead, you can define functions locally with `let`, which do have
|
||||
computational force, as follows:
|
||||
|
||||
let x : ?
|
||||
x = val in
|
||||
e
|
||||
|
||||
Watch this space for more details and the rationale for the changes, as I
|
||||
get around to writing it...
|
||||
|
||||
Summary of new features:
|
||||
|
||||
+ A core language based on "Quantitative Type Theory" which allows explicit
|
||||
annotation of erased types, and linear types.
|
||||
+ `let` bindings are now more expressive, and can be used to define pattern
|
||||
matching functions locally.
|
||||
+ Names which are in scope in a type are also always in scope in the body of
|
||||
the corresponding definition.
|
||||
+ Better inference. Holes are global to a source file, rather than local to
|
||||
a definition, meaning that some holes can be left in function types to be
|
||||
inferred by the type checker. This also gives better inference for the types
|
||||
of `case` expressions, and means fewer annotations are needed in interface
|
||||
declarations.
|
||||
+ Better type checker implementation which minimises the need for compile
|
||||
time evaluation.
|
||||
+ New Chez Scheme based back end which both compiles and runs faster than the
|
||||
default Idris 1 back end. (Also, optionally, Racket and Gambit can be used
|
||||
as targets).
|
||||
+ Everything works faster :).
|
||||
|
||||
A significant change in the implementation is that there is an intermediate
|
||||
language `TTImp`, which is essentially a desugared Idris, and is cleanly
|
||||
separated from the high level language which means it is potentially usable
|
||||
as a core language for other high level syntaxes.
|
||||
|
||||
Things still missing
|
||||
====================
|
||||
|
||||
+ Disambiguation via 'with'
|
||||
+ Cumulativity (so we currently have Type : Type! Bear that in mind when you
|
||||
think you've proved something :))
|
||||
+ 'rewrite' doesn't yet work on dependent types
|
||||
+ Parts of the ide-mode, particularly syntax highlighting
|
||||
+ Documentation strings and HTML documentation generation
|
||||
+ ':search' and ':apropos' at the REPL
|
||||
+ Metaprogramming (reflection, partial evaluation)
|
||||
|
||||
Talks
|
||||
=====
|
||||
|
||||
[![Idris 2 - Type-driven Development of Idris (Curry On - London 2019)](https://img.youtube.com/vi/DRq2NgeFcO0/0.jpg)](https://www.youtube.com/watch?v=DRq2NgeFcO0 "Idris 2 - Type-driven Development of Idris (Curry On - London 2019)")
|
||||
|
Loading…
Reference in New Issue
Block a user