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

Posted

技术标签:

【中文标题】如何通过命令行将文件加载到球拍中?【英文标题】:How do you load a file into racket via command line? 【发布时间】:2011-09-16 20:14:36 【问题描述】:

我一直在尝试从命令行(通过“球拍”)启动球拍程序,但没有成功。根据文档(此处为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 选项结合使用 -f 加载定义以启动执行,从而能够从 shell 脚本启动不同的程序,只是有点困惑,因为我不能似乎让这个微不足道的工作。

【问题讨论】:

【参考方案1】:

删除#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 中有详细描述。

【讨论】:

嗨,我很困惑,当我执行 racket file.rkt 时,它会被评估,但我想要 REPL,所以我执行 racket file.rkt -i 但没有 REPL?! 如果你想在一个模块中使用 REPL,像往常一样启动球拍,然后使用enter!。或者,使用带有新的xrepl 工具的夜间构建,它为您提供更方便的,enter 命令。 现在我使用enter!,但我想在 Vim 中创建一个快捷方式来评估和运行 REPL。有什么想法吗? 我对 vim 了解不多——但这个想法是不是和 vi 类似,在其中启动编辑器,编写一些代码,然后退出并在 shell 中运行东西?对于这种工作模式,我提到的新的XREPL 很有用——你会得到一个,e 命令,它只是在给定文件上运行你的$EDITOR,默认为你输入的模块。跨度> 是的,这对我来说很理想,我正在下载每晚构建的版本(尽管在 racket-lang.org 上很难找到。我想知道在 XREPL 之前通常的工作流程是什么?在 vim 中你可以在不退出编辑器的情况下执行 shell 命令(并与它们交互)。所以你可以设置它类似于 DrRacket (嗯,现在有 XREPL)。我想之前应该有一些解决方法......或者也许每个人都很高兴使用 DrRacket,不需要其他编辑器。【参考方案2】:

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

;test.rkt
(define a 1)

【讨论】:

谢谢!认为这一定很简单——我已经习惯了在 drracket 中工作,我从来没有想过这可能会导致问题。 我想指出,我没有删除我的答案,因为下面是 Eli 的 TL;DR 版本。但你应该真的关注他。 无需修改文件即可在shell中轻松完成:racket -i -f <(tail -n +2 test.rkt)

以上是关于如何通过命令行将文件加载到球拍中?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过命令行将 Python Notebook 转换为 Python 文件?

如何通过命令行将 XML 文件导入“Charles Proxy > Map Local”

使用命令行将 csv 文件加载到大查询中时面临问题

如何通过命令行将 iOS 应用上传到应用商店

如何在命令行将文件从远程服务器移动到 s3

如何使用 VLC 或 FFMPEG 命令行将外部音轨添加到视频文件