You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Racket如何从argv获取命令行参数实现可传参问候脚本

Racket命令行参数脚本编写问题

需求说明

编写Racket脚本实现如下逻辑:

  • 以./hello.rkt my_name格式运行时,输出hello my_name
  • 未传入参数时,输出Usage: {filename} <name>,其中{filename}替换为实际的脚本文件名

问题表现

尝试从current-command-line-arguments提取参数时,一直报contract violation错误,原有问题代码如下:

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

(define name "a")  ;; 待实现提取argv[1]

(if (regexp-match-exact? #px"\\S" name) (begin
    (display "hello ")
    (display name)
    (newline)
) (begin
    (display "usage: {FILENAME} <name>")  ;; 待实现替换{FILENAME}为脚本文件名
    (newline)
    (exit 1)
))

解决方法

  • current-command-line-arguments返回的是参数向量,需要用vector-ref读取指定位置的参数,注意该向量仅包含用户传入的参数,不包含脚本文件名本身,索引0对应用户传入的第一个参数
  • 脚本文件名可通过(find-system-path 'run-file)获取
    修正后的完整代码如下:
#!/usr/bin/env racket
#lang racket/base

(define args (current-command-line-arguments))
(define filename (path->string (find-system-path 'run-file)))

(if (= (vector-length args) 1)
    (let ([name (vector-ref args 0)])
      (display "hello ")
      (displayln name))
    (begin
      (displayln (format "Usage: ~a <name>" filename))
      (exit 1)))

内容的提问来源于stack exchange,提问作者user16960082

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:27:03