(import
scheme
(chicken base)
(chicken format)
(chicken string)
(chicken condition)
)
(import libyaml)
(let* (
(yaml ((yaml<-)))
(~S (lambda (?) (sprintf "~S" ?)))
(and* (lambda (L) (foldl (lambda (l r) (and l r)) #t L)))
(or* (lambda (L) (foldl (lambda (l r) (or l r)) #f L)))
(max* (lambda (L) (apply max L)))
(string+ (lambda (str . ..)
(apply string-append (map ->string (cons str ..)))
))
(assoc* (lambda (key alist) (cdr (assoc key alist))))
(assoc*y (lambda (key ymap) (let* ((pair (assoc key (car ymap))))
(if pair
(cdr pair)
(abort (condition `(exn message ,(sprintf
"key is not it the yaml mapping:\n~S\n->\n~S"
key ymap
))))
)
)))
(--> (lambda (ymap . /key)
(define (--> y k) (if (null? k)
y (--> (assoc*y (car k) y) (cdr k))
))
(--> ymap /key)
))
) (let-syntax (
(?? (syntax-rules()
((?? to-check p ...)
(if (not (and*
(map (lambda (@) (@ to-check))
(foldr
(lambda (l r) (cond
((and (equal? l not) (not (null? r)))
(cons (compose not (car r)) (cdr r)))
(else (cons l r))
))
'()
(list p ...)
))
))
(abort(condition `(exn message
,(string+ '(p ...) '? " NO:\n" (~S to-check)))))
)
)
))
(write/ (syntax-rules() ((write/ towrite port ...)
(begin (write towrite port ...)(newline port ...))
)))
(-- (syntax-rules() ((-- .. ...)
(if (procedure? (car (list .. ...)))
(- (.. ...) 1) (- .. ... 1)))))
(++ (syntax-rules() ((++ .. ...)
(if (procedure? (car (list .. ...)))
(+ (.. ...) 1) (+ .. ... 1)))))
(list-ref* (syntax-rules()
((list-ref /l i) (if (>= i 0)
(list-ref /l i)
(list-ref /l (+ (length /l) i))
))
))
) (let* (
(ewrite/ (lambda (towrite) (write/ towrite (current-error-port))))
(write/ (lambda (towrite) (write/ towrite)))
(-> (lambda (/l . /i)
(define (-> /l /i) (if (null? /i) /l (-> (list-ref* /l (car /i)) (cdr /i))))
(-> /l /i)
))
(/ylist (vector->list yaml))
; col-first
(/tab/col/row (list
(map (lambda (?) (--> ? "des" "yaml")) /ylist)
(map (lambda (?) (--> ? "des" "ss")) /ylist)
(let ((/e.g. (map vector->list (map (lambda (?) (--> ? "e.g.")) /ylist))))
(map
(lambda (e.g.) (list
(map (lambda (e) (--> e "yaml")) e.g.)
(map (lambda (e) (--> e "ss")) e.g.)
))
/e.g.
)
)
))
(svg->str (lambda (svg)
(define (svg->str svg) (let
(
(tag (car svg))
(attr (cadr svg))
(>< (cddr svg))
)
(sprintf "<~A ~A>~A~A>"
tag
(string-intersperse
(map (lambda (?) (sprintf "~A=~S" (car ?) (cdr ?))) attr)
" " #t)
(cond
((null? ><) "")
((pair? ><) (string-intersperse (map :svg->str ><) "\n" #t))
(else ><)
)
tag
)
))
(svg->str svg)
))
; `("tag" (("k" . "v")) . (("intag" ("ink" . "inv") . "content")))
; => content
)
(print "")
)))