对如何使用命令行形式感到困惑:模块中的未绑定标识符和提取参数

Confused about how to use command-line form: unbound identifier in module and extracting arguments

我正在尝试在 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

list-files.rkt:30:55: owner: unbound identifier in module
  in: owner
  context...:
   standard-module-name-resolver

command-line 的这种用法看起来遵循了 Racket 文档中的问候语示例,但 racket 似乎正在寻找已定义的函数,我只是在其中尝试为我想要的变量指定默认值使我的 find-csv 功能可用。

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

你能给我一些指点吗?谢谢。

example in the documentation, all of the flags toggle parameters 中,用于将标志设置传达给后续处理步骤(示例中未显示)。

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

(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 名称。您需要将参数实际设置为用户提供的值。