2015-02-18 19 views
9

Jestem nowy w Racket (i ogólnie w Lisp) i zastanawiam się, czy istnieje kanoniczny sposób na wykrycie, czy skrypt został uruchomiony z wiersza poleceń?Wykrywanie, czy skrypt został wykonany z wiersza poleceń w Racket?

Na przykład w Pythonie standardowy sposób, aby zrobić to byłoby tak jak z if __name__ == __main__::

def foo(): 
    "foo!" 

if __name__ == "__main__": 
    foo() 

Teraz załóżmy, że ma następujący kod rakieta, i chciałbym respond powoływać się tylko wtedy, gdy jest uruchamiany jako skrypt.

#lang racket 
(require racket/cmdline) 

(define hello? (make-parameter #f)) 
(define goodbye? (make-parameter #f)) 

(command-line #:program "cmdtest" 
       #:once-each 
       [("-H" "--hello") "Add Hello Message" (hello? #t)] 
       [("-G" "--goodbye") "Add goodbye Message" (goodbye? #t)]) 

(define (respond) 
    (printf "~a\n" 
      (apply string-append 
       (cond 
        [(and (hello?) (goodbye?)) '("Hello" " and goodbye.")] 
        [(and (hello?) (not (goodbye?))) '("Hello." "")] 
        [(and (not (hello?)) (goodbye?)) '("" "Goodbye.")] 
        [else '("" "")])))) 

Czy istnieje łatwy/standardowy sposób osiągnięcia tego, czego chcę?

Odpowiedz

8

Rakieta ma koncepcję submodułów main. Możesz o nich przeczytać w sekcji Poradnik rakietowy pod tytułem Main and Test Submodules. Robią dokładnie to, czego potrzebujesz - gdy plik jest uruchamiany bezpośrednio przy użyciu racket lub DrRacket, główny moduł jest wykonywany. Jeśli plik jest używany przez inny plik przy użyciu require, główny moduł podniowy nie jest uruchamiany.

Równowartość Rakieta z programu Python byłyby następujące:

#lang racket 

(define (foo) 
    "foo!") 

(module+ main 
    (foo))