summaryrefslogtreecommitdiff
path: root/comp/cw/overview
diff options
context:
space:
mode:
Diffstat (limited to 'comp/cw/overview')
-rw-r--r--comp/cw/overview302
1 files changed, 0 insertions, 302 deletions
diff --git a/comp/cw/overview b/comp/cw/overview
deleted file mode 100644
index 5f7904e..0000000
--- a/comp/cw/overview
+++ /dev/null
@@ -1,302 +0,0 @@
-CS course work project
-
-zippy - a high level functional programing language
-
-zippy will be an interpreted language designed to replace C in higher level use
-C is used largely to write most of the unix desktop, however c can be difficult
-when writing larger programs, and is missing moddern features like oop or
-functional patterns (higher order functions)
-
-requirents:
- - must be human readable, even a non programmer should be able to figure
- out what a program is doing
- - faster than competion, other languages that have tried to slot into
- this position like python are far to slow, and thus it must be faster
- - low runtime overhead, the interpreter should be small, it shouldn't
- force the developer to think about how the interpreter works to use it
- efficently
- - have moddern tools, a pkg manager and enviroment manager, making it
- easy to develop for
- - needs to support c libarys
-
-language info
-
-zippy will use function programming as a primary solution, however also support
-simple oop, with classes (no inheritence)
-its syntax will be comparable to lisp, with prolific use of "()"
-it will need a stdlib, which can be taken from C's stdlib
-
-types:
-
- char - just like a c char
- i32 - 32 bit signed int
- f32 - 32 bit signed float
- u32 - unsigned 32 bit int
- i16- 16 bit signed int
- u16 - 16 bit unsigned int
- bool - TRUE/FALSE
-
-
- arrays:
-
- arrays can be created like so
- (let arr[]:char "hello there")
- (let arr[]:i32 1 2 3)
-
- all arrays are linked lists of there data type
- their size is not fixed
-
- you can get, or set the value of an array at a specific index using
- arr[index]
-
- strings:
-
- strings are arrays of chars
- a string can be defined by a litteral like so
- "hello world" - this is the same as 'h' 'e' 'l'....
- because this is represented as a linked list there is no need to have a
- NULL terminator like in c, the end of the string is jus the point where the
- linked list has no more nodes
-
-comments:
-
- comments can be writen like so
- ! this is a comment
-
-indentation and spacing:
-
- indentation and new lines arent at all necesary
- any new lines will be converted to spaces, and tabs will be removed
- the only place that needs spaces is when calling a function and giving its args
-
-scopes:
-
- () can be placed anywhere, and anything that is in them is in there own scope
- as soon as the bracket is closed, any variables defined in the scope
- will be deleted
- any scope inherets all variables and functions from the scope that contains it
- code writen in the main body of the file can be imagined like so
- (
- ...
- ...
- ...
- your code
- ...
- ...
- ...
- )
- however that level of indentation is not needed
-
- this can be helpful if you want to have two scopes with different imports
- (
- (import z)
- (
- (import x)
- ! anything writen here has access to libary x and z
- )
- (
- (import y)
- ! anything writen here has access to libary y and z
- )
- ! anything writen here has access to libary z
- )
-
-libarys:
-
- libarys are similar to header files in c
- when imported the user can use any function contained within the file
-
- it would be good practice to put your libary in a struct to avoid functions with the
- same names coming from 2 libarys, however its not needed
-
-errors:
-
- errors would be
-
-keywords:
-
- (defun arg1:type arg2:type returnType
- ...
- ...
- ...
- )
- defines a function, can be done anywhere in the program, all functions
- must return a value, return type and arguments must be known at runtime
-
- returns the function that can be asigned with let
-
- (return VALUE)
- returns VALUE from a function, VALUE must be of the same tupe as returnType
- in defun
-
- (for x a b function)
-
- runs the function inside the loop, x will be increment by 1 each iteration and
- it will have a starting value of a running until it reaches b (inclusive)
- x cant be changed in any way other than the for loop
- x, a, b are all of type i32
-
- (while condtion function)
-
- runs all code inside the loop until the condion is not TRUE
- condition must be a bool (TRUE/FALSE)
-
- (let name:type value)
-
- assign value to variable name, this will create the variable if it doesn't already
- exist, and overwrite it if it does
- names type must be defined by type
-
- (const name:type value)
-
- same as let but creates an imutable variable
-
- (import libary)
-
- searches the libary dir and imports the libary to the current project
- libary can also be a specific path if it starts with / or ./ or ../
-
- (struct name
- ...
- ...
- ...
- (defun init arg1:type type
- ...
- ...
- ...
- )
- (defun deinit arg1:type type
- ...
- ...
- ...
- )
- )
-
- structs can be used as a custom data type
- creates a struct/class called name, functions called init will be ran when an
- object is created
- when deinit is called the code init will be ran, then the object will be deleted
- if deinit is not defined it can still be called to delete the instace of the class
-
- you can create a struct like so:
- (let mystruct:name (name.init arg1 arg2))
-
- you can call a method attached to an instace of a struct like this:
- (mystruct.method arg1 arg2)
-
- and to destroy it you can just use this:
- (mystruct.deinit arg1 arg2)
-
- structs can be recursive
- eg:
- (struct node
- (defun init next:node
- (let next:node next)
- )
- )
-
- a struct can have default values
- eg:
- (struct person
- (let age:i32 50)
- (let name[]:char "john doe")
- ...
- ...
- ...
- )
-
- this will make the struct have default values
-
- overall in simple terms structs are just like c structs but they can contain
- functions
-
- (symbol arg1:type arg2:type returntype location)
-
- returns a function that can be called. the function is retrieved from a .o file
- which can be writen in C, the args, should be the args that the function takes in
- and there types
- the interpreter will try to convert data to the equal type in C, however this may need
- to be done manually
- the location should be a string which is is the file path to the .o file
-
- (if condition
- ...
- ...
- ...
- )(elif condition
- ...
- ...
- ...
- )(else
- ...
- ...
- ...
- )
-
- simple if statment, if condition is TRUE run the code inside, elif runs if the condition in it
- is TRUE and if the previous has not been TRUE
- else will run if nothing else is TRUE
-
- (cast TYPE variable)
-
- returns a variable casted to type TYPE, if type is function, will return a function with no args
- that returns the variable value in its starting type
-
- conditions:
- (= a b) returns TRUE if a is equal to be (works with arrays)
- (!= a b) returns TRUE if a is not equal to be (works with arrays)
- (> a b) returns TRUE if a > b (does not work with arrays)
- (< a b) returns TRUE if a < b (does not work with arrays)
- (>= a b) returns TRUE if a >= b (does not work with arrays)
- (<= a b) returns TRUE if a <= b (does not work with arrays)
- (! a) returns TRUE if a is FALSE (only works on bools)
- (| a b) returns TRUE if a or b are TRUE (only works on bools)
- (& a b) returns TRUE if a and b are TRUE (only works on bools)
- (^ a b) returns TRUE if a xor b is true (only works on bools)
-
- all these are just functions that can be used to assign values
- eg:
- (let mybool:bool (= a b))
- ! mybool will be TRUE if a = b
-
- mathmatical operations:
- zippy uses reverse polish notation
- (+ a b) returns a + b
- (- a b) returns a - b
- (* a b) returns a * b
- (/ a b) returns a / b, whole number eg: (/ 7 3) = 2
- (/. a b) returns a / b, floating point number eg: (/. 7 3) = 2.5
- (% a b) returns the remander of (/ a b)
- (** a b) returns a ^ b
-
-
-sample code
- (let fib:function (defun num:i32 i32
- (if (< num 2)
- (return num)
- )
- (else
- (return (+ (fib (- num 1)) (fib (- num 2)) ))
- )
- )
- )
- (let a:i32 (fib 5))
- ! returns the 5th fib number
-
-stdlib:
- (import io)
- io contains a few types
- they are:
- (io.file)
- io contains many io related functions
- they are:
-
- (io.write "hello %s\n" name) ! this is very similar to printf in C
- (let input:char[] (io.read))
-
- (let file:io.file (io.open path[]:char "method"))
-
- (io.fwrite file:io.file "hello %s" name)
- (let file[]:char (io.fread file:io.file))
- (let line[]:char (io.freadline file:io.file lineno:i32))
-