Как вы загружаете файл в ракетку через командную строку? - PullRequest
20 голосов
/ 17 июня 2011

Я пытался запустить программу-ракетку из командной строки (через «ракетку»), но безуспешно.Согласно документации (здесь http://docs.racket -lang.org / reference / running-sa.html #% 28part._mz-cmdline% 29 ) передача -f с последующим файлом должна оценивать этот файл.Тем не менее, я не могу заставить это работать.В качестве теста я создал следующий файл:

;test.rkt
#lang racket
(define a 1)

Затем запустил его в ракетке (предположительно, загружая файл) и попытался вызвать значение:

racket -f test.rkt -i
Welcome to Racket v5.1.1.
> a
reference to undefined identifier: a

MyКонечная цель - иметь возможность запускать другую программу из сценария оболочки, используя опцию --main в сочетании с загрузкой определений с помощью -f для запуска выполнения, просто немного сбит с толку, так как я не могу этого понятьТривиальный бит работает.

Ответы [ 2 ]

31 голосов
/ 17 июня 2011

Удаление строки #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

и это будет то, что вы обычно добавляете в батут сценария, как описано в этом разделе руководства.

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

2 голосов
/ 17 июня 2011

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

;test.rkt
(define a 1)
...