Since comparison operators in scheme are plain procedures rather than syntax, they can be passed around as needed and output by other expressions.
scheme@(guile-user)> (display ((lambda (rec xjoin pred n s) ((lambda (xjoin) ((lambda (z) (xjoin (* 2 n) (lambda (k) (string-append (xjoin (* 2 n) (lambda (j) (if (pred n k j) s z)) " ") "\n")) "")) (xjoin (string-length s) (lambda (k) " ") ""))) (lambda (n fun sep) (rec xjoin n fun sep "")))) (lambda (f . args) (apply f (cons f args))) (lambda (self n fun sep acc) (if (<= n 0) "" (if (= n 1) (string-append (fun 0) acc) (self self (- n 1) fun sep (string-append sep (fun (- n 1)) acc))))) ((lambda (split) (lambda (n k j) (apply (lambda (k up j left) ((if (eq? up left) >= <=) k j)) `(,@(split n k) ,@(split n j))))) (lambda (n x) (if (< x n) `(,(- n 1 x) #t) `(,(- x n) #f)))) 8 "wind"))
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
wind wind wind wind wind wind wind wind wind
scheme@(guile-user)>