Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ groovy ./stepX_YYY.groovy

### Hare

The hare implementation was tested against Hare 0.24.2.
The hare implementation was tested against Hare 0.25.2.

```
cd impls/hare
Expand Down
2 changes: 1 addition & 1 deletion impls/hare/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM ubuntu:25.04
FROM debian:testing
MAINTAINER Lou Woell <lou@reptitions.de>
LABEL org.opencontainers.image.source=https://github.com/kanaka/mal
LABEL org.opencontainers.image.description="mal test container: hare"
Expand Down
4 changes: 2 additions & 2 deletions impls/hare/mal/core.ha
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ fn apply(args: []MalType) (MalType | error) = {
case 0 =>
yield [];
case =>
yield alloc([nil...], length);
yield alloc([nil...], length)!;
};
defer free(ls);

Expand Down Expand Up @@ -896,7 +896,7 @@ fn malkeyword(args: []MalType) (MalType | error) = {

match(args[0]){
case let s: string =>
let name = strings::lpad(s.data, ':', len(s.data) + 1);
let name = strings::lpad(s.data, ':', len(s.data) + 1)!;
defer free(name);
return make_symbol(name);
case let k: symbol =>
Expand Down
4 changes: 2 additions & 2 deletions impls/hare/mal/env.ha
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ export fn env_init(outer: nullable * env = null) *env ={
const new = alloc(env {
outer = outer,
data = hm_init(),
});
})!;

append(gc.memory.envs, new);
append(gc.memory.envs, new)!;
return new;
};

Expand Down
18 changes: 9 additions & 9 deletions impls/hare/mal/gc.ha
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ fn finish_memory(memory: memory) void = {

fn mark_hash(hm: hashmap) void = {

append(gc.marked.hashs, hm);
append(gc.marked.hashs, hm)!;
mark(hm.meta);

for(let v .. hm.data){
Expand All @@ -85,7 +85,7 @@ fn mark_env(envi: *env) void = {
if(e == envi) return void;
};

append(gc.marked.envs, envi);
append(gc.marked.envs, envi)!;
mark(envi.data);

match(envi.outer){
Expand Down Expand Up @@ -114,21 +114,21 @@ fn mark (val: MalType) void = {
for(let x .. gc.marked.vecs){
if(x == v) return void;
};
append(gc.marked.vecs, v);
append(gc.marked.vecs, v)!;
mark_col(v.data);
mark(v.meta);
case let l: list =>
for(let x .. gc.marked.lists){
if(x == l) return void;
};
append(gc.marked.lists, l);
append(gc.marked.lists, l)!;
mark_col(l.data);
mark(l.meta);
case let f: function =>
for(let x .. gc.marked.funcs){
if(x == f) return void;
};
append(gc.marked.funcs, f);
append(gc.marked.funcs, f)!;
mark(f.meta);
mark(f.body);
mark_col(f.args);
Expand All @@ -137,14 +137,14 @@ fn mark (val: MalType) void = {
for(let x .. gc.marked.intrinsics){
if(x == i) return void;
};
append(gc.marked.intrinsics, i);
append(gc.marked.intrinsics, i)!;
mark(i.meta);
case let m: macro =>
let m = m:function;
for(let x .. gc.marked.funcs){
if(x == m) return void;
};
append(gc.marked.funcs, m);
append(gc.marked.funcs, m)!;
mark(m.meta);
mark(m.body);
mark_col(m.args);
Expand All @@ -164,13 +164,13 @@ fn mark (val: MalType) void = {
for(let x .. gc.marked.strings){
if(x == s) return void;
};
append(gc.marked.strings, s);
append(gc.marked.strings, s)!;
mark(s.meta);
case let a: atom =>
for(let x .. gc.marked.atoms){
if(x == a) return void;
};
append(gc.marked.atoms, a);
append(gc.marked.atoms, a)!;
mark(*a);
case => void;
};
Expand Down
8 changes: 4 additions & 4 deletions impls/hare/mal/hashmap.ha
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ export fn hm_init(gcd: bool = true) hashmap = {
let new: hashmap = alloc(struct {
data: []hmap = [],
meta: MalType = nil,
});
})!;

if(gcd) append(gc.memory.hashs, new);
if(gcd) append(gc.memory.hashs, new)!;

return new;
};
Expand All @@ -50,7 +50,7 @@ fn new(
child: [4](size | void) = [void...],
};

append(hm.data, new);
append(hm.data, new)!;

match(p.child) {
case void =>
Expand Down Expand Up @@ -180,7 +180,7 @@ fn hm_copy(hm: hashmap, filter: [](string | symbol) = []) hashmap = {

if(len(filter) == 0){
for(let e .. hm.data) {
append(new.data, e);
append(new.data, e)!;
};
} else {
for :map (let e .. hm.data) {
Expand Down
2 changes: 1 addition & 1 deletion impls/hare/mal/printer.ha
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ fn print_string(
print_readable: bool
) void = {

let runes = strings::torunes(s.data);
let runes = strings::torunes(s.data)!;


if(!print_readable){
Expand Down
4 changes: 2 additions & 2 deletions impls/hare/mal/reader.ha
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ fn read_collection(
case hash_end =>
return unbalanced;
case let form: MalType =>
append(res, form);
append(res, form)!;
continue;
case io::EOF =>
return unexpected_eof;
Expand All @@ -180,7 +180,7 @@ fn read_string(s: str) (string | error) = {

let strbuf = memio::dynamic();
defer io::close(&strbuf)!;
let runes = strings::torunes(s);
let runes = strings::torunes(s)!;

for (let i: size = 0; i < len(runes); i += 1) {
let rn = switch (runes[i]) {
Expand Down
34 changes: 17 additions & 17 deletions impls/hare/mal/types.ha
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ export fn make_intrinsic(
const new = alloc(struct {
eval: *fn([]MalType) (MalType | error) = func,
meta: MalType = nil,
});
})!;

append(gc.memory.intrinsics, new);
append(gc.memory.intrinsics, new)!;
return new;
};

Expand All @@ -66,7 +66,7 @@ export fn make_func(

let arg_list: []MalType = [];
if(len(args) > 0) {
arg_list = alloc([nil...], len(args));
arg_list = alloc([nil...], len(args))!;
arg_list[0..] = args;
};

Expand All @@ -75,9 +75,9 @@ export fn make_func(
envi: *env= envi,
args: []MalType = arg_list,
body: MalType = body,
meta: MalType = nil });
meta: MalType = nil })!;

append(gc.memory.funcs, new);
append(gc.memory.funcs, new)!;
return new;
};

Expand All @@ -91,14 +91,14 @@ export fn make_list(s: size, init: []MalType = []) list = {
const new: list = alloc(struct {
data: []MalType = [],
meta: MalType = nil,
});
})!;

if (s == 0) return new;

new.data = alloc([nil...], s);
new.data = alloc([nil...], s)!;
new.data[0..len(init)] = init;

append(gc.memory.lists, new);
append(gc.memory.lists, new)!;
return new;
};

Expand All @@ -112,14 +112,14 @@ export fn make_vec(s: size, init: []MalType = []) vector = {
const new: vector = alloc(struct {
data: []MalType = [],
meta: MalType = nil,
});
})!;

if (s == 0) return new;

new.data = alloc([nil...], s);
new.data = alloc([nil...], s)!;
new.data[0..len(init)] = init;

append(gc.memory.vecs, new);
append(gc.memory.vecs, new)!;
return new;
};

Expand All @@ -144,22 +144,22 @@ export fn make_symbol(name: str) symbol = {
return s;
};

const new = strings::dup(name): symbol;
const new = strings::dup(name)!: symbol;
hm_add(gc.memory.symbols: hashmap, new, new);

return new;
};

export fn make_string(s: str) string = {

const new_str = strings::dup(s);
const new_str = strings::dup(s)!;

const new = alloc(struct {
data: str = new_str,
meta: MalType = nil,
});
})!;

append(gc.memory.strings, new);
append(gc.memory.strings, new)!;
return new;
};

Expand All @@ -170,8 +170,8 @@ fn free_string(s: string) void = {

export fn make_atom(ref: MalType) atom = {

const new = alloc(ref);
append(gc.memory.atoms, new);
const new = alloc(ref)!;
append(gc.memory.atoms, new)!;
return new;
};

Expand Down
4 changes: 2 additions & 2 deletions impls/hare/step4_if_fn_do.ha
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,14 @@ fn eval_list(ls: mal::list, env: *mal::env) (mal::MalType | mal::error) = {
let args: []mal::MalType = [];
defer free(args);
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
return func.eval(args);
case let func: mal::function =>
let args: []mal::MalType = [];
defer free(args);
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
let local = mal::env_init(func.envi);
mal::env_bind(local, func.args, args);
Expand Down
4 changes: 2 additions & 2 deletions impls/hare/step5_tco.ha
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,13 @@ for(true){
let args: []mal::MalType = [];
defer free(args);
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
return func.eval(args);
case let func: mal::function =>
let args: []mal::MalType = [];
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
env = mal::env_init(func.envi);
mal::env_bind(env, func.args, args);
Expand Down
6 changes: 3 additions & 3 deletions impls/hare/step6_file.ha
Original file line number Diff line number Diff line change
Expand Up @@ -149,13 +149,13 @@ for(true){
case let func: mal::intrinsic =>
let args: []mal::MalType = [];
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
return func.eval(args);
case let func: mal::function =>
let args: []mal::MalType = [];
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
env = mal::env_init(func.envi);
mal::env_bind(env, func.args, args);
Expand Down Expand Up @@ -245,7 +245,7 @@ export fn main() void = {

if(len(args) > 1){
let exec_str = strings::join("", "(load-file \"", args[1],
"\")");
"\")")!;
rep(strings::toutf8(exec_str), env, false);
free(exec_str);
os::exit(0);
Expand Down
6 changes: 3 additions & 3 deletions impls/hare/step7_quote.ha
Original file line number Diff line number Diff line change
Expand Up @@ -217,13 +217,13 @@ for(true){
let args: []mal::MalType = [];
defer free(args);
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
return func.eval(args);
case let func: mal::function =>
let args: []mal::MalType = [];
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
env = mal::env_init(func.envi);
mal::env_bind(env, func.args, args);
Expand Down Expand Up @@ -315,7 +315,7 @@ export fn main() void = {

if(len(args) > 1){
let exec_str = strings::join("", "(load-file \"", args[1],
"\")");
"\")")!;
rep(strings::toutf8(exec_str), env, false);
free(exec_str);
os::exit(0);
Expand Down
6 changes: 3 additions & 3 deletions impls/hare/step8_macros.ha
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ for(true){
let args: []mal::MalType = [];
defer free(args);
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
return func.eval(args);
case let mac: mal::macro =>
Expand All @@ -267,7 +267,7 @@ for(true){
case let func: mal::function =>
let args: []mal::MalType = [];
for(let arg .. ls.data[1..]){
append(args, eval(arg, env)?);
append(args, eval(arg, env)?)!;
};
env = mal::env_init(func.envi);
mal::env_bind(env, func.args, args);
Expand Down Expand Up @@ -381,7 +381,7 @@ export fn main() void = {

if(len(args) > 1){
let exec_str = strings::join("", "(load-file \"", args[1],
"\")");
"\")")!;
rep(strings::toutf8(exec_str), env, false);
free(exec_str);
os::exit(0);
Expand Down
Loading
Loading