(eval-when (:load-toplevel :compile-toplevel :execute)
(defun simple-lambda-list-p (lambda-list)
(notany (lambda (x)
(member x '(&optional &rest &key)))
lambda-list))
(defmacro spicy-lambda ((&rest args) &body body)
(assert (simple-lambda-list-p args) (args))
(reduce (lambda (arg form)
`(lambda (,arg) ,form))
args :from-end t :initial-value `(progn ,@body)))
(defmacro defspicy (name (&rest args) &body body)
(if (<= (length args) 1)
`(defun ,name ,args ,@body)
`(defun ,name (,(first args))
(spicy-lambda ,(rest args) ,@body))))
)
(defspicy compose (f g x)
(funcall f (funcall g x)))
(defspicy const (x y) x)
(defspicy plus (x y) (+ x y))
;; yoba dx = (dx +) . length
(defspicy yoba (dx)
(funcall (compose (plus dx)) 'length))
(map 'nil (funcall (compose 'print) (yoba 123))
'(() (1) (3 2 3)))
KGV2YWwtd2hlbiAoOmxvYWQtdG9wbGV2ZWwgOmNvbXBpbGUtdG9wbGV2ZWwgOmV4ZWN1dGUpCihkZWZ1biBzaW1wbGUtbGFtYmRhLWxpc3QtcCAobGFtYmRhLWxpc3QpCiAgKG5vdGFueSAobGFtYmRhICh4KQogICAgICAgICAgICAobWVtYmVyIHggJygmb3B0aW9uYWwgJnJlc3QgJmtleSkpKQogICAgICAgICAgbGFtYmRhLWxpc3QpKQoKKGRlZm1hY3JvIHNwaWN5LWxhbWJkYSAoKCZyZXN0IGFyZ3MpICZib2R5IGJvZHkpCiAgKGFzc2VydCAoc2ltcGxlLWxhbWJkYS1saXN0LXAgYXJncykgKGFyZ3MpKQogIChyZWR1Y2UgKGxhbWJkYSAoYXJnIGZvcm0pCiAgICAgICAgICAgIGAobGFtYmRhICgsYXJnKSAsZm9ybSkpCiAgICAgICAgICBhcmdzIDpmcm9tLWVuZCB0IDppbml0aWFsLXZhbHVlIGAocHJvZ24gLEBib2R5KSkpCgooZGVmbWFjcm8gZGVmc3BpY3kgKG5hbWUgKCZyZXN0IGFyZ3MpICZib2R5IGJvZHkpCiAgKGlmICg8PSAobGVuZ3RoIGFyZ3MpIDEpCiAgICAgIGAoZGVmdW4gLG5hbWUgLGFyZ3MgLEBib2R5KQogICAgICBgKGRlZnVuICxuYW1lICgsKGZpcnN0IGFyZ3MpKQogICAgICAgICAoc3BpY3ktbGFtYmRhICwocmVzdCBhcmdzKSAsQGJvZHkpKSkpCikKCgooZGVmc3BpY3kgY29tcG9zZSAoZiBnIHgpCiAgKGZ1bmNhbGwgZiAoZnVuY2FsbCBnIHgpKSkKCihkZWZzcGljeSBjb25zdCAoeCB5KSB4KQoKKGRlZnNwaWN5IHBsdXMgKHggeSkgKCsgeCB5KSkKCjs7IHlvYmEgZHggPSAoZHggKykgLiBsZW5ndGgKKGRlZnNwaWN5IHlvYmEgKGR4KQogIChmdW5jYWxsIChjb21wb3NlIChwbHVzIGR4KSkgJ2xlbmd0aCkpCgoobWFwICduaWwgKGZ1bmNhbGwgKGNvbXBvc2UgJ3ByaW50KSAoeW9iYSAxMjMpKQogICAgICcoKCkgKDEpICgzIDIgMykpKQ==