From 69ec860812569dbbfb9216907abbd22ff36ce54f Mon Sep 17 00:00:00 2001 From: Christian Bauer Date: Mon, 25 Jun 2001 22:04:11 +0000 Subject: [PATCH 1/1] added map() --- ginsh/ginsh.1.in | 9 ++++++--- ginsh/ginsh_parser.yy | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ginsh/ginsh.1.in b/ginsh/ginsh.1.in index 5f780648..a66c23e1 100644 --- a/ginsh/ginsh.1.in +++ b/ginsh/ginsh.1.in @@ -279,14 +279,14 @@ detail here. Please refer to the GiNaC documentation. .BI expand( expression ) \- expands an expression .br -.BI find( expression ", " expression ) +.BI find( expression ", " pattern ) \- returns a list of all occurrences of a pattern in an expression .br .BI gcd( expression ", " expression ) \- greatest common divisor .br -.BI has( expression ", " expression ) -\- returns "1" if the first expression contains the second (which may contain wildcards) as a subexpression, "0" otherwise +.BI has( expression ", " pattern ) +\- returns "1" if the first expression contains the pattern as a subexpression, "0" otherwise .br .BI inverse( matrix ) \- inverse of a matrix @@ -306,6 +306,9 @@ detail here. Please refer to the GiNaC documentation. .BI lsolve( equation-list ", " symbol-list ) \- solve system of linear equations .br +.BI map( expression ", " pattern ) +\- apply function to each operand; the function to be applied is specified as a pattern with the "\$0" wildcard standing for the operands +.br .BI match( expression ", " pattern ) \- check whether expression matches a pattern; returns a list of wildcard substitutions or "FAIL" if there is no match .br diff --git a/ginsh/ginsh_parser.yy b/ginsh/ginsh_parser.yy index a94b92c7..16601cee 100644 --- a/ginsh/ginsh_parser.yy +++ b/ginsh/ginsh_parser.yy @@ -394,6 +394,19 @@ static ex f_is(const exprseq &e) return (bool)ex_to(e[0]) ? ex(1) : ex(0); } +class apply_map_function : public map_function { + ex apply; +public: + apply_map_function(const ex & a) : apply(a) {} + ex operator()(const ex & e) { return apply.subs(wild() == e, true); } +}; + +static ex f_map(const exprseq &e) +{ + apply_map_function fcn(e[1]); + return e[0].map(fcn); +} + static ex f_match(const exprseq &e) { lst repl_lst; @@ -526,6 +539,7 @@ static const fcn_init builtin_fcns[] = { {"lcoeff", fcn_desc(f_lcoeff, 2)}, {"ldegree", fcn_desc(f_ldegree, 2)}, {"lsolve", fcn_desc(f_lsolve, 2)}, + {"map", fcn_desc(f_map, 2)}, {"match", fcn_desc(f_match, 2)}, {"nops", fcn_desc(f_nops, 1)}, {"normal", fcn_desc(f_normal1, 1)}, -- 2.37.1