Skip to content

Commit e892a08

Browse files
committed
FIX: Allow expressions in parens as INSERT and CHANGE value argument
fixes: metaeducation/rebol-issues#1279
1 parent d27e4b1 commit e892a08

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

src/core/u-parse.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,11 @@ void Print_Parse_Index(REBCNT type, REBVAL *rules, REBSER *series, REBCNT index)
10611061
item = rules++;
10621062
}
10631063
// CHECK FOR QUOTE!!
1064-
item = Get_Parse_Value(item); // new value
1064+
if (IS_PAREN(item)) {
1065+
item = Do_Block_Value_Throw(item); // might GC
1066+
} else {
1067+
item = Get_Parse_Value(item); // new value
1068+
}
10651069
if (IS_UNSET(item)) Trap1(RE_NO_VALUE, rules-1);
10661070
if (IS_END(item)) goto bad_end;
10671071
if (IS_BLOCK_INPUT(parse)) {

src/tests/run-tests.r3

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ dt [ ;- delta time
4242
wrap load %units/file-test.r3
4343
wrap load %units/func-test.r3
4444
wrap load %units/typeset-test.r3
45+
wrap load %units/parse-test.r3
4546

4647
recycle/torture
4748
recycle

src/tests/units/parse-test.r3

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
Rebol [
2+
Title: "Rebol parse test script"
3+
Author: "Oldes"
4+
File: %parse-test.r3
5+
Tabs: 4
6+
Needs: [%../quick-test-module.r3]
7+
]
8+
9+
~~~start-file~~~ "Parse"
10+
11+
===start-group=== "CHANGE"
12+
13+
--test-- "CHANGE rule value (same size)"
14+
r: ["b"]
15+
--assert parse s: "abc" [some ["a" change r "X" | skip]]
16+
--assert s = "aXc"
17+
18+
--assert parse s: "abc" [some ["a" change copy v r "X" | skip]]
19+
--assert v = "b"
20+
--assert s = "aXc"
21+
22+
--test-- "CHANGE rule value (different size)"
23+
r: ["b"]
24+
--assert parse s: "abc" [some ["a" change r "XX" | skip]]
25+
--assert s = "aXXc"
26+
27+
--assert parse s: "abc" [some ["a" change copy v r "XX" | skip]]
28+
--assert v = "b"
29+
--assert s = "aXXc"
30+
31+
--test-- "CHANGE rule (expression)"
32+
--assert parse s: "abc" [some ["a" change copy v r (uppercase v) | skip]]
33+
--assert v = "B"
34+
--assert s = "aBc"
35+
--assert parse s: "abc" [some ["a" change copy v ["b" "c"] (reverse copy v) | skip]]
36+
--assert v = "bc"
37+
--assert s = "acb"
38+
39+
--test-- "CHANGE block"
40+
--assert parse b: [1] [change integer! (1 + 1) to end]
41+
--assert b = [2]
42+
43+
===end-group===
44+
45+
===start-group=== "INSERT"
46+
47+
--test-- "INSERT value"
48+
--assert parse s: "abc" [some ["a" insert "a" | skip]]
49+
--assert s = "aabc"
50+
--assert parse s: "abc" [some ["a" insert "X" | "b" insert "YY" | 1 skip]]
51+
--assert s = "aXbYYc"
52+
53+
--test-- "INSERT expresion"
54+
--assert parse s: "abc" [some ["a" insert (uppercase "x") | skip]]
55+
--assert s = "aXbc"
56+
57+
--test-- "INSERT block"
58+
--assert parse b: [1] [insert (1 + 2) insert 2 to end]
59+
--assert b = [3 2 1]
60+
61+
===end-group===
62+
63+
64+
~~~end-file~~~

0 commit comments

Comments
 (0)