2015-02-18 11 views
9

Racket’te (ve genel olarak Lisp’lerde) yeniyim ve bir komut dosyasının komut satırından çalıştırıldığını tespit etmenin kanonik bir yolu olup olmadığını merak ediyorum. Aşağıdaki Raket koduna sahip varsayalım, ben respond istiyorum, ŞimdiScript komut dosyasının Racket'te yürütülüp yürütülmediğini tespit etme?

def foo(): 
    "foo!" 

if __name__ == "__main__": 
    foo() 

yalnızca çağırılacak:

Örneğin, Python

yapmak standart yolu bu şekilde if __name__ == __main__: ile olacağını Bu bir komut dosyası olarak çalıştırılır.

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

İstediğim şeyi elde etmenin kolay/standart bir yolu var mı?

cevap

8

Raket, main alt modülleri konseptine sahiptir. Bunları, Main and Test Submodules başlıklı Racket Guide bölümünde okuyabilirsiniz. Tam olarak istediğiniz şeyi yaparlar - bir dosya doğrudan racket veya DrRacket kullanılarak çalıştırıldığında, ana alt modül çalıştırılır. Bir dosya require kullanarak başka bir dosya tarafından kullanılıyorsa, ana alt modül çalıştırılmıyor.

#lang racket 

(define (foo) 
    "foo!") 

(module+ main 
    (foo)) 
:

Python programının Raket eşdeğer aşağıdaki olurdu

İlgili konular