Compare commits
4 commits
ea9fa52a38
...
main
Author | SHA1 | Date | |
---|---|---|---|
Der Teufel | 9b2cdf1f0a | ||
Der Teufel | a2984da093 | ||
Der Teufel | e83052f06d | ||
Der Teufel | 782e1a2ca3 |
15
README.md
Normal file
15
README.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
# topiku
|
||||
topiku is a simple [LISP](https://en.wikipedia.org/wiki/Lisp_(programming_language)) inspired language with [toki pona](https://tokipona.org/) keywords
|
||||
|
||||
### Name
|
||||
The name `topiku` was created as short form of `toki pi kulupu ijo` - language of lists, but it was also retroactively expanded into `toki epiku` - the epic language.
|
||||
|
||||
## Building
|
||||
To build `topiku` interpreter you need a [Zig](https://ziglang.org/) compiler (works with `master`) and [`editline`](https://github.com/troglobit/editline) installed.
|
||||
```sh
|
||||
> git clone https://git.ablecorp.us:443/der-teufel-programming/topiku.git
|
||||
> cd topiku
|
||||
> zig build
|
||||
```
|
||||
The executable is then found as `zig-out/bin/topiku`
|
||||
It is also possible to build and run using `zig build run` command.
|
15
src/main.zig
15
src/main.zig
|
@ -3,16 +3,23 @@ const prompt = @import("prompt.zig");
|
|||
|
||||
pub fn main() anyerror!void {
|
||||
const stdout = std.io.getStdOut().writer();
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
|
||||
defer {
|
||||
var notclear = gpa.deinit();
|
||||
if (notclear) {
|
||||
std.log.err("Detected memory leaks!!!", .{});
|
||||
}
|
||||
}
|
||||
|
||||
try stdout.writeAll("topiku - toki pi kulupu ijo - ver. 0.0.1\n");
|
||||
|
||||
prompt.init();
|
||||
defer prompt.deinit();
|
||||
|
||||
while (true) {
|
||||
|
||||
var input = prompt.readline("topiku> ") orelse break;
|
||||
defer std.c.free(&input);
|
||||
|
||||
try stdout.print(">>> {s}\n", .{input});
|
||||
defer prompt.free(input);
|
||||
try stdout.print("<{}>: {s}\n", .{ input.num, input.content });
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,17 +5,39 @@ const ceditline = @cImport({
|
|||
const std = @import("std");
|
||||
const io = std.io;
|
||||
|
||||
pub fn readline(prompt: [*c]const u8) ?[]u8 {
|
||||
var line = ceditline.readline(@as([*c]const u8, prompt));
|
||||
const __sighandler = ?fn (c_int) callconv(.C) void;
|
||||
extern fn signal(sig: c_int, handler: __sighandler) __sighandler;
|
||||
|
||||
var line_num: usize = 0;
|
||||
|
||||
pub const Line = struct {
|
||||
content: []u8,
|
||||
num: usize,
|
||||
};
|
||||
|
||||
pub fn readline(prompt: []const u8) ?Line {
|
||||
var line = ceditline.readline(@as([*c]const u8, prompt.ptr));
|
||||
if (line == 0) {
|
||||
std.c.free(line);
|
||||
return null;
|
||||
}
|
||||
return std.mem.sliceTo(line, 0);
|
||||
line_num += 1;
|
||||
return Line{ .content = std.mem.sliceTo(line, 0), .num = line_num };
|
||||
}
|
||||
|
||||
pub fn free(line: Line) void {
|
||||
std.c.free(line.content.ptr);
|
||||
}
|
||||
|
||||
pub fn init() void {
|
||||
ceditline.rl_initialize();
|
||||
_ = signal(std.os.SIG.INT, exit);
|
||||
line_num = 0;
|
||||
}
|
||||
|
||||
fn exit(_: c_int) callconv(.C) void {
|
||||
deinit();
|
||||
std.os.exit(0);
|
||||
}
|
||||
|
||||
pub fn deinit() void {
|
||||
|
|
Loading…
Reference in a new issue