我一直试图从命令行发起一个球拍程序(通过'球拍'),但没有取得成功.根据文档(这里http://docs.racket-lang.org/reference/running-sa.html#%28part._mz-cmdline%29)传递-f后跟文件应该评估该文件.但是,我似乎无法让这个工作.作为测试,我做了以下文件:
;test.rkt
#lang racket
(define a 1)
Run Code Online (Sandbox Code Playgroud)
然后,在球拍中运行它(据说加载文件)并尝试调用a的值:
racket -f test.rkt -i
Welcome to Racket v5.1.1.
> a
reference to undefined identifier: a
Run Code Online (Sandbox Code Playgroud)
我的最终目标是能够从shell脚本启动一个不同的程序,使用--main选项加载定义-f以启动执行,只是有点困惑,因为我似乎无法让这个微不足道的工作.
Eli*_*lay 32
删除#lang行是有效的,但这意味着您的代码不再是一个模块,这使它成为一个非常糟糕的主意.要在给定的模块文件上启动球拍,您只需要racket在文件上运行,不需要任何其他内容.例如,把它放在test.rkt:
#lang racket/base
(printf "Hi\n")
Run Code Online (Sandbox Code Playgroud)
然后运行它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)
Run Code Online (Sandbox Code Playgroud)
你现在可以用它来运行它racket test.rkt <flags>.另请参阅"球拍指南 "中有关使脚本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 ", ")))
Run Code Online (Sandbox Code Playgroud)
并运行它:
racket -t /tmp/y -m -- foo bar baz
Run Code Online (Sandbox Code Playgroud)
标志分解是:-t requires你的模块,-m导致racket运行你的main功能,并--意味着以下标志都传递给你的程序.您可以像这样组合标志:
racket -tm- /tmp/y foo bar baz
Run Code Online (Sandbox Code Playgroud)
这将是你通常放在你的脚本蹦床中的东西,如该指南部分所述.
当然,这些都在参考手册中有详细描述.