Branch :
## Structure
### libkc3
KC3 is implemented using libkc3 a small C99 library implementing the core
of the language.
The library includes a parser and an interpreter for KC3 code in C
structures.
Support for large integers provided by
[libtommath](https://github.com/libtom/libtommath).
Support for C function calls provided by
[libffi](https://github.com/libffi/libffi).
Modules are saved as facts databases.
#### Parser
The parser is recursive descent.
#### AST
The AST is represented as KC3 data structures and can be meta-programmed
in C.
#### Interpreter
Please see the following functions in `libkc3/env.c`:
- `env_eval_tag` : evaluates a tag (any KC3 type)
- `env_eval_block` : evaluates a block (`do ... end`)
- `env_eval_call` : evaluates a function call (`Cfn`, `Fn`)
- `env_eval_call_fn_args` : evaluates a KC3 function call (Fn)
### ikc3
Interactive shell. Terminal I/O provided by
[linenoise](https://github.com/antirez/linenoise/tree/1.0).
Example :
```sh
$ make test
$ ikc3/ikc3
```
```elixir
ikc3> 1 + 1
2
ikc3> 2 + 2
4
ikc3> 3 + 3
6
ikc3> 1 +
ikc3> 1
2
ikc3> double = fn (x) { x * 2 }
fn (x) { x * 2 }
ikc3> double
fn (x) { x * 2 }
ikc3> double(1)
2
ikc3> double(2)
4
ikc3> double(3)
6
ikc3> double(4)
8
ikc3> List.map([1, 2, 3, 4], double)
[2, 4, 6, 8]
ikc3> List.reverse(List.map([1, 2, 3, 4], double))
[8, 6, 4, 2]
```
### Library path
The `List.map` and `List.reverse` functions are defined in
`lib/kc3/0.1/list.kc3` and can be modified in real time.
For example, without closing ikc3 let's redefine `List.reverse`,
open an editor and change the line in `lib/kc3/0.1/list.kc3` from
```elixir
def reverse = fn {
(x) { reverse(x, ()) }
([], acc) { acc }
([a | b], acc) { reverse(b, [a | acc]) }
}
```
to
```elixir
def reverse = fn {
(x) { reverse(x, ()) }
([], acc) { [:reversed | acc] }
([a | b], acc) { reverse(b, [a | acc]) }
}
}}
```
and check the results of the last command (up key) in ikc3/ikc3 :
```elixir
ikc3> List.reverse(List.map([1, 2, 3, 4], double))
[:reversed, 8, 6, 4, 2]
```
Don't forget to revert the changes to `list.kc3`.
### kc3s
Script interpreter. Works the same as ikc3 but is not interactive
and does not output results.
### HTTPd
HTTP daemon, use `make test_httpd`.
The http daemon is defined in `httpd/httpd.c` and
`lib/kc3/0.1/httpd.kc3`.
The http daemon is both a static file server listing directories and
serving files for display or download (Web 1.0), and a MVC framework
loading KC3 files in `./app`. The router is defined in
`./conf/router.kc3` .
---
Top : [KC3 Guides](./)
Previous : [KC3 Usage Guide](3.3_Usage)
Next : [KC3 Tutorial Guide](3.5_Tutorial)