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

时间:2011-06-17 00:57:43

标签: scheme racket

我一直试图从命令行启动一个球拍程序(通过'球拍'),但一直没有成功。根据文档(此处为http://docs.racket-lang.org/reference/running-sa.html#%28part._mz-cmdline%29),传递-f后跟文件应评估该文件。但是,我似乎无法让这个工作。作为测试,我做了以下文件:

;test.rkt
#lang racket
(define a 1)

然后,在球拍中运行它(据说加载文件)并尝试调用a的值:

racket -f test.rkt -i
Welcome to Racket v5.1.1.
> a
reference to undefined identifier: a

我的最终目标是能够使用--main选项从shell脚本启动一个不同的程序,同时加载-f的定义以启动执行,只是有点困惑,因为我似乎无法让这个微不足道的工作。

2 个答案:

答案 0 :(得分:31)

删除#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>运行它。另请参阅球拍Guidesection 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 require是您的模块,-m会导致球拍运行您的main功能,--表示以下标志都传递给你的程序。你可以像这样组合标志:

racket -tm- /tmp/y foo bar baz

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

当然,这些都在the reference manual中详细描述。

答案 1 :(得分:2)

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

;test.rkt
(define a 1)