scheme - manipulación - ¿Cómo cargar un archivo en la raqueta a través de la línea de comandos?
crear archivo en unix (2)
Elimine el encabezado de la #lang racket
de su archivo:
;test.rkt
(define a 1)
He estado intentando lanzar un programa de raquetas desde la línea de comandos (a través de ''raqueta'') pero no he tenido éxito. De acuerdo con la documentación (aquí http://docs.racket-lang.org/reference/running-sa.html#%28part._mz-cmdline%29 ) pasar -f
seguido de un archivo debe evaluar ese archivo. Sin embargo, parece que no puedo hacer que esto funcione. Como prueba, hice el siguiente archivo:
;test.rkt
#lang racket
(define a 1)
Luego, ejecutándolo en la raqueta (supuestamente cargando el archivo) e intentando recuperar el valor de a:
racket -f test.rkt -i
Welcome to Racket v5.1.1.
> a
reference to undefined identifier: a
Mi objetivo final es poder iniciar un programa diferente desde un script de shell con la opción --main
combinado con la carga de las definiciones con -f
para iniciar la ejecución, solo que estoy un poco confundido ya que parece que no puedo entender esto. Trivial poco trabajando.
La eliminación de la línea #lang
funciona, pero significa que su código ya no es un módulo, lo que lo convierte en una idea bastante mala. Para iniciar la raqueta en un archivo de módulo dado, todo lo que necesita es simplemente ejecutar la racket
en el archivo, no se necesita nada más. Por ejemplo, ponga esto en test.rkt
:
#lang racket/base
(printf "Hi/n")
y simplemente ejecútelo con racket test.rkt
. Si desea tener marcas de línea de comando, puede usar (current-command-line-arguments)
para obtener un vector de argumentos de línea de comando adicionales, pero también está la biblioteca racket/cmdline
que hace que sea mucho más fácil tener tipos estándar de procesamiento de bandera. Aquí hay un ejemplo para eso:
#lang racket/base
(require racket/cmdline)
(define excitedness "")
(define mode "Hi")
(command-line
#:multi
[("-e" "--excited") "add excitedness levels"
(set! excitedness (string-append excitedness "!"))]
#:once-each
[("-b" "--bye") "turn on /"bye/" mode"
(set! mode "Bye")])
(printf "~a~a/n" mode excitedness)
y ahora puede ejecutarlo con racket test.rkt <flags>
. Consulte también la sección sobre guiones de la Guide Raqueta para que su test.rkt
sea aún más fácil de ejecutar.
Finalmente, está el enfoque principal que ha visto: para usarlo, su módulo debe proporcionar una función main
que reciba todas las marcas de línea de comando como argumentos. Por ejemplo:
#lang racket/base
(require racket/string)
(provide main)
(define (main . xs)
(printf "You gave me ~s flags: ~a/n"
(length xs) (string-join xs ", ")))
y para ejecutarlo:
racket -t /tmp/y -m -- foo bar baz
El desglose de la bandera es: -t
require
s su módulo, -m
hace que la raqueta ejecute su función main
, y --
significa que todas las siguientes banderas se pasan a su programa. Puedes combinar las banderas así:
racket -tm- /tmp/y foo bar baz
y eso sería algo que usualmente pondrías en tu trampolín de script como se describe en esa sección de guía.
Y, por supuesto, todo esto se describe con gran detalle en el manual de referencia .