2015-02-18 17 views
9

Tôi mới dùng Racket (và của Lisp nói chung) và tôi tự hỏi nếu có một cách kinh điển để phát hiện nếu một kịch bản được chạy từ dòng lệnh?Phát hiện nếu tập lệnh được thực thi từ dòng lệnh trong Racket?

Ví dụ, trong Python cách tiêu chuẩn để làm được điều này sẽ có if __name__ == __main__: như vậy:

def foo(): 
    "foo!" 

if __name__ == "__main__": 
    foo() 

Bây giờ, giả sử tôi có mã vợt sau, và tôi muốn respond được gọi chỉ khi điều này được chạy dưới dạng tập lệnh.

#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ó cách nào dễ dàng/tiêu chuẩn để đạt được những gì tôi muốn không?

Trả lời

8

Vợt có khái niệm là main mô-đun con. Bạn có thể đọc về chúng trong phần Hướng dẫn vợt có tên Main and Test Submodules. Chúng thực hiện chính xác những gì bạn muốn - khi một tệp được chạy trực tiếp bằng cách sử dụng racket hoặc DrRacket, mô-đun con chính được thực hiện. Nếu tệp được sử dụng bởi một tệp khác bằng cách sử dụng require, mô-đun con chính không chạy.

Các vợt tương đương với chương trình Python của bạn sẽ là như sau:

#lang racket 

(define (foo) 
    "foo!") 

(module+ main 
    (foo)) 
Các vấn đề liên quan