(in-package :fwoar.lisputils) ;; (multiple-value-call #'local-time:encode-timestamp ;; (limit-values 7 ;; (substitute-values 0 0 0 1 ;; (local-time:decode-timestamp ;; (local-time:now))))) (defmacro skip-values (n form) (let* ((gensyms (loop repeat n collect (gensym "V"))) (ignore-sym (gensym)) (value-limiter `(lambda (,@gensyms &rest ,ignore-sym) (declare (ignore ,@gensyms)) (values-list ,ignore-sym)))) `(multiple-value-call ,value-limiter ,form))) (defmacro limit-values (n form) (let* ((gensyms (loop repeat n collect (gensym "V"))) (ignore-sym (gensym)) (value-limiter `(lambda (,@gensyms &rest ,ignore-sym) (declare (ignore ,ignore-sym)) (values ,@gensyms)))) `(multiple-value-call ,value-limiter ,form))) (defmacro substitute-values (&rest forms) (let* ((call (car (last forms))) (values (butlast forms)) (num-values (length values))) `(multiple-value-call #'values ,@values (skip-values ,num-values ,call)))) (defmacro transform-first-value ((transform form)) `(let ((values (multiple-value-list ,form))) (values-list (list* (,transform (car values)) (cdr values))))) (in-package :fwoar.lisputils.shortcuts) (defmacro ~> ((transform form)) `(transform-first-value (,transform ,form)))