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
相关产品推荐
相关产品推荐

