Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kevindasilvas/klang
Klang is a strongly typed, with type inference, imperative and immutable programming language that transpiles to js.
https://github.com/kevindasilvas/klang
compiler compilers haskell javascript klang programming-language programming-languages transpiler
Last synced: 17 days ago
JSON representation
Klang is a strongly typed, with type inference, imperative and immutable programming language that transpiles to js.
- Host: GitHub
- URL: https://github.com/kevindasilvas/klang
- Owner: KevinDaSilvaS
- License: bsd-3-clause
- Created: 2021-09-12T15:18:03.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2021-09-17T21:45:50.000Z (about 3 years ago)
- Last Synced: 2024-10-10T02:59:08.289Z (28 days ago)
- Topics: compiler, compilers, haskell, javascript, klang, programming-language, programming-languages, transpiler
- Language: Haskell
- Homepage:
- Size: 55.7 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: ChangeLog.md
- License: LICENSE
Awesome Lists containing this project
README
# klang
Klang is a strong typed, with type inference, imperative and immutable programming language that transpiles to js.
Klang stands for not only the pokemon but the group of two words ```K```(Initial of the creator of the language Kevin da Silva) and ```lang``` for the word language.
Inspired by languages like Haskell, Javascript, python and tiger. Klang is written in haskell and can be run on the browser by compiling into js.## Features
- Immutability: all variables in klang should start with the '_'(_validVariable) symbol and cant change their state
- Only change of state occurs in runtime and only the loop iterator changes its state
- Klang supports two kinds of types: Integers and Strings
- Klang is a strong typed language that uses from type inference to infer type into the expression
- Like in haskell ifs can only compare with same type like: Integer == Integer or String == String. Supported comparative operators(==, !=, >, <, >=, <=)
- Arithmetic expressions(+, -, *, /) are supported for integers
- Strings are double quoted: "valid string"
- Output is done by: show _myVariable
- Input is done like _readLine for string values and _readNum for integers
- Loops are made using the routine keyword
- Klang has no {} or () to create an execution block you have to use ':' (to open) and ';'(to close)### Valid Klang code
```
let _v_ := 132
let _hi := "Hi "let _name := _readLine
let _inputInt := _readNum + 3 + 5show _inputInt * 2
routine 10 :
show _hi
show _name
show _GET_CURR_INDEXlet _VAR := 3
show _VARif _GET_CURR_INDEX > 5 :
show "index is greater than 5"
;
;
```### Generates the following output:
```
const _v_ = 132
const _hi = "Hi "
const _name = prompt("Please enter a valid string")const _inputInt = parseInt(prompt("Please enter a valid integer")) + 3 + 5
console.log( _inputInt * 2 )
for (let _GET_CURR_INDEX = 0; _GET_CURR_INDEX < ( 10 ); _GET_CURR_INDEX++) {
console.log( _hi )
console.log( _name )
console.log( _GET_CURR_INDEX )
const _VAR = 3
console.log( _VAR )
if (( _GET_CURR_INDEX ) > ( 5 )) {
console.log( "index is greater than 5" )
}
}```
### Getting Started- First clone the project.
- build the project (klang compiler is done in haskell so i recommend using stack by just typing ```stack build```).
- create a file .klang
- write the following on the file ```show "hello world"```
- copy the path
- on terminal run ``` stack run $YOUR_COPIED_FILEPATH```
- If successful a file of same name with the extension .js will appear on your klang project folder
- If an error occurs the compiler will give you an output with the possible reason of the error in red## DOCS KLANG
### Variables
In klang all variables are constants and must start with the '_'(underscore) symbol, that means you cant change the value of a variable in your program.
Variables must be followed of: ``` ```
Valid variable Assignment:
```
let _myVar := 123
let _VARIABLE := "_VARIABLE IS A CONSTANT"
let _another_one := _VARIABLE
let _Calculations := _myVar + 2 * 3
let _v1 := 123 //outputs an error variable names should start with '_' and then be followed by only [A-Za-z_] characters
let _myVar := _VARIABLE //outputs an error constants can be declared only once in your program
```### Ifs
In klang if statements can contain only one logical expression per if. Ifs in klang support the current comparative operators> >, <, >=, <=, !=, and ==.
If statements must be like: ``` ```
Valid if statements:
```
let _myVar := 123
let _foo := 45if _myVar > _foo :
...code here
;if 200 < _foo :
...code here
;if "hi" == "HI" :
...code here
;
```### Loops
In klang loops receive an integer as iterator and the current iteration can be accessed by the ```_GET_CURR_INDEX``` reserved variable.
Loops in klang are like the following: ``` ```
Valid loops:
```
let _myIterator := 5routine _myIterator :
...code here
;routine 10 :
...code here
;routine _myIterator * 2 :
show _GET_CURR_INDEX // _GET_CURR_INDEX RECEIVES THE CURRENT INDEX VALUE FROM ZERO TO MAX-1 LIKE THE i in a for loop
...code here
;show _GET_CURR_INDEX // OUTSIDE ROUTINE _GET_CURR_INDEX VALUE IS 1, _GET_CURR_INDEX CHANGES ITSELF ONLY INSIDE THE LOOP OUTSIDE IS RESERVED AS THE VALUE 1
```
### Output
Output messages in klang can be done just by using the show keyword
```
show 3 + 4 * 6
show "Hello World"
```### Input
Klang has an input detection for integers and strings. _readNum and _readLine especifically. Like the _GET_CURR_INDEX the _readNum is also an immutable variable that used out of the context o input in runtime has default value of 1 and _readLine has a default value of "" out of the input context.
```
show _readNum + 4 * 6
let r := _readNum
routine _readNum :
show _readLine
;
```