检测脚本是否从 Racket 中的命令行执行?
Detecting if script executed from command line in Racket?
我是 Racket(和一般的 Lisp)的新手,我想知道是否有一种规范的方法来检测脚本是否来自命令行 运行?
例如,在 Python 中,执行此操作的标准方法是 if __name__ == __main__:
,如下所示:
def foo():
"foo!"
if __name__ == "__main__":
foo()
现在,假设我有以下 Racket 代码,我希望 respond
仅在 运行 作为脚本时被调用。
#lang racket
(require racket/cmdline)
(define hello? (make-parameter #f))
(define goodbye? (make-parameter #f))
(command-line #:program "cmdtest"
#:once-each
[("-H" "--hello") "Add Hello Message" (hello? #t)]
[("-G" "--goodbye") "Add goodbye Message" (goodbye? #t)])
(define (respond)
(printf "~a\n"
(apply string-append
(cond
[(and (hello?) (goodbye?)) '("Hello" " and goodbye.")]
[(and (hello?) (not (goodbye?))) '("Hello." "")]
[(and (not (hello?)) (goodbye?)) '("" "Goodbye.")]
[else '("" "")]))))
是否有 easy/standard 方法来实现我想要的?
Racket 有 main
个子模块的概念。您可以在标题为 Main and Test Submodules 的球拍指南部分中阅读它们。他们做的正是你想要的——当一个文件是 运行 直接使用 racket
或 DrRacket 时,主要的子模块被执行。如果一个文件被另一个使用 require
的文件使用,则主子模块不是 运行.
你的 Python 程序的 Racket 等价物如下:
#lang racket
(define (foo)
"foo!")
(module+ main
(foo))
我是 Racket(和一般的 Lisp)的新手,我想知道是否有一种规范的方法来检测脚本是否来自命令行 运行?
例如,在 Python 中,执行此操作的标准方法是 if __name__ == __main__:
,如下所示:
def foo():
"foo!"
if __name__ == "__main__":
foo()
现在,假设我有以下 Racket 代码,我希望 respond
仅在 运行 作为脚本时被调用。
#lang racket
(require racket/cmdline)
(define hello? (make-parameter #f))
(define goodbye? (make-parameter #f))
(command-line #:program "cmdtest"
#:once-each
[("-H" "--hello") "Add Hello Message" (hello? #t)]
[("-G" "--goodbye") "Add goodbye Message" (goodbye? #t)])
(define (respond)
(printf "~a\n"
(apply string-append
(cond
[(and (hello?) (goodbye?)) '("Hello" " and goodbye.")]
[(and (hello?) (not (goodbye?))) '("Hello." "")]
[(and (not (hello?)) (goodbye?)) '("" "Goodbye.")]
[else '("" "")]))))
是否有 easy/standard 方法来实现我想要的?
Racket 有 main
个子模块的概念。您可以在标题为 Main and Test Submodules 的球拍指南部分中阅读它们。他们做的正是你想要的——当一个文件是 运行 直接使用 racket
或 DrRacket 时,主要的子模块被执行。如果一个文件被另一个使用 require
的文件使用,则主子模块不是 运行.
你的 Python 程序的 Racket 等价物如下:
#lang racket
(define (foo)
"foo!")
(module+ main
(foo))