summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/writeup/t support the usage of higher order functions, this will mean the
diff options
context:
space:
mode:
Diffstat (limited to 'comp/lucas-standen-NEA/writeup/t support the usage of higher order functions, this will mean the')
-rw-r--r--comp/lucas-standen-NEA/writeup/t support the usage of higher order functions, this will mean the1208
1 files changed, 1208 insertions, 0 deletions
diff --git a/comp/lucas-standen-NEA/writeup/t support the usage of higher order functions, this will mean the b/comp/lucas-standen-NEA/writeup/t support the usage of higher order functions, this will mean the
new file mode 100644
index 0000000..e18f9c0
--- /dev/null
+++ b/comp/lucas-standen-NEA/writeup/t support the usage of higher order functions, this will mean the
@@ -0,0 +1,1208 @@
+.TL
+The solution To bad code
+.AU
+Lucas Standen
+.AI
+7949
+.AB
+
+.NH 1
+Reading this document
+.LP
+This document is writen in roff and can be found online at:
+
+https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/writeup
+
+It is using the ms macro of troff. It can be compiled using the Makefile,
+or make.sh. A table of
+contents has been generated using pdftocgen, it is embedded into the pdf,
+most pdf readers have
+a button to open it (firefox has it in the top left, in zathura press tab
+to view it).
+
+A note on formating of the roff, the text is limited to 80 characters per
+line and is writen in
+plain ascii, no utf8 emojis and the like. Code snippets are left in plain
+text, while full files
+are converted to a ps file via https://carbon.now.sh/ they should be 150mm ^
+2 (as ps is a vector
+format this wont lower quality, you might need to zoom in though) and then
+have there source linked
+above them; assuming they are from a file and not a small example.
+
+.NH 1
+Analysis
+.NH 2
+The current problem
+.LP
+For general small and simple projects, I write in C. However this leads to
+hours of debugging due to
+segfaults, and memory leaks. Due to the languages manual memory management
+the programmer is
+required to know so much information about the hardware they write for,
+and the second anything goes
+wrong, it is vague on how to fix things.
+
+.B "I need a language that stops me from shooting myself in the foot"
+
+C has been standard for many decades now and its age is showing, it lacks
+many modern features like
+OOP, or higher level functional abstractions, that have become common in
+modern years due to there
+helpfulness. This is not to fault C's achievements either, the language is
+my personal choice for
+most projects for a reason, it's fast and powerful; any solution I make
+should not cut that away.
+
+.NH 2
+A solution
+.LP
+.BI "Zippy LANG"
+
+A next generation language, for general use. Designed for keeping code simple,
+neat and readable.
+It will be similar to functional languages, known for there strict ability
+to keep code safe and
+practical. The language should be interpreted like python, perl and lisp,
+to allow for easy
+debugging tools.
+
+The goal of Zippy is to make codding easier, while remaining fast, with a
+interpreter writen in C.
+
+.NH 2
+What is a programming language
+.NH 3
+A very simple explanation
+.LP
+At its lowest definition a PL is a set of specific words, that when given
+to a computer in the
+right order have a reproducible behaviour. A more human way of saying that,
+would be its how we
+control computers.
+.NH 3
+Why are there so many
+.LP
+When someone is looking at code it can often be seen as just that, however
+there are hundreds of
+languages that all take the idea of "code" in very different ways. Some are
+designed for specific
+hardware, some are designed for making general use programs while others
+are highly specialized.
+It is important to see "code", as more than just one overarching term and
+instead see where the code
+is being used, and evaluate it from that.
+
+
+.NH 2
+Researching, and getting a scope of the project
+.LP
+Before I start to design a language i should first find examples of others
+and find what i want my
+language to be like.
+
+I'd like my language to feel modern so i should take inspiration from what
+other modern languages
+do, however on the backed i want my language to be stable and fast, for that
+i should look at
+older projects.
+
+.NH 3
+Examples of older similar projects, that are a good base for my language
+.NH 4
+Python
+.LP
+Python is a high level OOP language that was designed in 1991. It was made
+to make programming easy
+while still being able to use some of C's functions. Although it has become
+standard for many use
+cases, it is slow and inefficient, and very bloated.
+
+https://www.python.org/
+
+Zippy should take pythons high level abstractions, as they make programming
+very easy and it should
+try and take notes from its libraries as they are mostly well written,
+and well documented.
+.NH 4
+Lisp
+.LP
+Lisp is the second ever programming language, developed at MiT, it is the
+first functional language,
+creating many common features like higher order functions, recursion, and
+garbage collection. It is
+generally not used any more as it feels old compared to other functional
+languages, like Ocaml or
+Haskell.
+
+https://lisp-lang.org/
+
+Zippy should try to take alot from the syntax of lisp, () make it easy to
+see what parts of code
+will effect what, and make things easy to parse.
+.NH 4
+Perl
+.LP
+Perl is scripting language designed for use in linux, when bash is too slow,
+or not suited for the
+job. Perl is often described as the glue of the universe (see xkcd
+https://3d.xkcd.com/224/).
+Its syntax is quite strange however and it is slow. Making it poorly suited
+towards general use.
+
+https://www.perl.org/
+
+Zippy should take from perls minimalism, it is a small language that is of
+a similar size to bash
+or zsh, while feeling closer to python. If Zippy can achieve a similar small
+size, while remaining
+powerful I will be happy.
+
+.NH 3
+Examples of new similar projects that are also a good base
+.NH 4
+Gleam
+.LP
+Gleam is a modern language releasing in the past 5 years. It is highly
+functional, with no mutable
+data, no traditional loops. Instead recursion can be used to replace alot
+of these features.
+Gleam compiles to erlang/Beam bytecode, much like java to the jvm, and doing
+this has made Gleam
+a highly scalable language with good library support out the box.
+
+https://gleam.run/
+
+Zippy should take from the functional elements of Gleam, as they keep programs
+safer, however Zippy
+should not remove all procedural elements, as for loops are very helpful
+.NH 4
+Haskell
+.LP
+Haskell is another modern functional language known for being very complicated,
+however incredibly
+powerful. Its syntax feels very mathematical, and incredibly terse.
+
+https://www.haskell.org/
+
+Perhaps Zippy could learn from Haskell, as it provides functional and
+procedural elements, making it
+a well rounded language
+.NH 4
+Hare
+.LP
+Hare was designed to be a 100 year language, and thus stability is its main
+goal, it is not set to
+have a syntax change any time soon, and it has strong emphasis on memory
+safety. It fits into the
+same part of the tech stack as C, and thus it can be used for some very low
+level work.
+
+https://harelang.org/
+
+I think Zippy should have a strong emphasis on stability, much like Hare,
+to many times have I segfaulted due to a
+tiny mistake. Zippy should also look to Hare's small size, you can buy a
+copy of Hare on a
+
+.B "SINGLE 3 1/2'' FLOLPY"
+
+.LP
+This is something I too should try to achieve.
+
+.NH 3
+What should be taken away from these languages?
+.LP
+I was already leaning towards functional programming when I started this
+project however now I
+believe it's the only option for producing safe applications. Zippy will be
+a functional language
+with a strong emphasis on recursion.
+
+I also believe that I should take size of the interpreter into account,
+as this is important for
+keeping the project manageable and consistent.
+
+And finally I think that syntax should be inspired by Lisp, although Lisp
+itself can be a messy
+language, with the right changes I am confident that I can make a attractive
+language for the 21st
+century.
+
+.NH 2
+Clients
+.LP
+In a project of this nature, the Client is every programmer alive; which is
+a pretty large scope.
+To narrow this down as much as possible, I will interview a small handful
+of people throughout the
+project, of different skill levels.
+
+.NH 3
+Client 1, Amy C
+.LP
+My first client is a friend of mine, Amy C, she is a confident programmer
+who has completed many
+complicated projects. I am choosing her as a client as she can give me
+technical feed back on my
+project and its function/utility.
+.NH 3
+Client 2, Rayn M
+.LP
+Another friend of mine, Rayn M, is a technical computer user, however he
+does not know how to
+program at a high level. He will be a good client as he can show me how my
+language looks to
+some one who doesn't understand the inside workings, helping me design the
+structure of the code.
+.NH 3
+Client 3, a normie
+.LP
+some stuff about how the normie finds the completed project.
+.NH 3
+Client 4, myself
+.LP
+I've wanted to take out a project like this for a long long time, and this
+is the perfect
+opportunity to do so, I will be assessing myself along the way of this,
+building the project to my
+personal specification.
+
+.NH 2
+Questionnaires
+.LP
+It is important to get feedback from end users, so I will take multiple
+questionnaires throughout
+the project. I will then use them to slightly edit the requirements of my
+project this should make
+the final outcome more helpful and what people want.
+
+In the section bellow you will find questionnaires from the analyses stage
+of my project.
+.NH 3
+Questionnaire 1 for Amy C
+
+.BI "[30th April 2024]"
+.BI "answered by Amy, see pull request she left"
+.NH 4
+What do you find the most important in a language? (eg: speed, readability)
+.LP
+Speed, readability, debugging ease and disk space efficiency.
+.NH 4
+What tools are important for a language to have? (eg: pkg-manager, IDE
+integration)
+.LP
+IDE integration (things like tab complete and debugging tools), a package
+manager, and the ability
+to interact with the user through the command line easily.
+.NH 4
+What features do you like from other languages (eg: C's advanced memory
+management, haskell's terse
+syntax)
+.LP
+The ability to pass the memory reference of an object or function and a
+collection of built-in or
+standard functions like "print", "split", or "sort".
+.NH 4
+What do you want to program in this language (eg: websites, low level systems)
+.LP
+Lightweight command line tools and web back ends.
+.NH 4
+Do you intend to use graphics in the programs you write?
+.LP
+No.
+.NH 4
+Would you prefer a language that focuses on ease of use, or power of the code?
+.LP
+I like a good balance between the two.
+.NH 4
+What were your last 3 projects? (could they have been written in Zippy?)
+.LP
+A website, a small command-line tool and a midi keyboard (program runs on
+a Raspberry Pi Pico).
+.NH 4
+How many languages would you use on a single project? (could Zippy be used
+in your codebase?)
+.LP
+I try to use as little languages in a project as possible, so likely not in
+an existing project.
+.NH 4
+Do you care for low level control, or would you prefer high level abstractions?
+.LP
+I think low-level control is very important, but high-level abstractions
+are convenient, so a good
+balance between the two is best.
+.NH 4
+Would you be happy to develop libraries for things that aren't already
+implemented
+(eg: an SQL library)
+.LP
+Potentially if it is simple enough to implement new things.
+
+.NH 3
+Notes from questionnaire 1
+.LP
+Some of the key things that I'm taking away from this first questionnaire,
+are my client/users
+initial needs and use cases. I think it's clear my language can be of
+assistance to my client, Zippy
+will be a good language for web back ends and small command line tools,
+which my client expressed
+interested in.
+
+I find the fact my client is worried by executable size interesting, however
+I doubt it will be an
+issue; a ballooning code-base is unlikely as only one person is writing
+the project.
+
+I am also taking on the fact that my client wants good command line tools,
+so a pkg-manager and
+bundler should be a priority, perhaps they could be written in Zippy after
+the interpreter is done.
+
+.NH 2
+The first elements of the project
+.LP
+At this stage I can say that I'm confident in my project and its scope. I
+have a goal in mind for
+it.
+
+.B "The key things to take away from this section are:"
+
+.B ----
+Make a high level language with a useable set of features, to replace C in
+many situations.
+
+.B ----
+Keep the language readable and easy, with powerful tools available.
+
+.B ----
+Ensure the language is well supported with tools like a pkg-manager.
+
+.NH 2
+Moddeling
+.LP
+In larger projects, when a programmer needs a data structure that the language
+they are writing in
+doesn't provide, they will need to make their own.
+
+Bellow are a few examples of these data structures that C doesn't already
+provide.
+.NH 3
+Linked lists
+.LP
+this is an alternative implementation of a list, where you store some data,
+and the memory address
+to the next node. Then you can move through the list by reading the data
+then reading the data of
+the next node, and then repeating until the 'next' part of the node is empty.
+
+A diagram showing this can be seen here:
+
+.PSPIC linkedlist.ps
+
+.LP
+In C this is easy to implement as you can find a memory address very easily
+with '&' to find where
+a bit of data is stored. I will need to use a 'struct', which is a bit like
+a class in C (however
+you can't attach a function to it). A simple implementation looks like this:
+
+typedef struct ll {
+ void *data; // the data of the node
+ ll *next; // the next node
+
+} ll;
+
+.LP
+The pro's of a linked list are the fact that they can have data appended to
+the start or end easily
+by changing the root node, or the next node.
+
+Linked lists have a few downsides, for example you can't move through them
+backwards, and unless you
+store it on its own, you cant find the length of it in a fast way.
+
+In my project I would like to use linked list in the AST (see later sections
+for info), and to store
+lists in the language.
+.NH 3
+Dictionaries
+.LP
+A dictionary is a simple data structure that just stores, a bit of data,
+and a number or string to
+identify it.
+A dictionary like a linked list can be implemented with a struct in c like so:
+
+typedef struct dict {
+ void *data;
+ int id;
+
+} dict;
+
+.LP
+In my project I think I could use a linked list represent a Zippy variable
+and an ID that i can use
+to identify it, this could make execution faster as i can compare ID's
+rather than string values
+
+.NH 2
+Prototyping hard features
+.NH 3
+Abstract Syntax Trees (AST) theory
+.LP
+In a programming language many abstract data types will be used to allow
+the code to execute,
+however I think the hardest part of this is an abstract syntax tree. This
+is a data structure that
+holds the code in an ordered form that can be analysed and executed in a
+simple way. It is a tree
+structure, with the top node being a root and all lower nodes being things
+needed to calculate the
+root. It can be used not only for code but also for mathematical expressions. I
+think the easiest
+way to show it is via a mathematical example
+
+Take the follow expression for example:
+
+.BX "(1 + (10 * (3 - (2 * 4))))"
+
+We know that this is equal to -49
+
+However for a computer this is far harder to understand. This is because it
+has no understanding of
+order of operation
+
+To solve this we use an AST (abstract syntax tree)
+
+When you solve that expression you know to start with (2 * 4), then 3 -
+the answer to that and so on
+
+We can represent the steps as a tree like so:
+
+.PSPIC ast.ps
+
+.I "[Evalutates to 2 * (2 + 2)]"
+
+As you can see, you need to evaluate the expression in the most brackets
+first, then the next, and
+so on, working you way up
+
+You can evaluate code in a similar way, treating each operation (such as +-*/)
+as functions, doing
+the most deeply nested function first, then working up. Each expression can
+be represented in this
+tree, then to show a whole program you can create a list of trees
+
+.NH 3
+Implementing AST's
+.LP
+As a prototype i will make a program that can take mathematical expressions
+and evaluate them, and
+allowing for functions (in the form f(x)).
+It will do this via AST's
+
+This prototype takes 173 lines of code, it takes a string as a cmd line
+argument then converts it
+into an abstract syntax tree, and finally it executes it. This is just a
+simple prototype and thus
+it is small in scope. It can only do simple operators (+-*/) and requires
+literal values to be
+surrounded by [] so it knows its not another expression to evaluate.
+
+https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/code/proto/ast
+
+.PSPIC astg.ps
+
+.LP
+Above is the code for the AST, it stores an operation (which is just an
+integer), and it stores
+a real left and real right value, along side two other nodes. The real values
+are integers, this
+would be the 2 numbers in reference in the expression. The 2 nodes are a
+recursive data structure,
+much like putting an object of a class inside the definition of that class
+itself. They are used to
+store values that may still be expressions, for example (+ [1] (+ [1] [1]))
+the second part of this
+expression would be in the "right" variable. When code is executed I can
+check if "left", or "right"
+are null and if they are i know that i am at the lowest expression that is
+only literal values.
+Then I can execute that node and work my way up the tree.
+
+
+The exec function will execute the operation, unless there is a deeper node,
+if there is a deeper
+node, then it executes it, and places the result in the right or left spot
+respectively.
+
+Expressions are taken as input with the following code, and converted into
+the AST:
+
+https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/code/proto/ast
+
+.PSPIC ast.c.ps
+
+Here is an example input and output:
+
+ ./ast "(+ (- [3] [1]) (- [3] [1]))"
+
+.BX 4
+
+Note the [] used to tell the program where the literal values are.
+
+Overall this was a relatively successful prototype, however it isn't fully
+functional as a language
+it has fit the design.
+
+The rest of the code is the process of converting the string input to literal
+values and inserting
+them into the AST
+
+.NH 3
+Feedback
+.LP
+From my first Client (Amy C), she said that putting the numbers inside square
+brackets was
+inconvenient and annoying and it would be better if the numbers were separated
+by spaces instead of
+separate square bracket surrounded literals.
+
+As this is a prototype I won't fix this issue, however in the actual language
+this is a needed
+feature that I will be implementing.
+
+.NH 3
+Mixing linked lists and AST's
+.LP
+Mixing these 2 data structures together you can repressent an entire program. A
+linked list of
+AST's is how Zippy will repressent all code the user writes
+
+Here is an example of this:
+
+.PSPIC AST+LL.ps
+
+.LP
+In this example the linked list is represented by the numbers seen at the top,
+and the AST's are the
+tree's moving down.
+
+As you can see when a value is referenced that is from a different AST the
+tree will link to another
+one. This will work the same for function calls, however instead of linking
+to value definitions it
+will link to function definitions.
+
+.NH 2
+Objectives
+.NH 3
+An interpreter for the Zippy language
+.NH 4
+Linked list of AST's
+.LP
+All of a loaded program should be represented as a linked list of individual
+AST's, The developer
+should be able to access the AST for easy hacking. Functions can be represented
+as a pointer to
+another part of the list.
+.NH 4
+A lisp like syntax
+.LP
+This is to ensure the language can be parsed quickly, and is easy to write.
+.NH 4
+Functional language
+.LP
+This language should lean into the functional programming paradigm, taking
+inspiration from other
+functional languages such as lisp, and gleam.
+.NH 5
+Recursion
+.LP
+Zippy must support recursive algorithms being implemented into it, this will
+make the AST, have
+nodes linking back to parent nodes in a linked list.
+.NH 5
+Higher order functions
+.LP
+Zippy must support the usage of higher order functions, this will mean the
+AST needs to have an
+unlimited depth as otherwise the limit would be quickly reached, it can't
+be hard-coded, it must be
+dynamic.
+.NH 4
+Performance
+.LP
+The interpreter must be fast and memory efficient, the language is designed
+to work as an
+alternative to C, one of the fastest languages of all time, the interpreter
+must be fast, however
+memory footprint is not as much of a requirement.
+.NH 4
+Safe
+.LP
+Code that the user writes must be safe, and not prone to errors. This can
+be handeled via the strong
+syntax checker and type safety.
+
+.NH 3
+Standard library for Zippy
+.NH 4
+io
+.LP
+The language must have a simple to use I/O library to make outputs easy.
+.NH 4
+string
+.LP
+The language should have a sting library that provides a string type, and
+many complex algorithms
+that can be applied to them (concatenation, insertion, appending, splitting,
+stripping).
+.NH 4
+sorts
+.LP
+The language should have a sorting library that provides algorithms used
+for sorting (like merge
+sort).
+.NH 4
+graphs
+.LP
+the language must have a graph library, that allows for easy creation and
+working with graphs, it
+should provide many algorithms to help traverse these graphs
+
+.NH 3
+Tooling for the Zippy language
+.NH 4
+zpypkg
+.LP
+Zippy must provide a package manager, that allows code to be shared between
+multiple users, easily.
+It should sync projects via git and allow them to be stored on any git host
+the user likes.
+.NH 4
+Syntax checker
+.LP
+Zippy shouldn't have a built in syntax checker, instead it should be something
+that can be run
+independently of the interpreter, this means that a lot of the checking that
+interpreted languages
+do, can be done once by the developer, before shipping the app, as opposed
+to every time the program
+is run, which brings down performance.
+.NH 3
+Integration with C, via a C API
+.NH 4
+C API
+.LP
+You should be able to execute a string of Zippy code in C using a library
+that is linked with
+interpreter. This could allow Zippy to be used as a configuration language
+like Lua.
+
+.NH 2
+Desirable features
+.LP
+If time allows I'd like to add some of the following features to flesh out
+the language:
+.NH 3
+Raylib support
+.LP
+Raylib is a powerful game engine for C, however it has been ported to most
+languages under the
+sun due to how simple it is. If I have time, porting Raylib to Zippy would
+make the language
+far more useable, as it can be use for graphics programming.
+
+https://www.Raylib.com/
+
+.NH 3
+Vim integration.
+.LP
+Zippy should have integration with the Vim editor for syntax highlighting,
+this can be done via
+generating a linked list of AST's then colouring function calls a specific
+colour, and variables
+another, etc, etc.
+.NH 3
+LSP
+.LP
+A LSP (language server protocol), is used in code IDE's to auto complete
+code for you, I'd
+like one for Zippy. Although I am unsure as to how to tackle this. I believe
+a program called
+treesitter can be helpful for this.
+.NH 3
+Networking sockets
+.LP
+If possible I'd also like to provide bindings for unix network sockets,
+however this would be
+very difficult, as I would need to allow Zippy stucts to be directly converted
+to C stucts,
+when executing ELF symbols (Parts of an execuable file).
+
+.NH 1
+Design
+.NH 2
+Language specification
+.LP
+Like any other programming language Zippy needs to have a defined syntax,
+as mentioned in the
+objectives section of Analysis, I want the language to follow a lisp like
+syntax.
+
+I also believe higher order functions should be taken as standard and many
+core functions will use
+them.
+
+.NH 3
+Data types
+.NH 4
+Basic types
+.LP
+i32 - signed integer of size 32 bits
+
+u32 - unsigned integer of size 32 bits
+
+i64 - signed integer of size 64 bits
+
+u64 - unsigned integer of size 64 bits
+
+char - single ascii code
+
+float - standard C float
+
+.NH 4
+Advanced types
+.LP
+function - a function that can be used
+
+generic - should be avoided, removes checks for data types when inputting
+values to functions
+will cause many runtime errors, however when absolutely needed it is useful.
+
+.NH 4
+Arrays
+.LP
+Arrays can be show like so:
+
+x:type[]
+
+With x being the variable name, type being the type of variable, and []
+showing its an array
+
+All arrays are dynamic, represented by a linked list on the back end.
+.NH 5
+Strings
+.LP
+Strings, like in C are arrays of chars
+
+.NH 3
+Built in functions
+.NH 4
+defun
+.LP
+(defun a:type b:type returntype
+ ...
+ ...
+
+)
+
+Returns a function that take A and B as an argument (fixed types), and
+returns a value of
+returntype.
+
+.NH 4
+let
+.LP
+(let x:type value)
+
+Creates constant x of type type to value.
+
+.NH 4
+set
+.LP
+(set x:type value)
+
+Creates/recreates the variable value of x to value.
+
+.NH 4
+if/elif/else
+.LP
+(if condition function)
+
+(elif condition function)
+
+(else function)
+
+
+Executes the function provided if the condition is true.
+
+Elif works the same, except only if the previous if statement is false.
+
+Else executes only if all previous statements were false.
+
+.NH 4
+for
+.LP
+(for i (condition) function)
+
+Runs the function while the condition is true, and increments i every time
+the function
+is called.
+
+.NH 4
+while
+.LP
+(while condition function)
+
+Runs the function if the condition is true, keeps running until it is false.
+
+.NH 4
+symbol
+.LP
+(symbol a:type b:type c:type returntype name:char[] elf:char[])
+
+Returns a function that takes arguments A, B, C (of fixed types), the name
+of the function,
+and the file path of the elf.
+.NH 5
+
+.NH 4
+Arithmetic operations
+.LP
+Simple operations
+
+(+ a b) returns a + b
+
+(- a b) returns a - b
+
+(* a b) returns a * b
+
+(/ a b) returns a / b
+
+.NH 4
+Comparison
+.LP
+All return true or false
+
+(= a b) returns if a = b
+
+(!= a b) returns if a != b
+
+(> a b) returns if a > b
+
+(< a b) returns if a < b
+
+(=> a b) returns if a => b
+
+(=< a b) returns if a =< b
+
+.NH 4
+cast
+.LP
+(cast a:generic type:char[])
+
+returns a but cast to data type type, which is a string.
+
+.NH 4
+typeof
+.LP
+(typeof a:generic)
+
+returns in a string the type that variable A is.
+
+.NH 4
+terminate
+.LP
+(terminate error:error)
+
+Kills the program at the current point, frees all related memory, prints
+error info stored in error.
+
+.NH 4
+return
+.LP
+(return a:type)
+
+Must be used in defun, returns "a" from the function, "a" must be of the
+functions return type.
+
+.NH 3
+List of keywords
+.LP
+defun
+
+for
+
+while
+
+if
+
+elif
+
+else
+
+exit
+
+return
+
+symbol
+
+set
+
+let
+
+.NH 2
+Memory management
+.LP
+Memory will be allocated when a variable is initialized, and freed when the
+program stops.
+Although this isn't the fastest method, it is simple and has less runtime
+overhead.
+
+.NH 2
+Questionnaire 2 for Rayn M
+.NH 3
+How do you find this layout of the language?
+.LP
+.I "(5-6 points)"
+- I like the immutable nature of the language
+- I like the simplicity
+- I like the low level performance this will have
+- I dislike the word terminate
+- I like the procedural approach, with the function robustness
+- I dislike the brackets!
+.NH 3
+Response
+.LP
+Although he does dislike some of my features I believe them to be core parts
+of the language so
+I will keep them. I will also keep his points in mind though, I don't want
+to discourage learning
+the language due to its abstract syntax.
+
+However as per his request I will change the terminate keyword to the more
+normal exit.
+
+An updated keyword list is as flows:
+
+defun
+
+for
+
+while
+
+if
+
+elif
+
+else
+
+exit
+
+return
+
+symbol
+
+set
+
+let
+
+.NH 2
+What language do you use to make a programming language
+.LP
+As mentioned before Zippy will be written in C, with some parts being written
+in Zippy itself.
+I will try and keep most dependencies/libraries to a minimal to make the
+project easier to manage.
+
+.NH 3
+What is C?
+.LP
+C was made by Dennis Ritchie, in 1972 at AT&T's bell labs. It was designed
+to make programming low
+level systems far easier than it had been before. It was used to create the
+unix operating system
+which would go on to inspire most modern operating systems in some way. (macos
+still has code from
+the original release of C+unix).
+
+The language quickly caught on outside of bell labs after more available
+releases of unix arrived
+such as bsd 4.4, sun os and GNU. It was found to be able to do all the things
+that you could do in
+ASM however with far less a headache.
+
+.NH 3
+Why is C?
+.LP
+As mentioned C can do anything that ASM can do, meaning it is lightning fast
+and can take advantage
+of direct memory access. This allows you to make very fast lightweight
+executables that can rival
+the performance of handwritten ASM (often beating it if you enable compiler
+optimisations). It is
+this that makes C the perfect language for any and all programming languages,
+where speed is key,
+and allfeatures need to be available are present.
+
+.NH 3
+How is C?
+.LP
+C is compiled to ASM, the main compilers available are clang, gcc and MSVC,
+I will be using gcc
+as it is generally standard in linux environments.
+
+Many build systems are available for C, the main ones being cmake and gnu
+make. Both of them have
+the goal of putting the compiling process in one command. Cmake is cross
+platform (sorta windows
+doesn't work well but it does work).
+
+.NH 3
+Libraries
+.LP
+The libraries I will use are the following:
+
+C stdlib
+
+C unistd
+
+C errno
+
+Unix device files
+
+Zippy strings
+
+Zippy graphs
+
+Zippy sorts
+
+Addition libraries (may not be implemented):
+
+Raylib
+
+C sockets + Zippy sockets
+
+.NH 3
+Modularization
+.LP
+To make the project more manageable I will split it into many C files,
+this is to keep it from
+becoming impossible to edit code.
+
+The file layout looks as follows:
+
+PLACE HERE
+
+As you can see this is split up over around 40 files and 16 folders, each
+file should not go over
+~500 lines of code. This is to keep everything as easy to manage as possible.
+
+This level of modularization in needed for the development of Zippy as
+without it, files will become
+a mess that can't be worked with.
+
+All .c files will be compiled into .o files, then the .o files can be linked
+with the final zpy.c
+to generate the final executable.
+
+
+.NH 4
+Build system
+.LP
+The entire project is being build with GNU make files, each folder that
+builds something will have
+its own makefile. This will mean the entire project can be compiled with a
+single make in the root
+folder of the project.
+
+Example of make:
+
+make -j2
+
+This will build all files specified by 'Makefile' with 2 threads.
+
+The project should be build with gcc, and ld. It should be build with the
+-O3 build flag to ensure
+the program runs as fast as possible. -O3 forces the compiler to build with
+optimizations.
+
+When the project is finished, I will try compiling with clang and tcc,
+to compare performance.
+
+.NH 2
+Time table
+.LP
+The first step is to tackle the interpreter, so the zpy.c file needs to be
+finished. The tokenizer,
+execution, and libs folders need to be finished, after this point you should
+be able to execute
+Zippy code however not syntax check it or get error handling.
+
+The next step is zpycheck, the syntax and error handler, this should be ran
+before code is shipped
+to the user. It can reuse a lot of code from the tokenizer and execution steps.
+
+Finally I need to make zpypkg, this should be easy as most of it can be
+written in Zippy, and a few
+bits can be written in bash. It should be a good test to how Zippy can
+be written.
+
+If time allows it is at this point that I will write a Raylib library and
+a unix/C sockets library.
+
+.NH 2
+Flow through the system
+.LP
+The alogrithum to run code is quite complex however it can be boiled down
+to a few simple steps:
+
+.B "read the text file (strip line breaks and tabs)"
+.LP
+.B "create an empty linked list"
+.LP
+.B "get the first expression from the text file (with be encapsulated with
+"()""
+.B "get the function call and its args into a token"
+.LP
+.B "if the arguments of the function are there own function call, then
+convert them into a token"
+.LP
+.B "set that token as the argument in the first token"
+.LP
+.B "append the root token to the linked list"
+.LP
+.B "repeat until the text file string is empty"
+.LP
+.B "allocate memory for the program and prepare the exection step"
+.LP
+.B "at the start of the linked list traverse to the bottem of the tree
+(made of tokens)"
+.LP
+.B "execute the lowest token"
+.LP
+.B "repeat until all tokens including the root have been executed"
+.LP
+.B "move to the next node of the linked list"
+.LP
+.B "repeat until the linked list is empty"
+
+.LP
+Within each of these steps is many smaller steps. The hardest part will be
+making the tokens, as
+this requires alot of string manipultation. The execution will be a recursive
+alogrithum. All trees
+will be represented via structs (see section on AST's).
+
+PUT SOME FLOW CHARTS HERE
+
+.NH 1
+Technical Solution
+.NH 1
+Testing
+.NH 1
+Evaluation
+.AE