guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scm2bin.scm 1.0


From: Thien-Thi Nguyen
Subject: scm2bin.scm 1.0
Date: Wed, 30 Jul 2003 18:26:51 +0200

since "guile SCRIPT" doesn't work as the SHELL value in a crontab file,
i thought i'd reinvent the wheel and do scm2bin instead (as yet another
form of procrastination ;-).  play session:

$ cat > hello-world.scm
(use-modules (ice-9 rw))
(write-line "hello-world!")
(format #t "(command-line) => ~S\n" (command-line))
^D
$ guile -s scm2bin.scm hello-world.scm
$ ./scm2bin.out how are you
hello-world!
(command-line) => ("./scm2bin.out" "how" "are" "you")
$ guile -s scm2bin.scm -o hi hello-world.scm
$ ./hi how are you
hello-world!
(command-line) => ("./hi" "how" "are" "you")

etc.  this will eventually make it into guile-tools (guile-1.4.1.94).
probably the user interface will be stable enough to get hobbit on board
At Some Point.  note that the implementation relies on "guile-tools
guile-config", which can be grabbed from:

  http://www.glug.org/alt/guile-1.4.1.93.tar.gz

happy hacking,
thi

_____________________________________________________
cd ~/stash/
tar xzOf ttn-do-141.tar.gz ttn-do-141/scm2bin.scm
#!/bin/sh
# -*- scheme -*-
exec guile -s $0 "$@"
!#
;;; ID: scm2bin.scm,v 1.1 2003/07/30 16:15:15 ttn Exp
;;;
;;; Copyright (C) 2003 Thien-Thi Nguyen
;;; This program is part of ttn-do, released under GNU GPL v2 with ABSOLUTELY
;;; NO WARRANTY.  See http://www.gnu.org/copyleft/gpl.txt for details.

;;; Commentary:

;; Usage: scm2bin --help
;;        scm2bin --version
;;        scm2bin [OPTIONS] SCM
;;  where SCM is a scheme (.scm) program, and OPTIONS
;;  (defaults in square brackets) is zero or more of:
;;    --output, -o FILE   -- use FILE for output [scm2bin.out]

;;; Code:

(define *scm2bin-version* "1.0")

(use-modules (ice-9 rw))

(define (usage)
  (for-each write-line
            '("Usage: scm2bin --help"
              "       scm2bin --version"
              "       scm2bin [OPTIONS] SCM"
              " where SCM is a scheme (.scm) program, and OPTIONS"
              " (defaults in square brackets) is zero or more of:"
              "   --output, -o FILE   -- use FILE for output [scm2bin.out]"
;;              "   --main, -m PROC     -- use PROC as main [main]"
              )))

(use-modules (srfi srfi-13))

(define (write-C-string p s)
  (string-for-each
   (lambda (c)
     (case c
       ((#\newline) (display "\\n\"\n  \"" p))
       ((#\\) (display #\\ p) (display #\\ p))
       ((#\") (display #\\ p) (display #\" p))
       (else (display c p))))
   s))

(define *boilerplate-C* "
static int actual_main (int argc, char **argv) {
  SCM port = scm_open_input_string (gh_str02scm (program));
  while (1) {
    SCM form = scm_read (port);
    if (SCM_EOF_OBJECT_P (form)) break;
    scm_eval_x (form);
  }
  return 0;
}

int main (int argc, char **argv) {
  gh_enter (argc, argv, actual_main);
  return 0;
}
")

(use-modules (scripts slurp) (ice-9 getopt-long))

;;; main
(let ((parsed (getopt-long (command-line)
                           '((version)
                             (help (single-char #\h))
                             (output (single-char #\o)
                                     (value #t))
                             (main (single-char #\m)
                                   (value #t))))))
  (cond ((option-ref parsed 'help #f)
         (usage)
         (exit #t))
        ((option-ref parsed 'version #f)
         (format #t "scm2bin ~A\n" *scm2bin-version*)
         (exit #t))
        ((null? (option-ref parsed '() #f))
         (usage)
         (exit #f))
        (else
         (let* ((name (car (option-ref parsed '() #f)))
                (in (if (file-exists? name)
                        (slurp name)
                        (begin
                          (format #t "scm2bin: cannot read: ~A\n"
                                  name)
                          (exit #f))))
                (out (option-ref parsed 'output "scm2bin.out"))
                (tmp (open-output-file "scm2bin.c")))
           (format tmp "#include <libguile.h>\n")
           (format tmp "static char program[] = \"")
           (write-C-string tmp in)
           (format tmp "\";\n\n")
           (format tmp *boilerplate-C*)
           (close tmp)
           (system (format #f "~A -o ~A ~A ~A ~A"
                           "`guile-tools guile-config acsubst CC`"
                           out
                           "`guile-tools guile-config compile`"
                           "scm2bin.c"
                           "`guile-tools guile-config link`")))
         (delete-file "scm2bin.c")
         (exit #t))))

;;; scm2bin.scm ends here

Compilation finished at Wed Jul 30 18:18:12




reply via email to

[Prev in Thread] Current Thread [Next in Thread]