Ответ 1
Удалите заголовок #lang racket
из вашего файла:
;test.rkt
(define a 1)
Я пытаюсь запустить программу ракетки из командной строки (через "ракетку" ), но не добился успеха. Согласно документации (здесь http://docs.racket-lang.org/reference/running-sa.html#%28part._mz-cmdline%29) передача -f
, за которой следует файл, должна оценить этот файл. Однако я не могу заставить это работать. В качестве теста я сделал следующий файл:
;test.rkt
#lang racket
(define a 1)
Затем, запустив его в racket (предположительно загружая файл) и попытавшись вызвать значение a:
racket -f test.rkt -i
Welcome to Racket v5.1.1.
> a
reference to undefined identifier: a
Моя конечная цель - запустить другую программу из оболочки script, используя опцию --main
в сочетании с загрузкой определений с помощью -f
для запуска выполнения, просто стали немного озадачены, так как я могу Кажется, что этот тривиальный бит работает.
Удалите заголовок #lang racket
из вашего файла:
;test.rkt
(define a 1)
Удаление строки #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
ваш модуль, -m
заставляет racket запускать вашу функцию main
, а --
означает, что все флаги передаются в вашу программу. Вы можете комбинировать флаги так:
racket -tm- /tmp/y foo bar baz
и это будет то, что вы обычно помещаете в свой трамвай script, как описано в этом разделе руководства.
И, конечно, все это подробно описано в справочном руководстве.