summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--eval.c14
-rw-r--r--parser.l2
-rw-r--r--parser.y2
-rw-r--r--txr.vim12
5 files changed, 37 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 211bd80d..2735a95d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2012-02-13 Kaz Kylheku <kaz@kylheku.com>
+ * 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 <kaz@kylheku.com>
+
* eval.c (dwim_loc, op_dwim): Bugfix: hash indexing requiring
at least two arguments, rather than at least one.
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;
}
-<NESTED>{ATNUM} {
+<NESTED,QSILIT>{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