libera/#lisp - IRC Chatlog
Search
20:00:10
theseb
This leads to my main question.....(setf f ...) <---- Suppose you used f in the body of f (recursion!).....That won't work because when you evaluate the body of the function, f won't be defined!
20:00:41
theseb
In other words, you *cannot* do recursion if you define functions this way...(setf f (lambda ...) )
20:01:13
theseb
(This is coming up because I'm implementing a lisp in C and this observation caused a car wreck ;)
20:04:19
ieure
This isn't a Lisp specific thing. You resolve f in the body of the lambda when it's evaluated, not when it's defined.
20:06:25
theseb
ieure: i don't know the jargon really well...but I think when you evaluate functions, you *must* use the env at the time of the definition....i think it is called "lexical scoping" or "closure"
20:07:08
theseb
ieure: I appreciate your "late binding" suggestion...but i'm guessing it would require me *not* using the *proper* binding format of lisp?
20:07:29
pjb
theseb: (setf f (lambda (f x) (if (zerop x) 1 (* x (funcall f f (- x 1)))))) (funcall f f 10) #| --> 3628800 |#
20:09:22
pjb
theseb: have a look at Lisp in Small Pieces http://pagesperso-systeme.lip6.fr/Christian.Queinnec/WWW/LiSP.html http://pagesperso-systeme.lip6.fr/Christian.Queinnec/Books/LiSP-2ndEdition-2006Dec11.tgz
20:10:24
theseb
ieure: my understanding is every function definition carries around a special environment used for invocations?
20:10:27
pjb
then try https://www.amazon.fr/Lisp-Small-Pieces-Christian-Queinnec/dp/0521545668/ref=sr_1_1?crid=3O4BSKU6PUSC3&keywords=Lisp+in+Small+Pieces&qid=1664223011&qu=eyJxc2MiOiIwLjgxIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=lisp+in+small+pieces%2Caps%2C44&sr=8-1
20:11:32
theseb
pjb: yes but that is "cheating" because you are passing f as an argument of f?...possible to make it work w/o putting f in the param list?
20:14:27
pjb
Yes. Or it can be integrated for all the bindings. Depends on your language, you didn't specify.
20:21:15
theseb
pjb: i think this is easiest way to fix (setf f (lambda ...))....when you create the closure for (lambda ...) you need to remember to add f to that closure yes?
20:21:28
theseb
pjb: does closure mean "a function definition with that special env you use in invocations" ?
20:22:43
ieure
theseb, You should spend some time researching PLT if you're going to be implementing a language. https://en.wikipedia.org/wiki/Closure_(computer_programming)
20:23:33
pjb
theseb: in CL, functions are looked up in the global environment too. If they're not lexical local functions (in the closure), then they're looked up as (fdefinition symbol-naming-the-function)