【问题标题】: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 脚本启动不同的程序,只是有点困惑,因为我不能似乎让这个微不足道的工作。

【问题讨论】:

    标签: scheme racket


    【解决方案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 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
    

    标志分解是:-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)
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多