2015-02-18 9 views
9

Sono nuovo di Racket (e di Lisp in generale) e mi chiedo se c'è un modo canonico per rilevare se uno script è stato eseguito dalla riga di comando?Rilevare se lo script viene eseguito dalla riga di comando in Racket?

Per esempio, in Python il modo standard per fare questo sarebbe stato con if __name__ == __main__: come così:

def foo(): 
    "foo!" 

if __name__ == "__main__": 
    foo() 

Ora, supponiamo che io avere il seguente codice Racket, e mi piacerebbe respond ad essere invocate solo quando questo è eseguito come una sceneggiatura.

#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 '("" "")])))) 

C'è un modo semplice/standard per ottenere ciò che voglio?

risposta

8

La racchetta ha il concetto di sottomoduli main. Puoi leggere informazioni su di loro nella sezione Guida al racket dal titolo Main and Test Submodules. Fanno esattamente quello che vuoi: quando un file viene eseguito direttamente usando racket o DrRacket, viene eseguito il sottomodulo principale. Se un file viene utilizzato da un altro file utilizzando require, il sottomodulo principale non viene eseguito.

The Racket equivalente del vostro programma Python sarebbe il seguente:

#lang racket 

(define (foo) 
    "foo!") 

(module+ main 
    (foo)) 
Problemi correlati