Land of Lisp recursion understanding problem

Discussion of Common Lisp
Post Reply
lrj
Posts: 3
Joined: Fri Nov 19, 2010 7:31 pm

Land of Lisp recursion understanding problem

Post by lrj » Fri Nov 19, 2010 7:53 pm

Hi Im new to LISP and am using CLISP on win 7.And trying to kearn from "The Land of Lisp"
What Im having a problem with is this
(labels ( (a (n)
(+ n 5))
(b (n)
( + (a n) 6)))
(b 10))
giving the answer 21.

Is "a" in this case a function that just adds 5 .
when passing 10 into function does it go into the n of (a n) and then gets 6 added to it. and why is (a n) brakected.
I think im almost getting it but would appreciate it very muchly if some could briefly annotate the lines above or give me some other clues
Very much appreciated
from sunny Tasmania

ramarren
Posts: 613
Joined: Sun Jun 29, 2008 4:02 am
Location: Warsaw, Poland
Contact:

Re: Land of Lisp recursion understanding problem

Post by ramarren » Sat Nov 20, 2010 2:00 am

Recursion is when a function is defined directly or indirectly in terms of itself. In the given example no such thing occurs. Use code tags to maintain formatting. Using standard Common Lisp (note that "Lisp" is usually spelled "Lisp", with non-capital letters) formatting the code sample appears as:

Code: Select all

(labels ((a (n)
           (+ n 5))
         (b (n)
           (+ (a n) 6)))
  (b 10))
LABELS is a special operator, which was probably explained in the book somewhere around the example. It defines local functions which are visible to themselves and each other (in which it is different than FLET). This particular example defines two such functions, and b is defined in terms of a. The parameter n is independent between those two functions, just as it would be between two global functions.

Paul Donnelly
Posts: 148
Joined: Wed Jul 30, 2008 11:26 pm

Re: Land of Lisp recursion understanding problem

Post by Paul Donnelly » Sat Nov 20, 2010 2:54 pm

Does it make more sense to you written like this?

Code: Select all

(defun a (n)
  (+ n 5))

(defun b (n)
  (+ (a n) 6))

(b 10)
You've probably learned about LET*. LABELS is much like LET* for functions.

lrj
Posts: 3
Joined: Fri Nov 19, 2010 7:31 pm

Re: Land of Lisp recursion understanding problem

Post by lrj » Sat Nov 20, 2010 6:44 pm

Thanks Paul and Ramareen,
I am just about to turn 59 and decided to try and reacticate a few neurons. I have in the past programmed in Basic VB Pascal C C++ Cobol and PHP. Of course I had of lisp a long time ago but never thougfht one way or another about it. Only recently while do some work on E-Health and Expert systems did it come up again. I thought cool; so here I am for the past week stuck on this piece of code which I think should be basic. What am I missing apart from a few neurons.
I can substitute (b 10) for ( b any-number) and get the right answer. I just cant see where it is happening. What and where each step occurrs?
can you explain it somehow like this i realize this is not neat nor correct
b= a + n + 6
a= n+5

and is (+ (a n) 6) the same as = a+n +6.
Much appreciated

findinglisp
Posts: 447
Joined: Sat Jun 28, 2008 7:49 am
Location: Austin, TX
Contact:

Re: Land of Lisp recursion understanding problem

Post by findinglisp » Sat Nov 20, 2010 6:57 pm

lrj wrote:Thanks Paul and Ramareen,
I am just about to turn 59 and decided to try and reacticate a few neurons. I have in the past programmed in Basic VB Pascal C C++ Cobol and PHP. Of course I had of lisp a long time ago but never thougfht one way or another about it. Only recently while do some work on E-Health and Expert systems did it come up again. I thought cool; so here I am for the past week stuck on this piece of code which I think should be basic. What am I missing apart from a few neurons.
I can substitute (b 10) for ( b any-number) and get the right answer. I just cant see where it is happening. What and where each step occurrs?
can you explain it somehow like this i realize this is not neat nor correct
b= a + n + 6
a= n+5

and is (+ (a n) 6) the same as = a+n +6.
Much appreciated
(a n) is a function call to the function a with the value of n in function b as an argument to function a. This is a bit confusing because n is used as the parameter name for each of the two functions, but it's important to realize that n is local to each function.

So, in English, if you evaluate function b, it will return the result of evaluating function a with the same parameter value you pass b, plus 6. In math, if you expanded the value of function a into function b, then function b will return n + 5 + 6.

So let's follow Ramarren's example. When he calls (b 10), that invokes function b and binds the local value of n in b to 10. When function b executes, it starts to call the + function, but realizes that it needs to first evaluate a function call to a. The parameter to a is n, which has been bound to 10, so this is essentially the same as (a 10). Now we evaluate function a, again with the local variable named n in function a (which is different than the local variable named n in b) bound to 10. When b runs, it evaluates (+ n 5) which is the same as (+ 10 5), which returns 15. Now we're back in b with the result of function a. We continue to evaluate the + form, which is equivalent to (+ 15 6), which results in 21 being the value of (b 10).
Cheers, Dave
Slowly but surely the world is finding Lisp. http://www.findinglisp.com/blog/

findinglisp
Posts: 447
Joined: Sat Jun 28, 2008 7:49 am
Location: Austin, TX
Contact:

Re: Land of Lisp recursion understanding problem

Post by findinglisp » Sat Nov 20, 2010 7:05 pm

I should have also said that Lisp is very different than other infix languages. It doesn't use parenthesis to group terms in arithmetic equations. Rather, it uses them to indicate lists and functions (because code = data in Lisp).

So, whereas in C you might write:

Code: Select all

int f(int a, int b)
{
    return g(42 + (a * b));
}
in Lisp you'd write:

Code: Select all

(defun f (a b)
    (g (+ 42 (* a b))))
Cheers, Dave
Slowly but surely the world is finding Lisp. http://www.findinglisp.com/blog/

lrj
Posts: 3
Joined: Fri Nov 19, 2010 7:31 pm

Re: Land of Lisp recursion understanding problem

Post by lrj » Sat Nov 20, 2010 8:45 pm

OK Dave I think Im almost there . I passed 10 to a and returned 15 and its all making sense. At the moment Im using GNU CLISP 2.49 on win7 system, is there anywhere i can get list of keystrokes ie how can you delete or would you recommend another a program
Many thanks to all

findinglisp
Posts: 447
Joined: Sat Jun 28, 2008 7:49 am
Location: Austin, TX
Contact:

Re: Land of Lisp recursion understanding problem

Post by findinglisp » Mon Nov 29, 2010 9:02 pm

lrj wrote:OK Dave I think Im almost there . I passed 10 to a and returned 15 and its all making sense. At the moment Im using GNU CLISP 2.49 on win7 system, is there anywhere i can get list of keystrokes ie how can you delete or would you recommend another a program
Many thanks to all
If you're typing this directly into the REPL, you can always whip out an editor of some sort (e.g. notepad on Win 7), edit your code there, and then cut/paste into the REPL. That sometimes makes it easy. If you're really wanting to go hardcore, then you can setup Emacs and run Lisp as a subprocess. That will allow you to evaluate Lisp forms (whole sexprs) with one keystroke. That's what most committed Lispers do, but some well-known people (notably Paul Graham) have gone the cut/paste route. Some of the Lisps also include some basic command-line editing (Clisp includes Gnu Readline, for instance, at least on Linux).
Cheers, Dave
Slowly but surely the world is finding Lisp. http://www.findinglisp.com/blog/

Post Reply