Page 1 of 1
Return function with variable data?
Posted: Sat Mar 10, 2007 5:30 pm
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:
Jeremy
Posted: Sat Mar 10, 2007 7:01 pm
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
Posted: Sat Mar 10, 2007 8:00 pm
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