From f31be2486084f6388ea212f18574584ab4c13e64 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 13 Feb 2012 02:58:57 -0800 Subject: * eval.c (subst_vars): Handle lone symbols (not wrapped in sys::var form) as variables. This allows interpretation of metanums in quasiliterals, because these are replaced by variables in the op expander. * parser.l: Recognize METANUM in QSILIT state. * parser.y (quasi_item): METANUM parsed in quasiliteral. * txr.vim: Metanums highlighted properly. --- ChangeLog | 13 +++++++++++++ eval.c | 14 ++++++++++++++ parser.l | 2 +- parser.y | 2 ++ txr.vim | 12 +++++++----- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 211bd80d..2735a95d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-02-13 Kaz Kylheku + + * eval.c (subst_vars): Handle lone symbols (not wrapped + in sys::var form) as variables. This allows interpretation of metanums + in quasiliterals, because these are replaced by variables in the + op expander. + + * parser.l: Recognize METANUM in QSILIT state. + + * parser.y (quasi_item): METANUM parsed in quasiliteral. + + * txr.vim: Metanums highlighted properly. + 2012-02-13 Kaz Kylheku * eval.c (dwim_loc, op_dwim): Bugfix: hash indexing requiring diff --git a/eval.c b/eval.c index 07c7fc1c..380b4623 100644 --- a/eval.c +++ b/eval.c @@ -1117,6 +1117,20 @@ static val subst_vars(val forms, val env) forms = cdr(forms); continue; } + } else if (bindable(form)) { + val pair = lookup_var(env, form); + + if (pair) { + val str = cdr(pair); + + if (!stringp(str) && !listp(str)) + str = format(nil, lit("~a"), str, nao); + + forms = cons(str, rest(forms)); + continue; + } + uw_throwf(query_error_s, lit("unbound variable ~a"), + form, nao); } list_collect(iter, form); diff --git a/parser.l b/parser.l index e206661d..279cb7ec 100644 --- a/parser.l +++ b/parser.l @@ -183,7 +183,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} return NUMBER; } -{ATNUM} { +{ATNUM} { val str = string_own(utf8_dup_from(yytext + 1)); if (yy_top_state() == INITIAL diff --git a/parser.y b/parser.y index 1059c863..24f38fb0 100644 --- a/parser.y +++ b/parser.y @@ -833,6 +833,8 @@ quasi_items : quasi_item { $$ = cons($1, nil); } quasi_item : litchars { $$ = lit_char_helper($1); } | TEXT { $$ = string_own($1); } | o_var { $$ = $1; } + | METANUM { $$ = cons(var_s, cons($1, nil)); + rl($$, num(lineno)); } | list { $$ = rlcp(cons(expr_s, expand($1)), $1); } ; diff --git a/txr.vim b/txr.vim index c4550353..f75ec957 100644 --- a/txr.vim +++ b/txr.vim @@ -95,6 +95,7 @@ syn match txr_char "@[ \t]*\\." syn match txr_char "@[ \t]*\\x[0-9A-Fa-f]\+" syn match txr_char "@[ \t]*\\[0-9]\+" syn match txr_variable "@[ \t]*[*]\?[ \t]*[A-Za-z_][A-Za-z0-9_]*" +syn match txr_metanum "@[0-9]\+" syn match txr_regdir "@[ \t]*/\(\\/\|[^/]\)*/" syn match txr_chr "#\\x[A-Fa-f0-9]\+" contained @@ -110,16 +111,16 @@ syn region txr_bracevar matchgroup=Delimiter start="@[ \t]*[*]\?{" matchgroup=De syn region txr_directive matchgroup=Delimiter start="@[ \t]*(" matchgroup=Delimiter end=")" contains=txr_keyword,txr_string,txr_list,txr_dwim,txr_metabkt,txr_meta,txr_quasilit,txr_num,txr_ident,txr_regex,txr_string,txr_variable,txr_chr,txr_hash,txr_ncomment -syn region txr_list contained matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=txl_keyword,txr_string,txr_regex,txr_num,txr_ident,txr_variable,txr_meta,txr_metabkt,txr_list,txr_dwim,txr_quasilit,txr_chr,txr_hash,txr_quote,txr_ncomment +syn region txr_list contained matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=txl_keyword,txr_string,txr_regex,txr_num,txr_ident,txr_variable,txr_metanum,txr_meta,txr_metabkt,txr_list,txr_dwim,txr_quasilit,txr_chr,txr_hash,txr_quote,txr_ncomment -syn region txr_dwim contained matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=txl_keyword,txr_string,txr_regex,txr_num,txr_ident,txr_variable,txr_meta,txr_metabkt,txr_list,txr_dwim,txr_dwim,txr_quasilit,txr_chr,txr_hash,txr_quote,txr_ncomment +syn region txr_dwim contained matchgroup=Delimiter start="\[" matchgroup=Delimiter end="\]" contains=txl_keyword,txr_string,txr_regex,txr_num,txr_ident,txr_variable,txr_metanum,txr_meta,txr_metabkt,txr_list,txr_dwim,txr_dwim,txr_quasilit,txr_chr,txr_hash,txr_quote,txr_ncomment -syn region txr_meta contained matchgroup=Delimiter start="@[ \t]*(" matchgroup=Delimiter end=")" contains=txl_keyword,txr_string,txr_list,txr_dwim,txr_regex,txr_num,txr_ident,txr_variable,txr_meta,txr_metabkt,txr_quasilit,txr_chrb,txr_hash,txr_quote,txr_ncomment +syn region txr_meta contained matchgroup=Delimiter start="@[ \t]*(" matchgroup=Delimiter end=")" contains=txl_keyword,txr_string,txr_list,txr_dwim,txr_regex,txr_num,txr_ident,txr_variable,txr_metanum,txr_meta,txr_metabkt,txr_quasilit,txr_chrb,txr_hash,txr_quote,txr_ncomment -syn region txr_metabkt contained matchgroup=Delimiter start="@[ \t]*\[" matchgroup=Delimiter end="\]" contains=txl_keyword,txr_string,txr_list,txr_dwim,txr_regex,txr_num,txr_ident,txr_variable,txr_meta,txr_metabkt,txr_quasilit,txr_chrb,txr_hash,txr_quote,txr_ncomment +syn region txr_metabkt contained matchgroup=Delimiter start="@[ \t]*\[" matchgroup=Delimiter end="\]" contains=txl_keyword,txr_string,txr_list,txr_dwim,txr_regex,txr_num,txr_ident,txr_variable,txr_metanum,txr_meta,txr_metabkt,txr_quasilit,txr_chrb,txr_hash,txr_quote,txr_ncomment syn region txr_string contained oneline start=+"+ skip=+\\\\\|\\"+ end=+"+ -syn region txr_quasilit contained oneline start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=txr_meta,txr_metabkt,txr_variable,txr_bracevar +syn region txr_quasilit contained oneline start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=txr_meta,txr_metabkt,txr_variable,txr_metanum,txr_bracevar hi def link txr_at Special hi def link txr_atstar Special @@ -137,6 +138,7 @@ hi def link txr_quasilit String hi def link txr_regex String hi def link txr_regdir String hi def link txr_variable Identifier +hi def link txr_metanum Identifier hi def link txr_bracevar Identifier hi def link txr_ident Identifier hi def link txr_num Number -- cgit v1.2.3