(eval-when (:compile-toplevel :load-toplevel :execute) (load "~/quicklisp/setup.lisp") (ql:quickload '(:yason :alexandria :serapeum :fwoar.lisputils :osicat)) (osicat-posix:setenv "CC" "/usr/bin/gcc") (ql:quickload :net.didierverna.clon)) (defpackage :json-to-table (:use :cl :alexandria :serapeum :fw.lu)) (in-package :json-to-table) (defun hash-table-alist-rec (h-t) (map-tree (op (typecase _1 (hash-table (hash-table-alist _1)) (t _1))) (hash-table-alist h-t))) (defun get-all-keys (lis-ht &key (test 'equal)) (reduce (op (union _ _ :test test)) lis-ht :key #'hash-table-keys)) (defun tabulate (lis-ht stream) (let ((keys (get-all-keys lis-ht))) (format stream "~&~{~a~}~%~{~{~a~}~%~}" (intersperse #\tab keys) (mapcar (op (intersperse #\tab (pick keys _))) lis-ht)))) (net.didierverna.clon:defsynopsis (:postfix "FILE") (text :contents "Read in a json array and print a table")) (defun main () (net.didierverna.clon:make-context) (let ((rem (net.didierverna.clon:remainder))) (if (null (cdr rem)) (with-input-from-file (s (car rem)) (tabulate (yason:parse s) t)) (error "only one arg allowed")))) (defun build () (net.didierverna.clon:dump "json-tabulator" main))