Return function with variable data?

Q&A's, tips, howto's
Locked
jeremyc
Posts: 33
Joined: Wed Dec 06, 2006 3:33 am

Return function with variable data?

Post by jeremyc »

Is something like this possible?

Code: Select all

(define (create-greeter greeting)
  (lambda (n)
    (println greeting " " n "!")))
(set 'hello-greeter (create-greeter "Hello"))
(set 'goodbye-greeter (create-greeter "Goodbye"))
(hello-greeter "World")
(goodbye-greeter "World")
The obvious desired output is:

Code: Select all

Hello World
Goodbye World
Jeremy

m i c h a e l
Posts: 394
Joined: Wed Apr 26, 2006 3:37 am
Location: Oregon, USA
Contact:

Post by m i c h a e l »

Hi Jeremy,

Something like this, maybe:

Code: Select all

newLISP v.9.1.0 on OSX UTF-8, execute 'newlisp -h' for more info.

> (define (greeter greeting to) (println greeting " " to "!"))
(lambda (greeting to) (println greeting " " to "!"))
> (set 'hello (curry greeter "Hello"))
(lambda (_x) (greeter "Hello" _x))
> (set 'goodbye (curry greeter "Goodbye"))
(lambda (_x) (greeter "Goodbye" _x))
> (hello "World")
Hello World!
"!"
> (goodbye "Cruel World")
Goodbye Cruel World!
"!"
> _
m i c h a e l

Lutz
Posts: 5289
Joined: Thu Sep 26, 2002 4:45 pm
Location: Pasadena, California
Contact:

Post by Lutz »

'curry' is the shortest and preferred way to do it when you have 2 arguments as in Jeremyc's example. The following is a more general solution in case there are more parameters or it is not the 1st one which gets curried.

This uses expand to get the curried variable into the lambda expression:

Code: Select all

(define (create-greeter greeting)
    (expand (fn (n) (println greeting " " n "!")) 'greeting))

> (create-greeter "Hello")
(lambda (n) (println "Hello" " " n "!"))

> (define hello-greeter (create-greeter "Hello"))
(lambda (n) (println "Hello" " " n "!"))

> (hello-greater "World")
Hello World!
instead of (define hello-greeter ...) you also could say (set 'hello-greeter ..) as in your code. Both does the same in newLISP, but 'define' is just a little bit more descriptive in this case.

Lutz

Locked