(defpackage #:fp (:use #:common-lisp) (:export #:fp) ) (in-package #:fp) #| Example expansions (fp 1+ car) => #'(lambda (x) (1+ (car x))) (fp) => #'(lambda (x) x) (fp (> 0)) => #'(lambda (x) (> x 0)) (fp (> 0) car) => #'(lambda (x) (> (car x) 0)) |# ;;; Only handles 2 functions... (defmacro fp (&rest forms) (let ((var (gensym))) `#'(lambda (,var) ,(expand-fp-forms var forms)))) (defun expand-fp-forms (var forms) (cond ((null forms) var) ((consp (car forms)) (list* (caar forms) (expand-fp-forms var (cdr forms)) (cdar forms))) (t (list (car forms) (expand-fp-forms var (cdr forms))))))