删除#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> 运行它。另请参阅 Racket 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
标志分解是:-trequires 你的模块,-m 导致球拍运行你的main 函数,-- 表示以下标志都传递给你的程序。您可以像这样组合标志:
racket -tm- /tmp/y foo bar baz
您通常会按照该指南部分中的说明将其放入脚本蹦床中。
当然,这一切都在the reference manual 中有详细描述。