They have an example service on the website:
(define sshd
(service
'(sshd ssh-daemon) ;the secure shell daemon
#:start (make-inetd-constructor ;start on demand
'("/usr/sbin/sshd" "-D" "-i")
(list (endpoint
(make-socket-address AF_INET INADDR_ANY 22))
(endpoint
(make-socket-address AF_INET6 IN6ADDR_ANY 22)))
#:max-connections 10)
#:stop (make-inetd-destructor)
#:respawn? #t))
(register-services (list sshd))
(start-in-the-background '(sshd))
Let's see how the same service looks like with systemd:
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target
[Service]
Type=notify-reload
ExecStart=/usr/bin/sshd -D
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
I have some lisp knowledge, so the scheme version doesn't look frightening to me, but I guess for sysadmins, who should write these kind of files frequently systemd's TOML like language is much more easier to understand.
Some differences I see: Shepherd does some firewall management with ports, and I don't see the services it depends on.
Why this kind of files should be written in a programming language at all? I guess it's a remnant from the old times, but I like when tools abstract away the programming parts, and users shouldn't have to deal with that. I like the same thing in docker-compose: I can configure a program whatever language it's written, I don't have to deal with what's happening under the hood.
I guess there is some usefulness with defining services as code, if you need more complex situations, but it should the more rare case nowadays.