mirror of
https://github.com/janet-lang/janet
synced 2025-01-10 23:50:26 +00:00
Add method syntax to parser.
This commit is contained in:
parent
1394dbbd57
commit
74e1a3273f
@ -2,6 +2,9 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 0.4.0 - ??
|
## 0.4.0 - ??
|
||||||
|
- Add janet\_getmethod to CAPI for easier use of method like syntax.
|
||||||
|
- Add get/set to abstract types to allow them to behave more
|
||||||
|
like objects with methods.
|
||||||
- Add parser/insert to modify parser state programmatically
|
- Add parser/insert to modify parser state programmatically
|
||||||
- Add debug/stacktrace for easy, pretty stacktraces
|
- Add debug/stacktrace for easy, pretty stacktraces
|
||||||
- Remove the status-pp function
|
- Remove the status-pp function
|
||||||
|
@ -20,5 +20,4 @@
|
|||||||
(:scale a 5)
|
(:scale a 5)
|
||||||
(for i 0 10 (print (a i)))
|
(for i 0 10 (print (a i)))
|
||||||
|
|
||||||
#
|
|
||||||
(print "sum=" (:sum a))
|
(print "sum=" (:sum a))
|
||||||
|
@ -73,6 +73,16 @@ type janet_get##name(const Janet *argv, int32_t n) { \
|
|||||||
return janet_unwrap_##name(x); \
|
return janet_unwrap_##name(x); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Janet janet_getmethod(const uint8_t *method, const JanetMethod *methods) {
|
||||||
|
while (methods->name) {
|
||||||
|
if (!janet_cstrcmp(method, methods->name))
|
||||||
|
return janet_wrap_cfunction(methods->cfun);
|
||||||
|
methods++;
|
||||||
|
}
|
||||||
|
janet_panicf("unknown method %S invoked", method);
|
||||||
|
return janet_wrap_nil();
|
||||||
|
}
|
||||||
|
|
||||||
DEFINE_GETTER(number, NUMBER, double)
|
DEFINE_GETTER(number, NUMBER, double)
|
||||||
DEFINE_GETTER(array, ARRAY, JanetArray *)
|
DEFINE_GETTER(array, ARRAY, JanetArray *)
|
||||||
DEFINE_GETTER(tuple, TUPLE, const Janet *)
|
DEFINE_GETTER(tuple, TUPLE, const Janet *)
|
||||||
|
@ -609,11 +609,13 @@ static int parsergc(void *p, size_t size) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Janet parserget(void *p, Janet key);
|
||||||
|
|
||||||
static JanetAbstractType janet_parse_parsertype = {
|
static JanetAbstractType janet_parse_parsertype = {
|
||||||
"core/parser",
|
"core/parser",
|
||||||
parsergc,
|
parsergc,
|
||||||
parsermark,
|
parsermark,
|
||||||
NULL,
|
parserget,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -772,6 +774,26 @@ static Janet cfun_parse_state(int32_t argc, Janet *argv) {
|
|||||||
return janet_wrap_string(str);
|
return janet_wrap_string(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const JanetMethod parser_methods[] = {
|
||||||
|
{"byte", cfun_parse_byte},
|
||||||
|
{"consume", cfun_parse_consume},
|
||||||
|
{"error", cfun_parse_error},
|
||||||
|
{"flush", cfun_parse_flush},
|
||||||
|
{"has-more", cfun_parse_has_more},
|
||||||
|
{"insert", cfun_parse_insert},
|
||||||
|
{"produce", cfun_parse_produce},
|
||||||
|
{"state", cfun_parse_state},
|
||||||
|
{"status", cfun_parse_status},
|
||||||
|
{"where", cfun_parse_where},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static Janet parserget(void *p, Janet key) {
|
||||||
|
(void) p;
|
||||||
|
if (!janet_checktype(key, JANET_KEYWORD)) janet_panicf("expected keyword method");
|
||||||
|
return janet_getmethod(janet_unwrap_keyword(key), parser_methods);
|
||||||
|
}
|
||||||
|
|
||||||
static const JanetReg parse_cfuns[] = {
|
static const JanetReg parse_cfuns[] = {
|
||||||
{
|
{
|
||||||
"parser/new", cfun_parse_parser,
|
"parser/new", cfun_parse_parser,
|
||||||
|
@ -266,6 +266,7 @@ typedef struct JanetKV JanetKV;
|
|||||||
typedef struct JanetStackFrame JanetStackFrame;
|
typedef struct JanetStackFrame JanetStackFrame;
|
||||||
typedef struct JanetAbstractType JanetAbstractType;
|
typedef struct JanetAbstractType JanetAbstractType;
|
||||||
typedef struct JanetReg JanetReg;
|
typedef struct JanetReg JanetReg;
|
||||||
|
typedef struct JanetMethod JanetMethod;
|
||||||
typedef struct JanetSourceMapping JanetSourceMapping;
|
typedef struct JanetSourceMapping JanetSourceMapping;
|
||||||
typedef struct JanetView JanetView;
|
typedef struct JanetView JanetView;
|
||||||
typedef struct JanetByteView JanetByteView;
|
typedef struct JanetByteView JanetByteView;
|
||||||
@ -754,6 +755,11 @@ struct JanetReg {
|
|||||||
const char *documentation;
|
const char *documentation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct JanetMethod {
|
||||||
|
const char *name;
|
||||||
|
JanetCFunction cfun;
|
||||||
|
};
|
||||||
|
|
||||||
struct JanetView {
|
struct JanetView {
|
||||||
const Janet *items;
|
const Janet *items;
|
||||||
int32_t len;
|
int32_t len;
|
||||||
@ -1146,6 +1152,7 @@ JANET_API void janet_panic_abstract(Janet x, int32_t n, const JanetAbstractType
|
|||||||
JANET_API void janet_arity(int32_t arity, int32_t min, int32_t max);
|
JANET_API void janet_arity(int32_t arity, int32_t min, int32_t max);
|
||||||
JANET_API void janet_fixarity(int32_t arity, int32_t fix);
|
JANET_API void janet_fixarity(int32_t arity, int32_t fix);
|
||||||
|
|
||||||
|
JANET_API Janet janet_getmethod(const uint8_t *method, const JanetMethod *methods);
|
||||||
JANET_API double janet_getnumber(const Janet *argv, int32_t n);
|
JANET_API double janet_getnumber(const Janet *argv, int32_t n);
|
||||||
JANET_API JanetArray *janet_getarray(const Janet *argv, int32_t n);
|
JANET_API JanetArray *janet_getarray(const Janet *argv, int32_t n);
|
||||||
JANET_API const Janet *janet_gettuple(const Janet *argv, int32_t n);
|
JANET_API const Janet *janet_gettuple(const Janet *argv, int32_t n);
|
||||||
|
Loading…
Reference in New Issue
Block a user