Удаление строки #lang
работает, но это означает, что ваш код больше не является модулем, что делает его довольно плохой идеей. Чтобы запустить ракетку для данного файла модуля, все, что вам нужно, это просто запустить racket
для файла, больше ничего не нужно. Например, введите это в test.rkt
:
#lang racket/base
(printf "Hi\n")
и просто запустите его с racket test.rkt
. Если вы хотите иметь флаги командной строки, вы можете использовать (current-command-line-arguments)
, чтобы получить вектор дополнительных аргументов командной строки, но есть также библиотека racket/cmdline
, которая значительно упрощает использование стандартных типов. обработки флагов. Вот пример для этого:
#lang racket/base
(require racket/cmdline)
(define excitedness "")
(define mode "Hi")
(command-line
#:multi
[("-e" "--excited") "add excitedness levels"
(set! excitedness (string-append excitedness "!"))]
#:once-each
[("-b" "--bye") "turn on \"bye\" mode"
(set! mode "Bye")])
(printf "~a~a\n" mode excitedness)
и теперь вы можете запустить его с racket test.rkt <flags>
. См. Также раздел Racket Guide , посвященный сценариям , для упрощения работы с test.rkt
.
Наконец, есть подход --main
, который вы видели - чтобы использовать его, ваш модуль должен предоставить функцию main
, которая получает все флаги командной строки в качестве аргументов. Например:
#lang racket/base
(require racket/string)
(provide main)
(define (main . xs)
(printf "You gave me ~s flags: ~a\n"
(length xs) (string-join xs ", ")))
и запустить его:
racket -t /tmp/y -m -- foo bar baz
Разбивка флага: -t
require
s ваш модуль, -m
заставляет ракетку запустить вашу функцию main
, а --
означает, что все следующие флаги переданы вашей программе. Вы можете комбинировать флаги так:
racket -tm- /tmp/y foo bar baz
и это будет то, что вы обычно добавляете в батут сценария, как описано в этом разделе руководства.
И, конечно, все это подробно описано в справочном руководстве .