scm: support --eval
With the ~--eval~ option you can evaluate an expression in mu/scm environment. For example: $ mu scm --eval \ '(format #t "found ~d match(es)\n" (length (mfind "hello")))' found 7173 match(es) Add command-line parameter and implement.
This commit is contained in:
@ -38,6 +38,15 @@ prefixed by *UNIX_CONNECT:* and ending with a newline. For instance:
|
||||
UNIX-CONNECT:/run/user/1000/mu-scm-socket-4eb5db40
|
||||
#+end_example
|
||||
|
||||
** --eval
|
||||
|
||||
With the ~--eval~ option you can evaluate an expression in mu/scm environment. For
|
||||
example:
|
||||
#+begin_example
|
||||
$ mu scm --eval '(format #t "found ~d match(es)\n" (length (mfind "hello")))'
|
||||
found 7173 match(es)
|
||||
#+end_example
|
||||
|
||||
#+include: "muhome.inc" :minlevel 2
|
||||
|
||||
#+include: "common-options.inc" :minlevel 1
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** Copyright (C) 2010-2025 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||
** Copyright (C) 2010-2026 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify it
|
||||
** under the terms of the GNU General Public License as published by the
|
||||
@ -75,7 +75,9 @@ cmd_scm(const Store& store, const Options& opts)
|
||||
#else
|
||||
if (opts.scm.script_path)
|
||||
return Mu::Scm::run_script(store, opts, *opts.scm.script_path);
|
||||
else
|
||||
else if (opts.scm.eval)
|
||||
return Mu::Scm::run_eval(store, opts, *opts.scm.eval);
|
||||
else
|
||||
return Mu::Scm::run_repl(store, opts, opts.scm.socket_path.value_or(""));
|
||||
#endif /*BUILD_SCM*/
|
||||
}
|
||||
|
||||
@ -650,7 +650,9 @@ sub_scm(CLI::App& sub, Options& opts)
|
||||
->excludes("--listen");
|
||||
sub.add_option("script-args", opts.scm.params, "Parameters for script")
|
||||
->type_name("<parameters>");
|
||||
|
||||
sub.add_option("--eval", opts.scm.eval, "Expression to evaluate")
|
||||
->excludes("--listen")
|
||||
->excludes("script-path");
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** Copyright (C) 2022-2025 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||
** Copyright (C) 2022-2026 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify it
|
||||
** under the terms of the GNU General Public License as published by the
|
||||
@ -261,6 +261,7 @@ struct Options {
|
||||
bool listen; /**< Whether to start listening on a socket */
|
||||
Option<std::string> socket_path; /**< path for the '--listen'
|
||||
* Unix domain socket */
|
||||
Option<std::string> eval; /**< expression to evaluate */
|
||||
} scm;
|
||||
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** Copyright (C) 2025 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||
** Copyright (C) 2025-2026 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify it
|
||||
** under the terms of the GNU General Public License as published by the
|
||||
@ -272,6 +272,23 @@ Mu::Scm::run_script(const Mu::Store& store, const Mu::Options& opts,
|
||||
return Ok();
|
||||
}
|
||||
|
||||
Result<void>
|
||||
Mu::Scm::run_eval(const Mu::Store& store, const Mu::Options& opts, const std::string& expr)
|
||||
{
|
||||
if (const auto res = prepare_run(opts, scm_args); !res)
|
||||
return Err(res.error());
|
||||
|
||||
scm_args.emplace_back("-c");
|
||||
// a little hacky...
|
||||
scm_args.emplace_back("(use-modules ((mu))) " + expr);
|
||||
|
||||
run_scm(store, opts);
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef BUILD_TESTS
|
||||
|
||||
/*
|
||||
|
||||
@ -63,7 +63,8 @@ namespace Mu::Scm {
|
||||
* based on the configuration.
|
||||
*
|
||||
* @param store a Store object
|
||||
* @param opts options; opts.scm.script_path must set
|
||||
* @param opts options
|
||||
* @param a path to the script
|
||||
*
|
||||
* @return Ok() or some error
|
||||
*/
|
||||
@ -71,6 +72,22 @@ namespace Mu::Scm {
|
||||
const std::string& script_path);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Evaluate a Guile/SCM expression
|
||||
*
|
||||
* Initialize the Scm sub-system, then start evaluate some expression
|
||||
* based on the configuration.
|
||||
*
|
||||
* @param store a Store object
|
||||
* @param opts options
|
||||
* @param expr some expression to evaluate
|
||||
*
|
||||
* @return Ok() or some error
|
||||
*/
|
||||
Result<void> run_eval(const Mu::Store& store, const Mu::Options& opts,
|
||||
const std::string& expr);
|
||||
|
||||
/**
|
||||
* Helpers
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user