[ prog / sol / mona ]

prog


The Forced Indentation Of Code

99 2022-05-23 10:53

Here is a variation of >>90 that replaces recursion using the meme combinator with looping via call-with-current-continuation. The latter is implemented by passing lambdas to each other and nesting them in various ways, without resorting to assignment. The state of the loop is passed through the continuation.

scheme@(guile-user)> (display ((lambda (rec xjoin fore back pad n s chars) ((lambda (xjoin cell cycle) ((lambda (expand) ((lambda (chars) ((lambda (symbol) (xjoin (- (* 2 n) 1) (lambda (k) (string-append (xjoin (- (* 2 n) 1) (lambda (j) (symbol k j)) pad) "\n")) "")) (lambda (k j) (or (fore n s k j) (back n chars cell cycle k j))))) (expand chars cell))) (lambda (chars n) (xjoin (* n (string-length chars)) (lambda (x) ((lambda (idx) (substring chars idx (+ 1 idx))) (quotient x n))) "")))) (lambda (n fun sep) (rec xjoin n fun sep "")) (string-length s) (string-length chars))) (lambda (fun . args) ((lambda (cont+args) ((lambda (cont args) ((lambda (next) (apply fun next args)) (lambda args (cont (cons cont args))))) (car cont+args) (cdr cont+args))) (call-with-current-continuation (lambda (cont) (cons cont args))))) (lambda (next n fun sep acc) (if (<= n 0) "" (if (= n 1) (string-append (fun 0) acc) (next (- n 1) fun sep (string-append sep (fun (- n 1)) acc))))) (lambda (n s k j) (if (< (abs (- n 1 j)) (- n 1 (abs (- n 1 k)))) #f s)) ((lambda (extract) (lambda (n chars cell cycle k j) (extract chars (* cell (modulo (min (abs (- n 1 k)) (abs (- n 1 j))) cycle)) cell))) (lambda (str pos len) (substring str pos (+ pos len)))) " " 11 "cc" " ░▒▓█"))
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc    cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc ░░    ░░ cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc ▒▒ ░░    ░░ ▒▒ cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ cc cc cc cc cc cc cc
cc cc cc cc cc cc ██ ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ ██ cc cc cc cc cc cc
cc cc cc cc cc ██ ██ ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ ██ ██ cc cc cc cc cc
cc cc cc cc ▓▓ ▓▓ ▓▓ ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ ▓▓ ▓▓ ▓▓ cc cc cc cc
cc cc cc ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ░░    ░░ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ cc cc cc
cc cc ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░    ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ cc cc
cc                                                          cc
cc cc ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░    ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ cc cc
cc cc cc ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ░░    ░░ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ cc cc cc
cc cc cc cc ▓▓ ▓▓ ▓▓ ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ ▓▓ ▓▓ ▓▓ cc cc cc cc
cc cc cc cc cc ██ ██ ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ ██ ██ cc cc cc cc cc
cc cc cc cc cc cc ██ ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ ██ cc cc cc cc cc cc
cc cc cc cc cc cc cc ▓▓ ▒▒ ░░    ░░ ▒▒ ▓▓ cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc ▒▒ ░░    ░░ ▒▒ cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc ░░    ░░ cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc    cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
scheme@(guile-user)> 

The only change of substance, other than the rec implementation, is that xjoin no longer has to provide the invoked function as its own first argument when handing off to the next iteration.

267


VIP:

do not edit these