~jojo/Carth

ref: ebd61e146dcfc2ff4105be3199c8d63efe0b6f00 Carth/src/Err.hs -rw-r--r-- 4.9 KiB
Remove transmute size checking from Gen

since we do that using type class in Infer now!
(mostly) implement checking of same size for transmute in Infer

Preferably, all kinds of checking should happen as early as possible,
so we don't have to remember tons of polluting SrcPos:s in the AST for
later stages. This is a big step in removing positioning from Codegen.

Also, this lays much of the groundwork for supporting typeclasses more
generally!

The implementation is not quite correct/done though. Indeed, it
rejects transmutes for a pair of monotypes not of the same size, but
the inferring and scheme creating is a little broken. See
~test/tests/bad/transmute-size-mismatch2.carth~.
Update stackage release & use default-extensions in cabal file

Also, fix some minor breakages caused by ghc update, fix the
literate.org example, fix some new warnings, and get rid of the need
for a bunch of Data implementations by using basic parsing functions
in SystemSpec.hs.
Include macro expansion trace in SrcPos. Better err msgs!

    POS1: Error:
      CODE
    MESSAGE

    POS2: Note:
      CODE
    In expansion of macro.
Add primitive, single pattern macros

E.g. `(defmacro (plus a b) (+ a b))`
Make parser act on token trees instead of chars
Replace Parse.parseTokenTreeOrRest with Lex.tokentree in Err
Fix typo in GenErr variant (NoBulitin... -> NoBuiltin...)
Define carth type literals only once in TypeAst

Like mainType, tUnit, etc. Use the class TypeAst to allow them to
construct any Type, e.g. Parsed.Type.
Add builtin virtual `cast` to cast between all primitive num types

So between integers of different sizes, from float to int, and from
int to float. Also almost accidentally includes casting to and from
enums, as they are seen as integers at the time the types are fully
checked in genCast.
Positioned error msgs instead of ICE for bad inst of builtin virtual
Change formatting: 90 cols, IndentPolicyFree, etc. Add brittany.yaml

Most people have pretty wide and high res screens at this point. I
can't fit two windows with 100 line length next to eachother with my
font size, but 90 works and most people have smaller font size than me
I think.

Also, change brittanys indentation policy to Free. This almost always
looks better. I just had to disable formatting of imports -- I don't
want to align those, but IndentationPolicyFree insists.

Finally, actually add a project-local brittany config file, so that
anyone (or me in the future / on another computer) can use the same
formatting rules.
Add `transmute` special form

Use to change the type of an expression without modifying the bits in
any way -- just interpret them as if they represented the new type.

Example:
    (: (transmute (: 4623716258932001341 Int)) F64)
results in
    (: 13.37 F64)
Refactor SrcPos a bit
Rename start to main by mapping "main" to "_main" in mangleName

I tried having the carth-level entrypoint be called "main" before, but
it didn't work out since I tried having it compile to "main", and then
add a wrapping main that compiled to something like "outer_main", and
then redefine the entrypoint to "outer_main" when calling clang. That
was messy due to startfiles-related issues, but this way of simply
mapping "main" to "_main" via mangleName seems to work really well!
Improve module names. Ast -> Parsed, AnnotAst -> Inferred, and more
Check user-written types in Infer

Basically, do `checkType` for user-written types. It detects
references to undefined types. Also, separete AnnotAst.Type from
Ast.Type to help enforce that this is done. This whole ordeal required
some refactoring.
Simplify error-region parsing in TypeErr using tokenTree everywhere
Remove not-really-needed deps llvm-hs-pretty & prettyprinter

They weren't unused, but very unimportant. We can do things in a very
slightly worse way if it means simplifying our dependency graph!
Add error for duplicate var defs at top-level and in let
Next