X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginsh%2Fginsh_parser.yy;h=f2cfc769103a4a47f5e818a523d0e758d4ee2d99;hp=a94b92c775b1b71ec20178bdb3d8fcb65f18846e;hb=c1e8ee3f2ae31139a94b9712bd88e8d1d2d86050;hpb=708e9e647029af699333fceffc0a76bef70a4709 diff --git a/ginsh/ginsh_parser.yy b/ginsh/ginsh_parser.yy index a94b92c7..f2cfc769 100644 --- a/ginsh/ginsh_parser.yy +++ b/ginsh/ginsh_parser.yy @@ -394,6 +394,20 @@ 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) {} + virtual ~apply_map_function() {} + 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 +540,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)}, @@ -722,7 +737,7 @@ static void print_help_topics(void) * Function name completion functions for readline */ -static char *fcn_generator(char *text, int state) +static char *fcn_generator(const char *text, int state) { static int len; // Length of word to complete static fcn_tab::const_iterator index; // Iterator to function being currently considered @@ -743,7 +758,7 @@ static char *fcn_generator(char *text, int state) return NULL; } -static char **fcn_completion(char *text, int start, int end) +static char **fcn_completion(const char *text, int start, int end) { if (rl_line_buffer[0] == '!') { // For shell commands, revert back to filename completion @@ -753,7 +768,7 @@ static char **fcn_completion(char *text, int start, int end) #if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) return completion_matches(text, (CPFunction *)filename_completion_function); #else - return rl_completion_matches(text, (CPFunction *)rl_filename_completion_function); + return rl_completion_matches(text, rl_filename_completion_function); #endif } else { // Otherwise, complete function names @@ -763,7 +778,7 @@ static char **fcn_completion(char *text, int start, int end) #if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) return completion_matches(text, (CPFunction *)fcn_generator); #else - return rl_completion_matches(text, (CPFunction *)fcn_generator); + return rl_completion_matches(text, fcn_generator); #endif } } @@ -806,7 +821,11 @@ int main(int argc, char **argv) // Init readline completer rl_readline_name = argv[0]; +#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2) rl_attempted_completion_function = (CPPFunction *)fcn_completion; +#else + rl_attempted_completion_function = fcn_completion; +#endif orig_completion_append_character = rl_completion_append_character; orig_basic_word_break_characters = rl_basic_word_break_characters;