newLISP Fan Club

Forum => newLISP in the real world => Topic started by: jopython on December 18, 2011, 06:52:05 AM

Title: Function composition?
Post by: jopython on December 18, 2011, 06:52:05 AM
Is there a builtin compose function in newlisp?
Title: Re: Function composition?
Post by: Lutz on December 19, 2011, 10:09:37 AM
No compose function, but for sure other means to achieve similar. This link talks about function factories and the first-class nature of lambda expressions in newLISP:



http://www.newlisp.org/index.cgi?Closures



General info about differences to Common Lisp and Scheme:



http://www.newlisp.org/index.cgi?page=Differences_to_Other_LISPs



Also, 'apply' has a reduce option:



http://www.newlisp.org/downloads/newlisp_manual.html#apply



There is also a 'curry':



http://www.newlisp.org/downloads/newlisp_manual.html#curry
Title: Re: Function composition?
Post by: Kazimir Majorinc on December 20, 2011, 01:23:22 PM
I wrote the post "Composition of functions and macros (//http)" on my blog.



((composition 'f1 ... 'fn) _ _ _) = (f1 (f2 ... (fn _ _ _)))



If there was no significant change from February 2010, you should be able to cut and paste whole post in your editor and it should work.
Title: Re: Function composition?
Post by: jopython on December 21, 2011, 01:21:30 PM
Thank you , Kazimir.
Title: Re: Function composition?
Post by: William James on March 05, 2012, 10:52:03 PM
These seem to work.

;; Compose two functions.  Both accept only 1 argument.
(define (atop f g)
  (expand (lambda (a) (f (g a))) 'f 'g))

;; Compose two functions.  The first to be called accepts
;; any number of arguments.
(define (atop* f g)
  (expand
    (lambda () (f (apply g (args))))
    'f 'g))

Thanks to Kazimir Majorinc for the idea of using expand.