Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env racket
- #lang racket/base
- ; --- callback version (fast)
- (define (combis_a stcs lpars callback)
- (let ((res '()))
- (let loop ((stcs (reverse stcs)) (subres '()))
- (if (null? stcs)
- (begin
- (set! res (cons subres res)) ; ditto
- (callback subres))
- (for-each
- (lambda (lpar) (loop (cdr stcs) (cons (cons (car stcs) lpar) subres)))
- lpars)))
- res))
- ; --- generator version (slow)
- (require racket/generator)
- (define (combis_b_gen stcs lpars)
- (generator ()
- (let loop ((stcs (reverse stcs)) (res '()))
- (if (null? stcs)
- (yield res)
- (for-each
- (lambda (lpar) (loop (cdr stcs) (cons (cons (car stcs) lpar) res)))
- lpars)))
- 'done))
- ; --- main
- (let* ((args (current-command-line-arguments))
- (numstcs (string->number (vector-ref args 0)))
- (stcs (build-list numstcs (lambda (i) (string-append "S_" (number->string i)))))
- (numlpars (string->number (vector-ref args 1)))
- (lpars (build-list numlpars (lambda (i) (string-append "L_" (number->string i)))))
- (verbose (string=? (vector-ref args 2) "y"))
- (algo (vector-ref args 3)))
- (cond
- ((string=? algo "a")
- (let ((res (combis_a stcs lpars (lambda (i) (when verbose (printf "combis_a: ~v\n" i))))))
- (printf "combis_a: total ~a\n" (length res))))
- ((string=? algo "b")
- (let ((res (for/list ((combi (in-producer (combis_b_gen stcs lpars) 'done)))
- (when verbose (printf "combis_b: ~v\n" combi)) combi)))
- (printf "combis_b: total ~a\n" (length res))))
- (else
- (printf "unknown command line arguments ~a\n" args))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement