With the "racket/engine" module, is the "engine" procedure supposed to capture the Racket parameter values that will be used for the proc when "engine-run" is applied? Rather than the parameters coming from the dynamic extent in which "engine-run" is applied?

The example below shows that parameters don't work with engines as I'd originally assumed. (The parts about custodians are because that's what I was originally debugging.)

#lang racket/base

(require racket/engine
         racket/file)

(printf "with engine as i'd expect...\n")
(let ((temp-path (make-temporary-file "xxx~A"))
      (temp-port #f))
  (let* ((cust (make-custodian (current-custodian)))
         (eng  (engine (lambda (disable-suspend)
                         (if (eq? (current-custodian) cust)
                             (printf "OK: current-custodian is cust\n")
(printf "FAIL: current-custodian is not cust\n"))
                         (set! temp-port
(open-output-file temp-path #:exists 'replace))))))
    (or (parameterize ((current-custodian cust))
          (engine-run 3000 eng))
        (error "engine-run timed out"))
    (custodian-shutdown-all cust))
  (if (port-closed? temp-port)
      (printf "OK: port was closed\n")
      (printf "FAIL: port was not closed\n")))

;; with engine as i'd expect...
;; FAIL: current-custodian is not cust
;; FAIL: port was not closed

(printf "with engine capturing parameters early...\n")
(let ((temp-path     (make-temporary-file "xxx~A"))
      (temp-port     #f)
      (another-param (make-parameter 'initial)))
  (let* ((cust (make-custodian (current-custodian)))
         (eng  (parameterize ((current-custodian cust)
                              (another-param     'around-engine))
                 (engine (lambda (disable-suspend)
                           (if (eq? (current-custodian) cust)
                               (printf "OK: current-custodian is cust\n")
(printf "FAIL: current-custodian is not cust\n")) (printf "(another-param) = ~S\n" (another-param))
                           (set! temp-port
(open-output-file temp-path #:exists 'replace)))))))
    (or (parameterize ((another-param 'around-engine-run))
          (engine-run 3000 eng))
        (error "engine-run timed out"))
    (custodian-shutdown-all cust))
  (if (port-closed? temp-port)
      (printf "OK: port was closed\n")
      (printf "FAIL: port was not closed\n")))

;; with engine capturing parameters early...
;; OK: current-custodian is cust
;; (another-param) = around-engine
;; OK: port was closed

Thanks,
Neil V.

____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to