Q&A's, tips, howto's
jeremyc
Posts: 33 Joined: Wed Dec 06, 2006 3:33 am
Post
by jeremyc » Sat Mar 10, 2007 5:30 pm
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
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 » Sat Mar 10, 2007 7:01 pm
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 » Sat Mar 10, 2007 8:00 pm
'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