Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/owaismohsin001/czariscript
A functional/OO programming language with global subtype inference
https://github.com/owaismohsin001/czariscript
inheritance prototypes structural-types subtype subtype-inference type-inference
Last synced: 15 days ago
JSON representation
A functional/OO programming language with global subtype inference
- Host: GitHub
- URL: https://github.com/owaismohsin001/czariscript
- Owner: owaismohsin001
- License: mit
- Created: 2022-02-03T16:08:28.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-04-07T15:08:58.000Z (over 2 years ago)
- Last Synced: 2024-09-11T12:34:30.655Z (3 months ago)
- Topics: inheritance, prototypes, structural-types, subtype, subtype-inference, type-inference
- Language: TypeScript
- Homepage:
- Size: 364 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# CzariScript
The CzariScript has a type system that supports subtype inference with parametric polymorphism, classes, objects, and single inheritance. It compiles to JavaScript and the output runs in the browser, and deno.## Structure of CzariScript
A CzariScript program contains a sequence of definitions, and expressions separated by semicolons. The definitions are all evaluated before expressions. Here's an example of a CzariScript program.
```
x = 1;
y = "abc";
println x;
```## Literals
CzariScript has all the literal you would expect from a language of its kind. Here are the literals this language supports `1`, `"ABC"`, `true`, `false`, tuples, and records.## If statements
```
if x then "a" else "b"
```
This does what you think it does, but the most important part is that you can have different types in the then-expression and else-expression. This would theoretically work like this.
```
if x then 1 else "a"
```## Functions
Functions can be defined by using a lambda like such `\x -> x` but a named function may also be defined like such `f x = x`. All functions in CzariScript take one argument and return one result but functions are automatically curried. Here's an example `f x y = x + y` which just `f = \x -> \y -> x + y`.## Applications
Functions can be applied like such `f 1 2` which of course only works for curried functions. In this particular example, this code would return `3` where `f x y = x + y`## Records
Records and Tuples are one and same in CzariScript, and you may use the following syntax for them. `{a: 3, b: 4}` which defines a record with fields `a`, and `b` having values `3`, and `4` respectively, while `{1, 3}` defines a record with fields `0`, and `1` with values `1`, and `3`, which is a tuple as far as the compiler is concerned. For syntactical convenience, it may be written as `(1, 3)`.## Record inheritance
A record can inherit from another record, here's an example.
```
obj = {a: 3}
objExtended = {b: 2 with obj}
```## Classes
Following is how you define classes
```
objC = class n so
x = n;
end;
```Here the class takes one argument named `n` and returns a record with fields `{x: n}`. You define a method like this
```
getX self n = self.x + n
```
which can be called like such `obj:getX 2`. Classes may also define static methods as such
```
static fromNothing _ = objC.new 0
```## Class Inheritance
Classes can inherit from other classes both on the object and the class level. Here's how inheritance works
```
class n with textC::textC.new "Hello"...
```
Here the `textC` before `::` shows what to inherit from, on the class level, and the expression after the `::` shows what to inherit at the object level, in this case, it is the same thing.## Let & Where
`let` and `where` both define some value that goes through the process of Let-generalisation but the difference between them is that the latter allows recursive definition while the former does not. The syntax for `let` is
```
let f x = x*2 in f 10
```
while the syntax of `where` is
```
fac 10 where fac n = if n = 1 then 1 else n*fac(n-1)
```## A series of actions
CzariScript like OCaml is anything but a pure language so you do need to perform multiple actions in a definition and here's how you'd do that.
```
let something = do
println "Hello!";
let name = "Name"
println ("How are you " & name & "?")
end
```One of the primary use-cases of this is when you deal with a mutable reference.
## References
A reference in CzariScript is something that can be mutated from any function in the codebase. You can create with syntax inspired by Pascal style reference with `@expression`, dereference with `expression^`, and assignment with `expression ^= another_expression`.## Module System
Here's the simple module system of CzariScript. You can import files with `import FileName` where the name should be specified with a capital letter in the beginning. These modules may export their definitions with the syntax of `export {x: something, y: anotherThing}` or `export {something, anotherThing}`.