Command line interface 困惑于如何使用命令行表单:模块中的未绑定标识符和提取参数

Command line interface 困惑于如何使用命令行表单:模块中的未绑定标识符和提取参数,command-line-interface,racket,command-line-tool,Command Line Interface,Racket,Command Line Tool,我试图在Racket中制作一个基本的(但专门的)命令行文件搜索工具,供我个人使用。以下是我到目前为止的情况: #! /usr/bin/env racket #lang racket/base (require racket/path) (require racket/cmdline) (require racket/string) (define (basename f) (path->string (file-name-from-path f))) (define (plain

我试图在Racket中制作一个基本的(但专门的)命令行文件搜索工具,供我个人使用。以下是我到目前为止的情况:

#! /usr/bin/env racket
#lang racket/base

(require racket/path)
(require racket/cmdline)
(require racket/string)

(define (basename f)
  (path->string (file-name-from-path f)))

(define (plain-name? path)
  (regexp-match? "^[A-Za-z]+$" (basename path)))

(define (find-csv root [name ""] [loc ""] [owner ""] [max 10000])
  (define m 0)
  (for ([f (in-directory root plain-name?)]
        #:when (and (file-exists? f)
                    (filename-extension f)
                    (bytes=? #"csv" (filename-extension f))
                    (string-contains? (path->string f) loc)
                    (string-contains? (basename f) name))
        #:break (>= m max))
    (set! m (add1 m))
    (displayln f)))

(define args
  (command-line
   #:once-each
   [("-n" "--max-paths") "Maximum number of file paths to return" (max 10000)]
   [("-o" "--owner") "Limit search to certain owners" (owner "")]
   [("-t" "--template") "Limit search to certain templates" (template "")]
   [("-l" "--location")
    "Limit search to directory structure containing location"
    (loc "")]
   [("-p" "--root-path") "Look under the root path" (root "/home/wdkrnls")]))
我的第一个问题是,我试图通过运行它时出错

./list-files.rkt

使用
命令行
似乎遵循Racket文档中的问候语示例,但Racket似乎在寻找已定义的函数,其中我只是尝试为变量指定默认值,我希望这些变量可用于我的
查找csv
函数

我的第二个问题是,从文档中我不清楚如何使用这些参数从命令行调用
find csv
。文档中的示例仅涉及一个参数的基本情况。我没有必需的参数,但有几个可选参数

你能给我一些建议吗?谢谢。

在文档中的中,所有用于将标志设置传达给后续处理步骤(示例中未显示)的标志切换

因此,在您的特定情况下,您可以定义如下参数:

(define max (make-parameter 10000))
(define owner (make-parameter ""))
(define template (make-parameter "")
(define loc (make-parameter ""))
(define root (make-parameter "/home/wdkrnls"))
这里的参数是参数的默认值。然后,您可以使用参数值调用
find csv
(通过将参数用作函数,如
(max)
),也可以更改
find csv
,使其不接受任何参数,而直接访问参数

另外,您的标志语法可能不太正确。你可能希望每一个都像这样:

[("-n" "--max-paths") max-arg
                      "Maximum number of file paths to return"
                      (max max-arg)]
注意添加的
max arg
名称。您需要这样才能将参数实际设置为用户提供的值。

在文档中,所有用于将标志设置传达给后续处理步骤(示例中未显示)的标志切换

因此,在您的特定情况下,您可以定义如下参数:

(define max (make-parameter 10000))
(define owner (make-parameter ""))
(define template (make-parameter "")
(define loc (make-parameter ""))
(define root (make-parameter "/home/wdkrnls"))
这里的参数是参数的默认值。然后,您可以使用参数值调用
find csv
(通过将参数用作函数,如
(max)
),也可以更改
find csv
,使其不接受任何参数,而直接访问参数

另外,您的标志语法可能不太正确。你可能希望每一个都像这样:

[("-n" "--max-paths") max-arg
                      "Maximum number of file paths to return"
                      (max max-arg)]
注意添加的
max arg
名称。您需要将参数实际设置为用户提供的值