我一直试图从命令行启动一个球拍程序(通过'球拍'),但一直没有成功。根据文档(此处为http://docs.racket-lang.org/reference/running-sa.html#%28part._mz-cmdline%29),传递-f
后跟文件应评估该文件。但是,我似乎无法让这个工作。作为测试,我做了以下文件:
;test.rkt
#lang racket
(define a 1)
然后,在球拍中运行它(据说加载文件)并尝试调用a的值:
racket -f test.rkt -i
Welcome to Racket v5.1.1.
> a
reference to undefined identifier: a
我的最终目标是能够使用--main
选项从shell脚本启动一个不同的程序,同时加载-f
的定义以启动执行,只是有点困惑,因为我似乎无法让这个微不足道的工作。
答案 0 :(得分:31)
删除#lang
行有效,但这意味着您的代码不再是模块,这使得它非常糟糕。要在给定的模块文件上启动球拍,您只需要在文件上运行racket
,不需要任何其他内容。例如,将其放在test.rkt
:
#lang racket/base
(printf "Hi\n")
并使用racket test.rkt
运行它。如果你想拥有命令行标志,你可以使用(current-command-line-arguments)
来获取其他命令行参数的向量,但是还有racket/cmdline
库使标准种类的标志更容易处理。这是一个例子:
#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)
现在可以使用racket test.rkt <flags>
运行它。另请参阅球拍Guide的section on scripts,以使您的test.rkt
更容易投放。
最后,您已经看到了--main
方法 - 要使用它,您的模块需要提供一个main
函数,它接收所有命令行标志作为参数。例如:
#lang racket/base
(require racket/string)
(provide main)
(define (main . xs)
(printf "You gave me ~s flags: ~a\n"
(length xs) (string-join xs ", ")))
并运行它:
racket -t /tmp/y -m -- foo bar baz
标记细分为:-t
require
是您的模块,-m
会导致球拍运行您的main
功能,--
表示以下标志都传递给你的程序。你可以像这样组合标志:
racket -tm- /tmp/y foo bar baz
这将是你通常放在脚本蹦床中的东西,如指南部分所述。
当然,这些都在the reference manual中详细描述。
答案 1 :(得分:2)
从文件中删除#lang racket
标题:
;test.rkt
(define a 1)