如何在命令行启动Racket时直接执行XREPL的,en命令?
在命令行直接执行Racket XREPL加载文件命令的解决方法
问题背景
在Stack Overflow上看到可通过XREPL加载Racket文件,交互模式下操作正常:
$ racket Welcome to Racket vX.X.X. -> ,en foo.rkt 42 "foo.rkt">
尝试用命令行直接执行该XREPL命令时出错,使用的命令:
$ racket -ie ',en foo.rkt'
报错信息:
Welcome to Racket v7.2. string::1: unquote: not in quasiquote in: (unquote en) location...: string::1 context...: do-raise-syntax-error expand-capturing-lifts temp118_0 temp91_0 compile15 temp85_0 >
错误原因
-e参数要求传入的是合法的Racket表达式,但,en是XREPL专属的命令语法,并非标准Racket代码。Racket会把,en解析为(unquote en),而unquote只能在准引用(quasiquote)环境中使用,因此抛出语法错误。
解决方法
要在命令行启动时直接执行XREPL命令,需要先加载XREPL模块,再通过合法的Racket接口调用命令:
方法一:调用XREPL命令执行函数
使用-l xrepl加载XREPL模块,再用-e调用内部函数执行目标命令:
racket -l xrepl -i -e '(xrepl/command #f "en foo.rkt")'
-l xrepl:加载XREPL模块-i:启动交互式REPL(执行完命令后保持会话)-e '(xrepl/command #f "en foo.rkt")':调用XREPL内部函数执行en foo.rkt命令
方法二:通过XREPL启动参数传递命令
利用--分隔Racket参数与XREPL自身参数,直接传递启动命令:
racket -l xrepl -i -- -e 'en foo.rkt'
--:区分Racket全局参数和XREPL专属参数-e 'en foo.rkt':指定XREPL启动时执行的命令
内容的提问来源于stack exchange,提问作者geuristic
相关产品推荐
相关产品推荐

