如何通过命令行将文件加载到球拍中?
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
标志分解是:-t
require
s 你的模块,-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 文件?