Scheme中如何将可变参数函数的参数列表展开传递给subprocess
解决Scheme中可变参数列表展开传给subprocess的问题
这问题我熟!你现在的函数只取了args列表的第一个元素传给subprocess,要想把所有参数都传进去,得用Scheme里的apply函数——它就是专门用来处理把列表展开成函数参数的场景的。
修改后的代码
(define (chrome . args) (apply subprocess #f #f #f "/usr/bin/google-chrome" args))
为什么这么写?
原来的代码里,你用(car args)只传入了第一个参数,而且如果调用时不带任何参数((chrome)),还会因为car作用在空列表上报错。
而apply的作用是:接受一个函数、若干固定参数,最后跟上一个列表,它会把这个列表里的元素逐个展开作为函数的后续参数。比如当你调用(chrome "--incognito" "https://example.com")时,args是'("--incognito" "https://example.com"),apply会把subprocess的调用转换成:
(subprocess #f #f #f "/usr/bin/google-chrome" "--incognito" "https://example.com")
完全符合subprocess要求的“命令后逐个传入参数”的格式。
额外提示
如果需要处理args为空的情况(比如直接打开Chrome不带任何参数),这个写法也能正常工作——apply会把空列表展开成没有额外参数,也就是调用(subprocess #f #f #f "/usr/bin/google-chrome"),这和你直接在终端敲google-chrome的效果一致。
内容的提问来源于stack exchange,提问作者ForeverConfused
相关产品推荐
相关产品推荐

