gracket和racket一样执行,但是经过了细微的调整使它表现的想一个gui程序而不是一个命令行程序。比如,gracket默认运行交互模式而不是命令行模式。
根据命令行参数,racket或者gracket运行在交互模式,模块模式,或者加载模式。
21.1.1交互模式
当racket运行没有命令行参数的时候,它启动REPL并打印>提示符
为了初始化REPL环境,racket首先加载racket/init模块,它能提供所有racket,也安装了pretty-print显示结果。最后,racket加载了(find-system-path 'init-file)文件。
如果模块语法出现在-i/--repl之前,会取消自动加载racket/init。这样就可以使用不同语言来初始化REPL环境。
racket -l racket/base -i
如上使用一个更小的语言启动REPL。但是要注意的是,但多数没款没有提供racket的基本语法,包括函数调用和require。
如果一个模块在-i/--repl之后引入,那么模块就在racket/init之后引入初始环境。比如
racket -i -l racket/date
启动了一个repl,并把racket/date导出到racket环境。
21.1.2模块模式
如果一个文件参数提供给racket在任何命令行切换之前,那么这个文件作为一个模块被导入,然后退出。
racket hello.rkt
任何参数在文件名后面的,都会作为命令行参数保留并且可以用通过导出current-command-lint-arguments来使用。
-u --require-script 可以明确的导入一个模块。
-t --require 与u相似
-l --lib于t想相似,但是它使用的是模块路径而不是文件路径。
racket -l raco
和直接欲行raco相同,因为raco是一个可执行的主模块。
如果你想传递参数在raco后面,你需要一个--。
racket -l raco -- --help
21.1.3 加载模式
-f和--load支持直接加载文件中的表达式。这种方式和启动一个repl然后输入表达式执行但是不打印结果一样。但是它并不是一个好主意,更好的方式是使用模块模式。
-e 或者--eval接受一个表单式然后直接执行。但是跟加载不同,结果会被打印。
racket -e '(current-seconds)'
文件加载和表达式执行,顶层环境和穿件交互模式racket/init一样,除非指定另外一个模块。
racket -l racket/base -e '(current-seconds)'
上面这个命令运行更快,因为它用racket/base来初始化环境而不是使用racket/init。
网友评论