>From f06fcd9e997e0bd6de9f85c22d75bd7a05545627 Mon Sep 17 00:00:00 2001 From: Nala Ginrut Date: Fri, 25 Jan 2013 18:38:22 +0800 Subject: [PATCH] List all available languages. * ice-9/command-line.scm: list available languages for 'guile' cmd. * scripts/compile.scm: list all available languages for 'guild compile' cmd. * NOTE: 'guile --list-languages' won't list inner languages, but 'guild compile -l' will do that. --- module/ice-9/command-line.scm | 23 +++++++++++++++++++++++ module/scripts/compile.scm | 22 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/module/ice-9/command-line.scm b/module/ice-9/command-line.scm index 2aa50ec..57d93c7 100644 --- a/module/ice-9/command-line.scm +++ b/module/ice-9/command-line.scm @@ -33,6 +33,9 @@ (define-module (ice-9 command-line) #:autoload (system vm vm) (set-default-vm-engine! set-vm-engine! the-vm) + #:use-module (srfi srfi-1) + #:use-module (ice-9 regex) + #:use-module (ice-9 ftw) #:export (compile-shell-switches version-etc *GPLv3+* @@ -122,6 +125,7 @@ If FILE begins with `-' the -s switch is mandatory. -e FUNCTION after reading script, apply FUNCTION to command line arguments --language=LANG change language; default: scheme + --list-languages list all available languages -ds do -s script at this point --debug start with the \"debugging\" VM engine --no-debug start with the normal VM engine (backtraces but @@ -189,6 +193,19 @@ If FILE begins with `-' the -s switch is mandatory. ((module-ref (resolve-module '(system base compile)) 'compile-file) f #:to 'value)))) +(define (not-inner-lang? str) + (not (string-match + "glil|glil\\.scm|assembly|assembly\\.scm|bytecode|objcode\\.scm|objcode|tree-il|tree-il\\.scm|value|\\.\\.|\\." + str))) + +(define (get-all-available-languages) + (let lp((rest (map (lambda (x) (string-append x "/language")) %load-path)) (result '())) + (cond + ((null? rest) (apply lset-union string=? result)) + (else + (let ((ll (scandir (car rest) not-inner-lang?))) + (lp (cdr rest) (if ll (cons ll result) result))))))) + (define* (compile-shell-switches args #:optional (usage-name "guile")) (let ((arg0 "guile") (script-cell #f) @@ -306,6 +323,12 @@ If FILE begins with `-' the -s switch is mandatory. (cons `(current-language ',(string->symbol (car args))) out))) + ((string=? "--list-languages" arg) ; list all languages + (for-each (lambda (l) + (format #t "~a~%" l)) + (get-all-available-languages)) + (exit 0)) + ((string=? arg "-ds") ; do script here ;; We put a dummy "load" expression, and let the -s put the ;; filename in. diff --git a/module/scripts/compile.scm b/module/scripts/compile.scm index 20db944..7e74eb9 100644 --- a/module/scripts/compile.scm +++ b/module/scripts/compile.scm @@ -35,6 +35,8 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-13) #:use-module (srfi srfi-37) + #:use-module (ice-9 regex) + #:use-module (ice-9 ftw) #:use-module (ice-9 format) #:export (compile)) @@ -45,6 +47,19 @@ (format (current-error-port) "error: ~{~a~}~%" messages) (exit 1)) +(define (valid-lang? str) + (not (string-match + "[A-Za-z0-9_ -]+\\.scm|\\.\\.|\\." + str))) + +(define (get-all-available-languages) + (let lp((rest (map (lambda (x) (string-append x "/language")) %load-path)) (result '())) + (cond + ((null? rest) (apply lset-union string=? result)) + (else + (let ((ll (scandir (car rest) valid-lang?))) + (lp (cdr rest) (if ll (cons ll result) result))))))) + (define %options ;; Specifications of the command-line options. (list (option '(#\h "help") #f #f @@ -80,6 +95,12 @@ (option '(#\O "optimize") #f #f (lambda (opt name arg result) (alist-cons 'optimize? #t result))) + (option '(#\l "list-languages") #f #f + (lambda (opt name arg result) + (for-each (lambda (l) + (format #t "~a~%" l)) + (get-all-available-languages)) + (exit 0))) (option '(#\f "from") #t #f (lambda (opt name arg result) (if (assoc-ref result 'from) @@ -157,6 +178,7 @@ Compile each Guile source file FILE into a Guile object. -W, --warn=WARNING emit warnings of type WARNING; use `--warn=help' for a list of available warnings + -l, --list-languages list all available languages -f, --from=LANG specify a source language other than `scheme' -t, --to=LANG specify a target language other than `objcode' -T, --target=TRIPLET produce bytecode for host TRIPLET -- 1.7.10.4