Skip to content

Commit a09ef42

Browse files
authored
Merge pull request #18 from wrapl/dev
dev
2 parents c269e7d + 64df966 commit a09ef42

File tree

8 files changed

+20322
-10100
lines changed

8 files changed

+20322
-10100
lines changed

common.rabs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ DEBUG := defined("DEBUG")
44

55
CC := defined("CC") or "cc"
66
AS := defined("AS") or CC
7-
CFLAGS := ["-pipe"]
8-
LDFLAGS := []
7+
CFLAGS := old or []
8+
LDFLAGS := old or []
99
PREBUILDS := []
1010

11+
CFLAGS:put("-pipe")
1112
if defined("CFLAGS") then
1213
CFLAGS:grow(defined("CFLAGS") / " ")
1314
end

src/build.rabs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ for Path in file(""):ls do
145145
end
146146
end
147147

148-
context(""):in(;) do
148+
PARENT:in(;) do
149149
let All := meta("all")
150150
let ByTag := {}
151151
for (Name, File, Tags) in Modules do

src/fmt/markdown.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,25 @@ ML_METHOD(Parse, MLStringT) {
304304
return (ml_value_t *)Root;
305305
}
306306

307+
extern ml_type_t MarkdownT[];
308+
309+
ML_FUNCTION(Markdown) {
310+
ML_CHECK_ARG_COUNT(1);
311+
ML_CHECK_ARG_TYPE(0, MLStringT);
312+
ml_string_t *Markdown = new(ml_string_t);
313+
Markdown->Type = MarkdownT;
314+
Markdown->Length = ml_string_length(Args[0]);
315+
Markdown->Value = ml_string_value(Args[0]);
316+
return (ml_value_t *)Markdown;
317+
}
318+
319+
ML_TYPE(MarkdownT, (MLStringT), "markdown",
320+
.Constructor = (ml_value_t *)Markdown
321+
);
322+
307323
ML_LIBRARY_ENTRY0(fmt_markdown) {
308324
#include "markdown_init.c"
309-
Slot[0] = ml_module("markdown",
310-
"parse", Parse,
311-
"flag", FlagT,
312-
NULL);
325+
stringmap_insert(MarkdownT->Exports, "parse", Parse);
326+
stringmap_insert(MarkdownT->Exports, "flag", FlagT);
327+
Slot[0] = (ml_value_t *)MarkdownT;
313328
}

src/math/symengine.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ ML_METHOD(MLRealT, BasicT) {
5858

5959
#ifdef ML_COMPLEX
6060

61-
#include <ccomplex>
61+
#include <complex>
6262
#undef I
6363

6464
static RCP<const Basic> ML_TYPED_FN(ml_basic_of, MLComplexT, ml_value_t *Value) {
@@ -271,6 +271,30 @@ static void ML_TYPED_FN(ml_iterate, BasicFiniteSetT, ml_state_t *Caller, basic_t
271271
ML_RETURN(MLNil);
272272
}
273273

274+
static ml_value_t *ML_TYPED_FN(ml_unpack, BasicFiniteSetT, basic_t *Basic, int Index) {
275+
const FiniteSet *Set = dynamic_cast<const FiniteSet *>(Basic->Value.get());
276+
if (Set) {
277+
const auto Args = Set->get_args();
278+
if ((unsigned int)Index > Args.size()) return MLNil;
279+
return (ml_value_t *)(new basic_t(Args[Index - 1]));
280+
}
281+
return MLNil;
282+
}
283+
284+
ML_METHOD("[]", BasicFiniteSetT, MLIntegerT) {
285+
basic_t *Basic = (basic_t *)Args[0];
286+
int Index = ml_integer_value(Args[1]);
287+
const FiniteSet *Set = dynamic_cast<const FiniteSet *>(Basic->Value.get());
288+
if (Set) {
289+
const auto Args = Set->get_args();
290+
if (Index <= 0) Index += Args.size() + 1;
291+
if (Index <= 0) return MLNil;
292+
if ((unsigned int)Index > Args.size()) return MLNil;
293+
return (ml_value_t *)(new basic_t(Args[Index - 1]));
294+
}
295+
return MLNil;
296+
}
297+
274298
ML_LIBRARY_ENTRY0(math_symengine) {
275299
ml_type_add_parent(BasicSymbolT, MLFunctionT);
276300
ml_type_add_parent(BasicEmptySetT, BasicSetT);

src/parse/rapc.mini

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export: fun any(Chars) do
2-
let M := map(swap(Chars))
2+
let M := set(Chars)
33
fun(S, I) do
44
let C := S[I]
55
M[C] and (I + 1, C, 0)
@@ -11,7 +11,7 @@ export: fun many(Chars, Min, Max) do
1111
end
1212

1313
export: fun none(Chars) do
14-
let M := map(swap(Chars))
14+
let M := set(Chars)
1515
fun(S, I) do
1616
let C := S[I]
1717
(not M[C]) and (I + 1, C, 0)
@@ -23,10 +23,21 @@ export: fun skip(Chars, Min, Max) do
2323
end
2424

2525
export: fun match(Pattern) do
26-
let L := Pattern:length
27-
fun(S, I) do
28-
let J := I + L
29-
S[I, J] = Pattern and (J, Pattern, 0)
26+
switch Pattern: type
27+
case string do
28+
let L := Pattern:length
29+
fun(S, I) do
30+
let J := I + L
31+
S[I, J] = Pattern and (J, Pattern, 0)
32+
end
33+
case regex do
34+
fun(S, I) do
35+
if let (Index, Match) := S:find2(Pattern, I) then
36+
if Index = 1 then
37+
ret (I + Match:length, Match, 0)
38+
end
39+
end
40+
end
3041
end
3142
end
3243

@@ -89,7 +100,7 @@ export: fun alt([Ps]) do
89100
ret resume(1, nil, _, _)
90101
end
91102

92-
export: fun seq([Ps]) do
103+
export: fun seqn([Ps]) do
93104
fun(S, var I) do
94105
let Results := []
95106

src/util/bitset.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,52 +10,62 @@
1010
typedef struct {
1111
ml_type_t *Type;
1212
roaring_bitmap_t *Value;
13-
} bitset_t;
13+
} ml_bitset_t;
1414

1515
ML_TYPE(MLBitsetT, (MLSequenceT), "bitset");
1616

1717
static void bitset_finalize(void *Bitset, void *Data) {
18-
roaring_bitmap_free(((bitset_t *)Bitset)->Value);
18+
roaring_bitmap_free(((ml_bitset_t *)Bitset)->Value);
1919
}
2020

2121
ML_METHOD(MLBitsetT) {
2222
//>bitset
23-
bitset_t *Bitset = new(bitset_t);
23+
ml_bitset_t *Bitset = new(ml_bitset_t);
2424
Bitset->Type = MLBitsetT;
2525
Bitset->Value = roaring_bitmap_create();
2626
GC_register_finalizer(Bitset, bitset_finalize, NULL, NULL, NULL);
2727
return (ml_value_t *)Bitset;
2828
}
2929

3030
ML_METHOD("set", MLBitsetT, MLIntegerT) {
31-
bitset_t *Bitset = (bitset_t *)Args[0];
31+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[0];
3232
roaring_bitmap_add(Bitset->Value, ml_integer_value(Args[1]));
3333
return (ml_value_t *)Bitset;
3434
}
3535

3636
ML_METHOD("set", MLBitsetT, MLIntegerRangeT) {
37-
bitset_t *Bitset = (bitset_t *)Args[0];
37+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[0];
3838
ml_integer_range_t *Range = (ml_integer_range_t *)Args[1];
3939
roaring_bitmap_add_range_closed(Bitset->Value, Range->Start, Range->Limit);
4040
return (ml_value_t *)Bitset;
4141
}
4242

4343
ML_METHOD("unset", MLBitsetT, MLIntegerT) {
44-
bitset_t *Bitset = (bitset_t *)Args[0];
44+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[0];
4545
roaring_bitmap_remove(Bitset->Value, ml_integer_value(Args[1]));
4646
return (ml_value_t *)Bitset;
4747
}
4848

4949
ML_METHOD("unset", MLBitsetT, MLIntegerRangeT) {
50-
bitset_t *Bitset = (bitset_t *)Args[0];
50+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[0];
5151
ml_integer_range_t *Range = (ml_integer_range_t *)Args[1];
5252
roaring_bitmap_remove_range_closed(Bitset->Value, Range->Start, Range->Limit);
5353
return (ml_value_t *)Bitset;
5454
}
5555

56+
ML_METHOD("count", MLBitsetT) {
57+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[0];
58+
return ml_integer(roaring_bitmap_get_cardinality(Bitset->Value));
59+
}
60+
61+
ML_METHOD("size", MLBitsetT) {
62+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[0];
63+
return ml_integer(roaring_bitmap_get_cardinality(Bitset->Value));
64+
}
65+
5666
ML_METHOD("append", MLStringBufferT, MLBitsetT) {
5767
ml_stringbuffer_t *Buffer = (ml_stringbuffer_t *)Args[0];
58-
bitset_t *Bitset = (bitset_t *)Args[1];
68+
ml_bitset_t *Bitset = (ml_bitset_t *)Args[1];
5969
roaring_uint32_iterator_t Iter[1];
6070
roaring_init_iterator(Bitset->Value, Iter);
6171
if (!Iter->has_value) {
@@ -96,7 +106,7 @@ typedef struct {
96106
ML_TYPE(BitsetIterT, (), "bitset::iter");
97107
//!internal
98108

99-
static void ML_TYPED_FN(ml_iterate, MLBitsetT, ml_state_t *Caller, bitset_t *Bitset) {
109+
static void ML_TYPED_FN(ml_iterate, MLBitsetT, ml_state_t *Caller, ml_bitset_t *Bitset) {
100110
if (!roaring_bitmap_get_cardinality(Bitset->Value)) ML_RETURN(MLNil);
101111
bitset_iter_t *Iter = new(bitset_iter_t);
102112
Iter->Type = BitsetIterT;
@@ -120,7 +130,7 @@ static void ML_TYPED_FN(ml_iter_value, BitsetIterT, ml_state_t *Caller, bitset_i
120130
ML_RETURN(ml_integer(Iter->Iter->current_value));
121131
}
122132

123-
static void ML_TYPED_FN(ml_cbor_write, MLBitsetT, ml_cbor_writer_t *Writer, bitset_t *Bitset) {
133+
static void ML_TYPED_FN(ml_cbor_write, MLBitsetT, ml_cbor_writer_t *Writer, ml_bitset_t *Bitset) {
124134
ml_cbor_write_tag(Writer, ML_CBOR_TAG_OBJECT);
125135
ml_cbor_write_array(Writer, 2);
126136
ml_cbor_write_string(Writer, strlen("bitset"));
@@ -137,7 +147,7 @@ static ml_value_t *decode_bitset(ml_cbor_reader_t *Reader, int Count, ml_value_t
137147
ML_CHECK_ARG_TYPE(0, MLAddressT);
138148
roaring_bitmap_t *Value = roaring_bitmap_portable_deserialize_safe(ml_address_value(Args[0]), ml_address_length(Args[0]));
139149
if (!Value) return ml_error("DecodeError", "Error decoding bitmap data");
140-
bitset_t *Bitset = new(bitset_t);
150+
ml_bitset_t *Bitset = new(ml_bitset_t);
141151
Bitset->Type = MLBitsetT;
142152
Bitset->Value = Value;
143153
return (ml_value_t *)Bitset;

0 commit comments

Comments
 (0)