Hi guix,
I'm having trouble with nesting g-expressions when defining a mcron job. I want
the job to run the same "mastodon-archive" commands for several accounts, so I
define a list of accounts and use 'map' to build the complete command. This
works well when there are only strings involved, but I can't make it work with
gexps.
Here's a simplified example with only strings:
--8<---------------cut here---------------start------------->8---
(define succeeding-job
(let* ((accounts '("account1" "account2"))
(cmd (apply string-append
(map
(lambda (acct)
(string-append
"mastodon-archive archive " acct "; "))
accounts))))
#~(job '(next-second (range 1 61 10))
(lambda ()
(system (string-append "echo '" #$cmd "'")))
"mastodon-archive")))
--8<---------------cut here---------------end--------------->8---
The job succeeds and the mcron log prints as expected "mastodon-archive archive
account1; mastodon-archive archive account2;". Now to use the full path to the
mastodon-archive binary, cmd must be a gexp:
--8<---------------cut here---------------start------------->8---
(define failing-job
(let* ((accounts '("account1" "account2"))
(cmd #~(apply string-append
(map
(lambda (acct)
(string-append
#$mastodon-archive "/bin/mastodon-archive archive "
acct "; "))
#$accounts))))
#~(job '(next-second (range 1 61 10))
(lambda ()
(system (string-append "echo '" #$cmd "'")))
"mastodon-archive")))
--8<---------------cut here---------------end--------------->8---
The home configuration builds fine, but the mcron job fails with the error:
(wrong-type-arg #f Wrong type to apply: ~S (account1) (account1))
I played around with gexp-ing the string-append in the lambda, ungexp-ing acct,
and trying every other combination of gexp/ungexp I could think of, but I could
only make it worse.
Any idea what I'm doing wrong?