;;; In Guile: (use-modules (ice-9 futures)) (define-syntax pcall (λ (stx) (syntax-case stx () ((pcall f val ...) (with-syntax (((future-val ...) (generate-temporaries #'(val ...)))) #'(let ((future-val (future (λ () val))) ...) (f (touch future-val) ...))))))) (pcall + 1 1) ;=> In procedure +: Wrong type argument in position 1: # ;;; In Racket: #lang racket/base (require (for-syntax racket/base) racket/future) (define-syntax pcall (λ (stx) (syntax-case stx () ((pcall f val ...) (with-syntax (((future-val ...) (generate-temporaries #'(val ...)))) #'(let ((future-val (future (λ () val))) ...) (f (touch future-val) ...))))))) (pcall + 1 1) ;=> 2 ;;; Expanded form according to DrRacket's macro stepper: ;;; Evaluates to 2 on both Racket and Guile. (let ((temp1 (future (λ () 1))) (temp2 (future (λ () 1)))) (+ (touch temp1) (touch temp2))) ;=> 2