Skip to content

Commit 545dd90

Browse files
committed
FEAT: VECTOR compact construction
Implements: metaeducation/rebol-issues#2396 Example: ``` >> #[ui8! [1 2 3]] == make vector! [unsigned integer! 8 3 [1 2 3]] ```
1 parent 65a0685 commit 545dd90

File tree

4 files changed

+95
-0
lines changed

4 files changed

+95
-0
lines changed

src/boot/words.r

+19
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,25 @@ any-string!
2626
any-object!
2727
any-block!
2828

29+
;- numeric types (used for "short" vector! construction)
30+
;- like: #[ui8 4] which is same like: make vector! [unsigned integer! 8 4]
31+
; these numeric files are used in l-types.c and t-vector.c sources
32+
; and can be used for future struct! and routine! implementations
33+
si8!
34+
si16!
35+
si32!
36+
si64!
37+
38+
ui8!
39+
ui16!
40+
ui32!
41+
ui64!
42+
43+
f32!
44+
f64!
45+
;@@ O: Should be supported also longer variants like uint8! etc?
46+
; end of numeric types
47+
2948
datatypes
3049

3150
native

src/core/l-types.c

+3
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,9 @@ bad_hex: Trap0(RE_INVALID_CHARS);
10691069
return TRUE;
10701070

10711071
default:
1072+
if (type >= SYM_SI8X && type <= SYM_F64X) {
1073+
if (MT_Vector(value, val, REB_VECTOR)) return TRUE;
1074+
}
10721075
return FALSE;
10731076
}
10741077
}

src/core/t-vector.c

+13
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,17 @@ void Set_Vector_Row(REBSER *ser, REBVAL *blk)
487487
// SIGNED / UNSIGNED
488488
if (IS_WORD(bp)) {
489489
switch (VAL_WORD_CANON(bp)) {
490+
case SYM_SI8X: type = 0; sign = 0; bits = 8; bp++; goto size_spec;
491+
case SYM_UI8X: type = 0; sign = 1; bits = 8; bp++; goto size_spec;
492+
case SYM_SI16X: type = 0; sign = 0; bits = 16; bp++; goto size_spec;
493+
case SYM_UI16X: type = 0; sign = 1; bits = 16; bp++; goto size_spec;
494+
case SYM_SI32X: type = 0; sign = 0; bits = 32; bp++; goto size_spec;
495+
case SYM_UI32X: type = 0; sign = 1; bits = 32; bp++; goto size_spec;
496+
case SYM_SI64X: type = 0; sign = 0; bits = 64; bp++; goto size_spec;
497+
case SYM_UI64X: type = 0; sign = 1; bits = 64; bp++; goto size_spec;
498+
case SYM_F32X: type = 1; sign = 0; bits = 32; bp++; goto size_spec;
499+
case SYM_F64X: type = 1; sign = 0; bits = 64; bp++; goto size_spec;
500+
490501
case SYM_UNSIGNED: sign = 1; bp++; break;
491502
case SYM_SIGNED: sign = 0; bp++; break;
492503
}
@@ -518,6 +529,8 @@ void Set_Vector_Row(REBSER *ser, REBVAL *blk)
518529
else return 0;
519530
} else return 0;
520531

532+
size_spec:
533+
521534
// SIZE
522535
if (IS_INTEGER(bp)) {
523536
size = Int32(bp);

src/tests/units/vector-test.r3

+60
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,66 @@ Rebol [
151151

152152
===end-group===
153153

154+
===start-group=== "VECTOR compact construction"
155+
;@@ https://github.com/rebol/rebol-issues/issues/2396
156+
--test-- "Compact construction syntax (empty)"
157+
--assert (mold #[si8!]) = "make vector! [integer! 8 0 []]"
158+
--assert (mold #[si16!]) = "make vector! [integer! 16 0 []]"
159+
--assert (mold #[si32!]) = "make vector! [integer! 32 0 []]"
160+
--assert (mold #[si64!]) = "make vector! [integer! 64 0 []]"
161+
--assert (mold #[ui8!]) = "make vector! [unsigned integer! 8 0 []]"
162+
--assert (mold #[ui16!]) = "make vector! [unsigned integer! 16 0 []]"
163+
--assert (mold #[ui32!]) = "make vector! [unsigned integer! 32 0 []]"
164+
--assert (mold #[ui64!]) = "make vector! [unsigned integer! 64 0 []]"
165+
--assert (mold #[f32!]) = "make vector! [decimal! 32 0 []]"
166+
--assert (mold #[f64!]) = "make vector! [decimal! 64 0 []]"
167+
168+
--test-- "Compact construction syntax (size)"
169+
--assert (mold #[si8! 3]) = "make vector! [integer! 8 3 [0 0 0]]"
170+
--assert (mold #[si16! 3]) = "make vector! [integer! 16 3 [0 0 0]]"
171+
--assert (mold #[si32! 3]) = "make vector! [integer! 32 3 [0 0 0]]"
172+
--assert (mold #[si64! 3]) = "make vector! [integer! 64 3 [0 0 0]]"
173+
--assert (mold #[ui8! 3]) = "make vector! [unsigned integer! 8 3 [0 0 0]]"
174+
--assert (mold #[ui16! 3]) = "make vector! [unsigned integer! 16 3 [0 0 0]]"
175+
--assert (mold #[ui32! 3]) = "make vector! [unsigned integer! 32 3 [0 0 0]]"
176+
--assert (mold #[ui64! 3]) = "make vector! [unsigned integer! 64 3 [0 0 0]]"
177+
--assert (mold #[f32! 3]) = "make vector! [decimal! 32 3 [0.0 0.0 0.0]]"
178+
--assert (mold #[f64! 3]) = "make vector! [decimal! 64 3 [0.0 0.0 0.0]]"
179+
180+
--test-- "Compact construction syntax (data)"
181+
--assert (mold #[si8! [1 2]]) = "make vector! [integer! 8 2 [1 2]]"
182+
--assert (mold #[si16! [1 2]]) = "make vector! [integer! 16 2 [1 2]]"
183+
--assert (mold #[si32! [1 2]]) = "make vector! [integer! 32 2 [1 2]]"
184+
--assert (mold #[si64! [1 2]]) = "make vector! [integer! 64 2 [1 2]]"
185+
--assert (mold #[ui8! [1 2]]) = "make vector! [unsigned integer! 8 2 [1 2]]"
186+
--assert (mold #[ui16! [1 2]]) = "make vector! [unsigned integer! 16 2 [1 2]]"
187+
--assert (mold #[ui32! [1 2]]) = "make vector! [unsigned integer! 32 2 [1 2]]"
188+
--assert (mold #[ui64! [1 2]]) = "make vector! [unsigned integer! 64 2 [1 2]]"
189+
--assert (mold #[f32! [1 2]]) = "make vector! [decimal! 32 2 [1.0 2.0]]"
190+
--assert (mold #[f64! [1 2]]) = "make vector! [decimal! 64 2 [1.0 2.0]]"
191+
192+
--test-- "Compact construction syntax (data with index)"
193+
--assert (mold v: #[si8! [1 2] 2]) = "make vector! [integer! 8 1 [2]]"
194+
--assert 2 = index? v
195+
--assert (mold v: #[si16! [1 2] 2]) = "make vector! [integer! 16 1 [2]]"
196+
--assert 2 = index? v
197+
--assert (mold v: #[si32! [1 2] 2]) = "make vector! [integer! 32 1 [2]]"
198+
--assert 2 = index? v
199+
--assert (mold v: #[si64! [1 2] 2]) = "make vector! [integer! 64 1 [2]]"
200+
--assert 2 = index? v
201+
--assert (mold v: #[ui8! [1 2] 2]) = "make vector! [unsigned integer! 8 1 [2]]"
202+
--assert 2 = index? v
203+
--assert (mold v: #[ui16! [1 2] 2]) = "make vector! [unsigned integer! 16 1 [2]]"
204+
--assert 2 = index? v
205+
--assert (mold v: #[ui32! [1 2] 2]) = "make vector! [unsigned integer! 32 1 [2]]"
206+
--assert 2 = index? v
207+
--assert (mold v: #[ui64! [1 2] 2]) = "make vector! [unsigned integer! 64 1 [2]]"
208+
--assert 2 = index? v
209+
--assert (mold v: #[f32! [1 2] 2]) = "make vector! [decimal! 32 1 [2.0]]"
210+
--assert 2 = index? v
211+
--assert (mold v: #[f64! [1 2] 2]) = "make vector! [decimal! 64 1 [2.0]]"
212+
--assert 2 = index? v
213+
154214

155215
===start-group=== "VECTOR math"
156216

0 commit comments

Comments
 (0)