移除 #lang
行是可行的,但这意味着你的代码不再是一个模块,这是一个相当糟糕的想法。要在给定的模块文件上启动 racket,只需要在文件上运行 racket
,不需要其他任何东西。例如,将以下内容放入 test.rkt
文件中:
(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
标志位的解释如下:-t
引入你的模块,-m
使 racket 运行你的 main
函数,--
表示接下来的标志位都会传递给你的程序。你可以将这些标志组合在一起使用:
racket -tm- /tmp/y foo bar baz
这通常是放在脚本跳板中的内容,就像指南部分所描述的那样。
当然,所有这些都在参考手册中详细描述。
racket file.rkt
时,它会被评估,但是我想要 REPL,所以我执行racket file.rkt -i
,但没有出现 REPL?! - Vladimir Kelesheventer!
命令。或者,使用带有新的xrepl
功能的夜间构建版本,它提供了更方便的,enter
命令。 - Eli Barzilayenter!
,但我想在 Vim 中制作一个快捷方式来评估和运行 REPL。有什么想法吗? - Vladimir Keleshev