On this page:
21.1.1 Interactive Mode
21.1.2 Module Mode
21.1.3 Load Mode

21.1 Running racket and gracket🔗

gracket 可执行文件与 racket 相同,但进行了 使其作为 GUI 应用程序而不是控制台应用程序运行的小型调整。 例如,gracket 默认在 GUI 窗口中以 interactive mode 运行, 而不是控制台提示符。不过,GUI 应用程序也可以使用普通的 racket 运行。

根据命令行参数的不同,racketgracket 可在 interactive modemodule modeload mode 下运行。

21.1.1 Interactive Mode🔗

racket 在没有命令行参数的情况下运行时(除了 配置选项,如 -j),它会启动一个带有 >  提示符的 REPL

  Welcome to Racket v9.2 [cs].

  

  >

要增强您的 REPL 体验,请参见 xrepl;有关 GNU Readline 支持的信息,请参见 readline

为了初始化 REPL 的环境,racket 首先 requires racket/init module,它提供了 racket 的所有 binding,并且还安装了 pretty-print 用于显示 结果。最后,racket 在启动 REPL 之前加载由 (find-system-path 'init-file) 报告的文件(如果存在)。

如果提供了任何命令行参数(除了配置 选项),添加 -i--repl 以重新启用 REPL。例如,

  racket -e '(display "hi\\n")' -i

在启动时显示 "hi",但仍呈现 REPL

如果 module-requiring flags 出现在 -i/--repl 之前, 它们会取消自动 require racket/init。此 行为可用于以不同的语言初始化 REPL 的环境。例如,

  racket -l racket/base -i

使用一个更小的初始语言来启动 REPL(加载 速度更快)。请注意,大多数 module 不提供 Racket 的基本语法, 包括 function-call 语法和 require。例如,

  racket -l racket/date -i

会产生一个对所有表达式都会失败的 REPL, 因为 racket/date 仅提供少量函数,不提供 需要在 REPL 中求值顶层函数调用所必需的 #%top-interaction#%app bindings。

如果 module-requiring flag 出现在 -i/--repl 之后 而不是之前,则会在 racket/init 之后 require 该 module 以增强初始环境。例如,

  racket -i -l racket/date

启动一个有用的 REPL,除了 racket 的 exports 之外还可用 racket/date

21.1.2 Module Mode🔗

如果在任何命令行 switch 之前向 racket 提供了文件参数 (除了配置选项),则该文件会被作为 module 被 require, 并且(除非指定了 -i/--repl),不会启动 REPL。例如,

  racket hello.rkt

require "hello.rkt" module 然后退出。文件名之后的任何参数 (无论是 flag 还是其他)都会作为命令行参数被保留, 供被 require 的 module 通过 current-command-line-arguments 使用。

如果使用命令行 flags,则 -u--require-script flag 可用于显式地 require 文件 作为 module。-t--require flag 类似,区别在于 额外的命令行 flags 是由 racket 处理的, 而不是保留给被 require 的 module。例如,

  racket -t hello.rkt -t goodbye.rkt

require "hello.rkt" module,然后 require "goodbye.rkt" module,然后退出。

-l--lib flag 类似于 -t/--require, 但它使用 lib module path 而不是文件路径来 require module。例如,

  racket -l raco

与在没有参数的情况下运行 raco 可执行文件相同, 因为 raco module 是该可执行文件的主 module。

注意,如果您想要将命令行 flags 传递给 上面的 raco,您需要使用 -- 来保护 flags, 这样 racket 就不会尝试自行解析它们:

  racket -l raco -- --help

21.1.3 Load Mode🔗

-f--load flag 支持直接对文件中的顶层 expressions 进行 load,与 module 文件中的 expressions 相对。 这种求值类似于启动一个 REPL 并直接输入 expressions, 除了结果不会被打印。例如,

  racket -f hi.rkts

load "hi.rkts" 并退出。注意,load mode 通常是一个糟糕的选择,原因在 A Note to Readers with Lisp/Scheme Experience 中有解释; 使用 module mode 通常更好。

-e--eval flag 接受要直接求值的 expression。 与文件加载不同,expression 的结果会被打印, 就像在 REPL 中一样。例如,

  racket -e '(current-seconds)'

打印自 1970 年 1 月 1 日以来的秒数。

对于文件加载和 expression 求值,顶层环境的创建方式与 interactive mode 中的相同: 除非先指定了其他 module,否则 require racket/init。例如,

  racket -l racket/base -e '(current-seconds)'

可能运行更快,因为它使用更小的 racket/base 语言来初始化用于求值的环境, 而不是 racket/init