UNPKG

derw

Version:

An Elm-inspired language that transpiles to TypeScript

473 lines (360 loc) 8.65 kB
# Language features These are features that Derw has today. For examples on how to use them, check out the [docs](https://docs.derw-lang.com/). - [x] Arrays `[ ]`, `[ 1, 2, 3 ]`, `[ [ 1, 2, 3 ], [ 3, 2, 1 ] ]` - [x] Booleans `true`, `false` - [x] Boolean equality `1 < 2`, `1 <= 2`, `1 == 2`, `1 != 2`, `1 > 2`, `1 >= 2` - [x] Boolean operations `true && false`, `not true`, `true || false` - [x] Strings `""`, `"hello world"` - [x] Format strings ` `` `, `` `Hello ${name}` `` - [x] Numbers `-1`, `0`, `1`, `-1.1`, `1.1` - [x] Addition `1 + 2`, `"Hello" + name` - [x] Subtraction `2 - 1` - [x] Multiplication `2 * 1` - [x] Division `2 / 1` - [x] Pipe `[1, 2, 3] |> List.fold add`, `List.fold add <| [1, 2, 3]` - [ ] Compose `>>`, `<<` - [x] Constants `hello = "hello world"` - [x] Function definitions - [x] Lists `[ 1, 2, 3 ]`, `[ "hello", "world" ]` - [x] List ranges `[ 1..5 ]`, `[ start..end ]` ```elm add : number -> number -> number add x y = x + y ``` - [x] Function calls ```elm three = add 1 2 ``` - [x] Module references ```elm three = List.map identity [ 1, 2, 3 ] ``` - [x] Union types ```elm type Result a b = Err { error: a } | Ok { value: b } ``` - [x] Type variables ``` type Thing a = Thing a ``` - [x] Type aliases ```elm type alias User = { name: string } ``` - [x] Object literals ```elm user: User user = { name: "Noah" } ``` - [x] Object literals updates ```elm user: User user = { ...noah, name: "Noah" } ``` - [x] Imports ```elm import List import Result exposing ( map ) import something as banana ``` - [x] Exports ```elm exposing ( map ) ``` - [x] Let statements ```elm sayHiTo : User -> string sayHiTo user = let name = user.name in "Hello " + name sayHelloTo : User -> string sayHelloTo user = let getName: User -> string getName user = user.name in "Hello" + getName user ``` - [x] If statements ```elm type Animal = Animal { age: number } sayHiTo : Animal -> string sayHiTo animal = if animal.age == 1 of "Hello little one!" else "You're old" ``` - [x] Case..of ```elm type Animal = Dog | Cat sayHiTo : Animal -> string sayHiTo animal = case animal of Dog -> "Hi dog!" Cat -> "Hi cat!" ``` - [x] Destructing in case..of ```elm type User = User { name: string } sayHiTo : User -> string sayHiTo user = case user of User { name } -> "Hi " + name + !" ``` - [x] strings in case..of - [x] defaults in case..of ```elm sayHiTo : string -> string sayHiTo name = case name of "Noah" -> "Hi " + name + !" default: "I don't know you" ``` - [x] List destructing ```elm sum: List number -> number sum xs = case xs of [] -> 0 y :: ys :: [] -> y + ys z :: zs -> z + sum zs default -> 0 ``` - [x] List destructing with string values ```elm sum: List string -> number sum xs = case xs of [] -> 0 "1" :: ys :: [] -> 1 + 2 "2" :: zs -> 2 + sum zs default -> 0 ``` - [x] List destructing with union types values ```elm sum: List (Maybe number) -> number sum xs = case xs of [] -> 0 Just { value } :: rest -> value + sum rest Nothing :: rest -> sum rest default -> 0 ``` - [x] Constructing union types ```elm type User = User { name: string } noah = User { name: "Noah" } ``` - [x] Accessors ```elm type alias User = { name: string } names = List.map .name [ { name: "Noah" }, { name: "Dave" } ] ``` - [ ] Nested accessors ```elm type alias Group = { person: { name: string } } names = List.map .person.name [ { person: { name: "Noah" } }, { person: { name: "Dave" } } ] ``` - [x] Errors on type name collison ````markdown The name `Person` has been used for different things. 8 - 10: ``` type Person = Person { name: string } ``` 11 - 14: ``` type alias Person = { name: string } ``` ```` - [x] Errors on function name collison ````markdown The name `isTrue` has been used for different things. 0 - 3: ``` isTrue: boolean -> boolean isTrue x = x == true ``` 4 - 7: ``` isTrue: boolean -> boolean isTrue x = x != true ``` ```` - [x] Some form of basic type errors ````markdown Failed to parse examples/errors/mismatching_types.derw due to: Error on lines 0 - 3 Expected `boolean` but got `number` in the body of the function: ``` isTrue: boolean -> boolean isTrue x = 1 + 2 ``` Error on lines 4 - 7 Expected `List string` but got `List number`: ``` names: List string names = [1..2] ``` ```` - [x] lambdas `\x -> x + 1`, `\x y -> x + y` - [x] Typescript output - [x] Javscript output - [x] Elm output - [x] Module resolution - [x] CLI - [x] Basic type checking - [x] Detect if types exist in current namespace - [x] Syntax highlighting for editors - [x] Collision detection for names in a module - [x] Importing of Derw files ```elm import "./other" import "./something" as banana import "./another" exposing ( isTrue, isFalse ) import "./Maybe" as Maybe exposing (Maybe) ``` - [x] Errors when failing to find relative import ``` Warning! Failed to find `examples/derw_imports/banana` as either derw, ts or js ``` - [x] Single line comments ```elm -- hello isTrue: boolean -> boolean isTrue x = x ``` - [x] Single line comments in function or const bodies ```elm isTrue: boolean -> boolean isTrue x = -- hello x ``` - [x] Multiline comments ```elm {- hello world -} isTrue: boolean -> boolean isTrue x = x ``` - [x] Function arguments ```elm map: (a -> b) -> a -> b map fn value = fn value ``` - [x] Globals Globals can be accessed through the `globalThis` module which is imported into every namespace. E.g `globalThis.console.log` - [x] Constant if statements ```elm name: string name = if 1 == 1 then "Noah" else "James" ``` - [x] Constant case statements ```elm name: string name = case person of "n" -> "Noah" "j" -> "James" default -> "Other" ``` - [x] List prepend ```elm numbers: List number numbers = 1 :: [ 2, 3 ] ``` ## 1.0.0 - [x] An automatic formatter with no options ``` derw format ``` - [ ] A standard library - [x] Support for [Coed](https://github.com/eeue56/coed) Use [html](https://github.com/derw-lang/html) - [x] Testing support via [Bach](https://github.com/eeue56/bach) Write a file with `_test` as an extension (e.g `List_test.derw`). ```elm import Test exposing (equals) testMath: boolean -> void testMath a? = equals 1 1 ``` Compile it, then run bach via `npx @eeue56/bach` - [x] Type checking - [x] Benchmarking support via [Mainc](https://github.com/eeue56/mainc) - [ ] Async support - [x] Packaging - [x] Package init ``` derw init ``` - [x] Package testing ``` # inside a package directory derw test ``` - [x] Compile a package ``` derw compile ``` - [x] Install a package ``` derw install --name derw-lang/stdlib --version main ``` - [x] An info command to find out stats about modules ``` derw init ``` - [x] A repl ``` derw repl ``` - [x] Bundling ``` derw bundle --entry src/Main.derw --output dist/index.js --watch --quiet ``` - [x] English output ``` derw compile --target english ``` - [x] Template generation ``` derw template --path src/Main.derw --template web ``` - [x] Do notation ```elm sayHi: string -> void sayHi name = do globalThis.console.log "Hello" name return undefined ``` # 2.0.0 - [ ] Time travelling debugger - [ ] Type checking with interop with TypeScript - [ ] Derw compiler is written in Derw