added better support for structs for extern functions, added a flag to disable list folding and made extern functions automaticly have priority 1

This commit is contained in:
igor
2026-03-02 10:21:42 +01:00
parent 86d4ffbb9a
commit 13f33d7820
6 changed files with 836 additions and 129 deletions

View File

@@ -0,0 +1,71 @@
import stdlib.sl
cstruct Pair
cfield a i64
cfield b i64
end
cstruct Big
cfield a i64
cfield b i64
cfield c i64
end
cstruct LDiv
cfield quot i64
cfield rem i64
end
cstruct TimeSpec
cfield tv_sec i64
cfield tv_nsec i64
end
extern long long pair_sum(struct Pair p)
extern struct Pair make_pair(long long seed)
extern struct Big make_big(long long seed)
extern long long big_sum(struct Big b)
extern long long pair_after_six(long long a, long long b, long long c, long long d, long long e, long long f, struct Pair p)
extern struct LDiv ldiv(long numer, long denom)
extern int timespec_get(struct TimeSpec* ts, int base)
extern void exit(int status)
word main
Pair.size alloc dup >r
r@ 11 Pair.a!
r@ 31 Pair.b!
r@ pair_sum puti cr
r> Pair.size free
100 make_big dup >r
r@ Big.a@ puti cr
r@ Big.b@ puti cr
r@ Big.c@ puti cr
r@ big_sum puti cr
r> Big.size free
7 make_pair dup >r
r@ Pair.a@ puti cr
r@ Pair.b@ puti cr
r> Pair.size free
Pair.size alloc dup >r
r@ 11 Pair.a!
r@ 31 Pair.b!
1 2 3 4 5 6 r@ pair_after_six puti cr
r> Pair.size free
20 3 ldiv dup >r
r@ LDiv.quot@ puti cr
r@ LDiv.rem@ puti cr
r> LDiv.size free
TimeSpec.size alloc dup >r
r@ 1 timespec_get 1 == if 1 else 0 end puti cr
r@ TimeSpec.tv_sec@ 0 > if 1 else 0 end puti cr
r@ TimeSpec.tv_nsec@ 0 >= if 1 else 0 end puti cr
r@ TimeSpec.tv_nsec@ 1000000000 < if 1 else 0 end puti cr
r> TimeSpec.size free
0 exit
end