Mac下SBCL命令行参数获取问题求助
在SBCL中获取命令行参数的正确实现
你的问题核心是CLISP的方言扩展*ARGS*在SBCL中不存在,同时代码还有两个小问题:未声明变量、format调用格式错误。以下是修正后的脚本:
#!/opt/homebrew/bin/sbcl --script (let* ((args (cdr sb-ext:*command-line-arguments*)) ; 去掉第一个元素(脚本自身路径) (arg-one (with-input-from-string (strm (first args)) (read strm))) (arg-two (with-input-from-string (strm (second args)) (read strm)))) (format t "Argument One = ~a~%" arg-one) (format t "Argument Two = ~a~%" arg-two))
执行命令./test.lisp 11 23就能得到预期输出:
Argument One = 11 Argument Two = 23
关键修正点:
- 替换
*ARGS*为sb-ext:*command-line-arguments*:SBCL用这个标准扩展变量存储命令行参数,其中第一个元素是脚本自身的路径,所以用cdr去除它,剩下的就是传入的参数列表。 - 用
let*声明变量:避免SBCL的未定义变量警告,同时让变量作用域更清晰。 - 修复
format调用:format的第一个参数必须指定输出目标,t代表标准输出,原代码缺少这个参数会导致执行错误。
额外简化方案:
如果不需要用read解析参数(直接使用字符串形式),可以简化代码:
#!/opt/homebrew/bin/sbcl --script (let ((args (cdr sb-ext:*command-line-arguments*))) (format t "Argument One = ~a~%" (first args)) (format t "Argument Two = ~a~%" (second args)))
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

