Scheme jest świetny, ale nie wszyscy chcą się go uczyć. Nie wszyscy chcą nawet odpalać interpreter. Jak zachwycić ich naszymi programami?
Oczywiście cały świat czeka na powitanie, więc przygotowujemy plik hello.scm
#!/usr/bin/guile -s !# (display "Hello, World!") (newline)
Nie zapomnijmy dać mu atrybut wykonywalności. I teraz
zbyszek@katastrofa4:~/robocza/scm-lab/examples/shell$ ./hello.scm ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the --no-auto-compile argument to disable. ;;; compiling /home/zbyszek/robocza/scm-lab/examples/shell/./hello.scm ;;; compiled /home/zbyszek/.cache/guile/ccache/2.0-LE-8-2.0/home/zbyszek/robocza/scm-lab/examples/shell/hello.scm.go Hello, World!
Można również taki skrypt wywołać z guile
zbyszek@katastrofa4:~/robocza/scm-lab/examples/shell$ guile -s hello.scm Hello, World!
No dobrze, a co z argumentami? Dostajemy je jako wartość funkcji
command-line
jako listę. Spróbujmy
(hello-args.scm)
#!/usr/bin/guile -s !# (display "Hello, World!") (newline) (write (command-line)) (newline)
Popatrzmy na efekt
zbyszek@katastrofa4:~/robocza/scm-lab/examples/shell$ ./hello-args.scm 2 3 4 Hello, World! ("./hello-args.scm" "a" "b" "c")
Argumenty mogą być też przekazywane bezpośrednio do startowej funkcji (hello-args1.scm)
#!/usr/bin/guile \ -e main !# (define (main args) (display "Hello, World!") (newline) (write args) (newline))
W podobny sposób do Guile można przekazywać inne opcje.
Dla odmiany (suma):
dodamy dwie liczby podane na wejściu.
Dla zatarcia śladów usunąłem końcówkę .scm
#!/usr/bin/guile -s !# ;;(use-modules (ice-9 format)) (let ((a1 (string->number (cadr (command-line)))) (a2 (string->number (caddr (command-line))))) (format #t "~d + ~d = ~A~%" a1 a2 (+ a1 a2)))
Sprawdzamy
zbyszek@katastrofa4:~/robocza/scm-lab/examples/shell$ ./suma 6 8 6 + 8 = 14 ("sbcl" "6" "8")
Oglądaliśmy Guile. Każda implementacja ma to trochę inaczej, istnieją na sieci próby ujednolicenia przez przykrycie warstwą abstrakcji, ale raczej utrudniają testowanie.