added an internal macro HCL_LANG_AUTO_FORGE_XLIST_ALWAYS to control the xlist enclosing feature and updated related test cases
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
9cd1f90d5d
commit
49ad657544
22
lib/read.c
22
lib/read.c
@ -25,6 +25,7 @@
|
|||||||
#include "hcl-prv.h"
|
#include "hcl-prv.h"
|
||||||
|
|
||||||
#define HCL_LANG_ENABLE_WIDE_DELIM
|
#define HCL_LANG_ENABLE_WIDE_DELIM
|
||||||
|
#define HCL_LANG_AUTO_FORGE_XLIST_ALWAYS
|
||||||
|
|
||||||
#define BUFFER_ALIGN 128
|
#define BUFFER_ALIGN 128
|
||||||
#define BALIT_BUFFER_ALIGN 128
|
#define BALIT_BUFFER_ALIGN 128
|
||||||
@ -1307,7 +1308,7 @@ static int feed_process_token (hcl_t* hcl)
|
|||||||
goto start_list;
|
goto start_list;
|
||||||
|
|
||||||
case HCL_TOK_LBRACE: /* { */
|
case HCL_TOK_LBRACE: /* { */
|
||||||
/* this is a block opener itself. auto xlist forge at the block beginning */
|
/* this is a block opener itself. auto xlist forge at the block beginning only */
|
||||||
frd->flagv = 0;
|
frd->flagv = 0;
|
||||||
LIST_FLAG_SET_CONCODE (frd->flagv, HCL_CONCODE_BLOCK);
|
LIST_FLAG_SET_CONCODE (frd->flagv, HCL_CONCODE_BLOCK);
|
||||||
goto start_list;
|
goto start_list;
|
||||||
@ -1332,6 +1333,25 @@ static int feed_process_token (hcl_t* hcl)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
case HCL_TOK_LPAREN: /* ( */
|
case HCL_TOK_LPAREN: /* ( */
|
||||||
|
#if defined(HCL_LANG_AUTO_FORGE_XLIST_ALWAYS)
|
||||||
|
/* with this feature on, you must not enclose an expression with ()
|
||||||
|
* at the top-level or a the block level. If you do, it is interpreted as
|
||||||
|
* double exuection, meaning the return value of the expression is
|
||||||
|
* called again.
|
||||||
|
*
|
||||||
|
* (+ 10 20) as a leading expression is like ((+ 10 20)).
|
||||||
|
* -------------------------------------------------------------
|
||||||
|
* However, it can be a bit confusing:
|
||||||
|
* defun x(a) { return (fun(b) { return (+ a b) }) }
|
||||||
|
* printf "%d\n" ((x 10) 20) ## excplicit outer () is required here
|
||||||
|
* (x 10) 30 ## explicit outer () must not be used here
|
||||||
|
* j := ((x 10) 40) ## explicit outer () is required here
|
||||||
|
* k := {
|
||||||
|
* (x 10) 50 ## explicit outer () must not be used here
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
if (auto_forge_xlist_if_at_block_beginning(hcl, frd) <= -1) goto oops;
|
||||||
|
#endif
|
||||||
frd->flagv = 0;
|
frd->flagv = 0;
|
||||||
LIST_FLAG_SET_CONCODE (frd->flagv, HCL_CONCODE_XLIST);
|
LIST_FLAG_SET_CONCODE (frd->flagv, HCL_CONCODE_XLIST);
|
||||||
start_list:
|
start_list:
|
||||||
|
30
t/fun-01.hcl
30
t/fun-01.hcl
@ -20,23 +20,41 @@ defun mkfun(t) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
set f (mkfun 20);
|
f := (mkfun 20);
|
||||||
set k (f 50);
|
set k (f 50);
|
||||||
if (= k 70) {
|
if (k = 70) {
|
||||||
printf "OK - %d\n" k;
|
printf "OK - %d\n" k;
|
||||||
} else {
|
} else {
|
||||||
printf "ERROR - %d\n" k;
|
printf "ERROR - %d\n" k;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
k := {
|
||||||
|
(mkfun 20) 30
|
||||||
|
}
|
||||||
|
if (k = 50) {
|
||||||
|
printf "OK - %d\n" k
|
||||||
|
} else {
|
||||||
|
printf "ERROR - %d\n" k
|
||||||
|
};
|
||||||
|
|
||||||
|
k := {
|
||||||
|
(mkfun 20) 30
|
||||||
|
(mkfun 20) 40
|
||||||
|
}
|
||||||
|
if (k = 60) {
|
||||||
|
printf "OK - %d\n" k
|
||||||
|
} else {
|
||||||
|
printf "ERROR - %d\n" k
|
||||||
|
};
|
||||||
|
|
||||||
## --------------------------------------
|
## --------------------------------------
|
||||||
|
|
||||||
defclass A | a b c | {
|
defclass A | a b c | {
|
||||||
defun :* newInstance(x y z) {
|
defun :* newInstance(x y z) {
|
||||||
(set a x)
|
set a x
|
||||||
(set b y)
|
set b y
|
||||||
(set c z)
|
set c z
|
||||||
(return self)
|
return self
|
||||||
};
|
};
|
||||||
|
|
||||||
defun get-a() { return a; };
|
defun get-a() { return a; };
|
||||||
|
Loading…
Reference in New Issue
Block a user