Programy

Scheme jest świetny, ale nie wszyscy chcą się go uczyć. Nie wszyscy chcą nawet odpalać interpreter. Jak zachwycić ich naszymi programami?

Skrypty

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.