如何通过命令行将文件加载到球拍?

Mic*_*ess 21 scheme racket

我一直试图从命令行发起一个球拍程序(通过'球拍'),但没有取得成功.根据文档(这里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)

这将是你通常放在你的脚本蹦床中的东西,如该指南部分所述.

当然,这些都在参考手册中有详细描述.

  • 如果你想在模块中使用REPL,像往常一样启动球拍,然后使用[`enter!`](http://docs.racket-lang.org/reference/enter.html#%28form._%28%28lib ._racket/enter..rkt%29._enter!%29%29).或者,使用新的`xrepl`工具进行夜间构建,为您提供更方便的`,enter`命令. (4认同)

yar*_*ian 4

#lang racket从文件中删除标头:

;test.rkt
(define a 1)
Run Code Online (Sandbox Code Playgroud)