Подтвердить что ты не робот

Как загрузить файл в ракетку через командную строку?

Я пытаюсь запустить программу ракетки из командной строки (через "ракетку" ), но не добился успеха. Согласно документации (здесь 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 для запуска выполнения, просто стали немного озадачены, так как я могу Кажется, что этот тривиальный бит работает.

4b9b3361

Ответ 1

Удалите заголовок #lang racket из вашего файла:

;test.rkt
(define a 1)

Ответ 2

Удаление строки #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, как описано в этом разделе руководства.

И, конечно, все это подробно описано в справочном руководстве.